Docker compose配置及常用命令
Docker compose配置及常用命令
Author: huyikai
简介
我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build 打包成镜像、使用 docker run 运行 容器等命令。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启动和停止,那么效率之低,维护量之大可想而知。
Docker Compose 是一个用来定义和运行复杂应用的 Docker 开源项目,负责实现对 Docker 容器集群的快速编排,它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式) 来定义一组相关联的应用容器为一个项目,在配置文件中,所有的容器通过 services 来定义,然后使用 docker-compose 脚本来启动、停止和重启应用,非常适合组合使用多个容器进行开发的场景。
模板命令讲解
官方文档
version
:指定docker-compose.yml
文件的版本
services
:多个应用容器的集合,一个服务就代表一个应用容器
build
:指定构建镜像时,Dockerfile
所在目录的路径 (可以是绝对路径,也可以是相对 docker-compose.yml
文件的路径)。docker-compose
指令将会利用它自动构建这个镜像,然后使用这个镜像
image
:指定服务所使用的镜像,如果镜像在本地不存在,docker-compose
指令将会尝试去拉取这个镜像。与build
指令二选一
container_name
:指定容器名称。如果不指定默认将会使用 项目名称_服务名称_序号
这样的格式
ports
:指定容器暴露的端口信息,使用 宿主端口:容器端口 (HOST:CONTAINER
) 格式,或者仅仅指定容器的端口 (宿主将会随机选择端口)都可以
volumes
:数据卷所挂载路径设置。可以设置为 宿主机绝对路径:容器内目录的绝对路径 或者 数据卷名称:容器内目录的绝对路径,并且还可以设置访问模式 (默认为rw
读写模式,ro
表示只读)
environment
:设置环境变量,可以使用数组或字典两种格式
env_file
:从以.env
结尾的文件中获取环境变量,可以为单独的文件路径或列表
networks
:配置容器连接的网络
depends_on:解决容器的依赖、启动先后的问题 (一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,必然会因为容器依赖问题而启动失败)
下面示例就会先启动 redis 和 mysql 这两个服务,最后才启动 webapp 服务 (提示:webapp 服务不会等待 redis 和 mysql 服务完全启动 之后才启动,而是会先启动依赖服务,再去启动 webapp 服务,但是依赖服务最终会在 webapp 服务完全启动之前 完全启动)
command
:覆盖容器启动后默认执行的命令,即:覆盖 DockerFile 中的CMD
或第三方镜像的启动命令
healthcheck
:通过命令检查容器是否健康运行
labels
:为容器添加元数据 (metadata)信息,例如:可以为容器添加辅助说明信息,支持数组或字典格式
restart
:指定容器退出后的重启策略,在生产环境中推荐配置为 always
或者 unless-stopped
no:
在任何情况下都不会重启容器
always:
容器总是会重新启动
on-failure:
如果退出代码指示失败错误,则该策略会重新启动容器
unless-stopped:
总是重新启动容器,除非容器停止
案例:编写一个综合的docker-compose.yaml
,设置mysql
服务依赖于nginx
服务,并同处于名叫common_network
的网络下
指令讲解
- 在执行
docker-compose
指令时,如果不指定配置文件,就需要在执行指令的目录下必须要有docker-compose.yml
配置文件且文件名必须叫docker-compose.yml
- 如果执行
docker-compose
指令的目录下没有docker-compose.yml
配置文件 或者 配置文件名不叫docker-compose.yml
,需要在docker-compose
后面添加-f 配置文件路径
去指定配置文件,例如:docker-compose -f /root/myfile.yml up
- 如果通过
docker-compose -f file
的方式来指定docker-compose.yml
配置文件,那么配置文件中那些使用相对路径的命令则会基于-f file
中 file 的路径来进行对照
1、运行服务命令
2、停止并移除服务命令
3、列出项目中所有正在运行的服务
4、删除服务
5、进入指定的服务内部
6、启动、停止和重启服务
7、查看服务内运行的进程
8、查看服务的日志