用docker部署应用

镜像

  • 虚拟机的一组静态磁盘文件
  • 可以任意下载、复制、分发
  • hub.docker.com
  • 镜像名称,由两部分组成
  • Repository:Tag
  • 名称:标签
  • 如果不写标签,默认标签是latest
  • 镜像的常用命令
# 下载镜像
docker pull 镜像名称

# 镜像列表
docker images

# 为镜像添加新的名称
docker tag redis my-redis:v1
docker tag redis redis-tedu:v2

# 删除镜像的名称
# 删除最后一个名称时,会把镜像磁盘文件一起删除
# remove image
docker rmi my-redis:v1
docker images

# 导出镜像到压缩文件
docker save rabbitmq:management benwang6/cerebro:0.9.4 | gzip > a.gz

# 从压缩文件导入,加载镜像
# 先删除
docker rmi rabbitmq:management benwang6/cerebro:0.9.4
# 再导入
docker load -i a.gz

常用容器命令:

# 启动容器
docker run mariadb

# 在前台启动,占用命令行
docker run redis

# 查看容器
docker ps        # 运行状态的容器
docker ps -a       # all

# 查看镜像中设置的默认启动命令
docker history redis

docker history mariadb

docker history rabbitmq:management

# 覆盖 CMD 设置的默认命令
docker run redis pwd

docker run redis ls -a -l

# -i 交互 -t 终端
docker run -it redis bash

exit

docker ps -a

镜像中设置默认启动命令:

- CMD

  ```shell
  CMD ["redis-server"]
  
  # "java -jar /opt/cs/cs.jar"
  CMD ["java", "-jar", "/opt/cs/cs.jar"]
  • ENTRYPOINT
# "java -jar /opt/cs/cs.jar"
ENTRYPOINT ["java"]
CMD ["-jar", "/opt/cs/cs.jar"]
# 覆盖ENTRYPOINT
docker run --entrypoint ls redis -a -l

-d 后台运行

docker run -d \
redis

docker ps

docker logs 容器ID前3位

进入容器,执行容器中的命令

docker exec -it cbc pwd

docker exec -it cbc touch a.txt

docker exec -it cbc ls -a -l

docker exec -it cbc bash

exit

docker ps

容器命名

docker run -d --name r1 \
redis

docker run -d --name r2 \
redis

docker ps

docker logs r1

docker stop r1 r2

docker start r1 r2

–restart=always 让容器可以随系统自动重启

服务器重启,或docker系统服务重启,容器默认是退出状态

docker run -d --name r3 \
--restart=always \
redis

docker ps

# 重启docker系统服务
systemctl restart docker

docker ps

–rm 容器关闭时,会被系统自动删除

启动临时容器

  • 查看容器中的一些默认设置
  • 从容器复制文件到宿主机
# redis容器启动后,容器内有哪些环境变量
docker run --rm redis env

docker cp 在容器和宿主机之间互相复制文件

# 从容器复制文件到宿主机
docker cp r3:/data/dump.rdb ~/

ls

# 从宿主机复制文件到容器
docker cp ~/ip-static r3:/data/ip

# 进入容器查看文件
docker exec -it r3 ls /data/

数据挂载:文件、文件夹、数据卷

# 启动mariadb数据库,挂载宿主机的一个文件夹存放数据文件
# -v挂载会自动创建宿主机目录
docker run -d --name mysql \
-v /opt/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
mariadb



# 挂载文件
docker run -d --name r4 \
-v /root/redis.conf:/my.conf \
redis \
redis-server /my.conf


docker rm r1 r2 r3
docker rm -f r1 r2 r3

# 清理所有停止的容器
docker container prune
docker container prune -f

# 删除所有容器
# docker ps -aq 列出所有容器的id
docker rm -f $(docker ps -aq)


# 挂载文件夹
# 组主机的文件夹会自动创建
docker run -d --name r1 \
-v /opt/my-app/:/opt/app \
redis

# 访问容器内的路径,创建文件,实际是创建到宿主机挂载的目录下
docker exec -it r1 touch /opt/app/a.txt

# 查看宿主机文件
ls /opt/my-app/

数据卷挂载

#  清理容器
docker rm -f $(docker ps -aq)

# 新建数据卷
docker volume create my-vol
# 查看数据卷列表
docker volume ls
# 查看数据卷详情
docker inspect my-vol

# 启动数据库容器,挂载my-vol数据卷
docker run -d --name mysql \
-v my-vol:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
mariadb

# 查看容器的挂载详情
docker inspect mysql



# 启动新的容器,my-vol挂载到容器
docker run -d --name r1 \
-v my-vol:/opt/app/ \
redis

docker exec -it r1 touch /opt/app/a.txt

# ls 数据卷的真实路径
ls /var/lib/docker/volumes/my-vol/_data