docker-compose为docker三剑客之一,docker三剑客分别为:docker-machine、docker-compose、docker-swarm。
- docker-machine: 解决docker的运行环境问题。平时docker在linux运行较为方便,当docker运行在windows或者mac系统上时,docker-machine就会派上用场
- docker-compose:解决本地docker容器编排问题。其实早期版本的docker-compose并不具有编排能力,更像是批量启动和销毁容器的工具,后续v3版本增加了原本docker-swarm中才具有的一些功能,才勉强具备了编排的能力,后续会详细介绍
- docker-swarm:解决多主机多个容器的调度部署问题,但整体地位比较尴尬,因为k8s在集群中对容器的编排显然比docker-swarm要好的多,虽说swarm模式开启比较方便,且与docker-compose的部分参数有重合,但还是更加推荐直接上手k8s
docker-compose采用python编写,底层直接调用docker的api接口来与docker daemon进行交互,安装简单,直接从官网直接下载二进制文件,并且设置相关权限可立即使用。install docker-compose
以minio为例来演示docker-compose如何使用,该例子包含.env、common.env、minio.yaml三个文件。
- .env文件:minio本身需要用到的环境变量,该文件名字本身不能改变,且需要与用于容器启动的yaml文件存放在同一目录下,在yaml文件中通过${}获取,eg:${minio_image}获取文件中设置的minio 镜像值
minio_image=minio:v1MINIO_ACCESS_KEY=minioMINIO_SECRET_KEY=minio - common.env文件:minio与项目中其余容器共同使用的环境变量。该文件名字可自定义,不要求必须与yaml文件处于同一目录下,只需在对env_file设置时写入正确的文件路径即可
host_name=Linuxip=192.168.1.10 minio.yaml文件:minio容器描述文件。该文件中涉及到的适用于swarm模式的参数只作为展示说明,真正启动时并不生效
version: "3.8"services:minio: # services名,同一个yaml文件可配置多个servicesrestart: always #重启策略image: ${minio_image} # 从.env文件获取环境变量# build: . # 启动时从指定的路径先编译镜像command: server /datacontainer_name: minio # 指定容器名字,若不指定depends_on: # 容器依赖,且会在依赖的容器启动后再启动该容器,但并不是说等待依赖的容器ready后再启动- busyboxports: # 容器与主机端口映射 主机端口:容器端口- "9000:9000"environment:MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY} # 从.env文件获取环境变量MINIO_SECRET_KEY: ${MINIO_SECRET_KEY} # 从.env文件获取环境变量host_name: Linux_testenv: env_setenv_file:- common.env # 将common.env文件的内容加载为环境变量volumes:- "/minio/data:/data" # 数据卷映射healthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] # 健康检测指令interval: 30s # 容器运行到执行健康检测的等待时间timeout: 20s # 超时时间retries: 3 # 重试次数deploy:resources:limits: # 容器的资源限制cpus: '2'memory: 4Greservations: # 容器启动时请求的资源,该参数在swarm模式下才生效,此处配置仅作为说明cpus: '0.5'memory: 200Mnetworks: # 容器启动时指定的网络,同一网络下的容器可相互通信default:external:name: iotware
compose文件可大致分为version、services、network三部分
version:compose文件的版本号,常见的有1、1.x,2, 2.x,3.x。不同版本的compose文件语法不同,功能也有差异,一般版本号越大功能越丰富,更多版本号差异的内容可访问docker-compose version
- services:对容器进行描述,单个yaml文件中可以有多个services,但每个services中只能有一个容器
- build: 该参数配置时表示启动时会先从指定路径构建镜像,与image参数只能设置一个
- restart:容器重启策略。
- no:禁止自动重启容器,默认值;
- always:无论如何都会重启容器;
- on-failure:出现on-failure报错时重启容器
- container_name:容器名设置
- command:覆盖Dockerfile中的CMD参数
- environment:设置环境变量,相比env_file,该参数优先级更高

- healthcheck:类似于k8s中的就绪探针,当探针检测通过时才认为容器状态为ready
- deploy:deploy中只有部分参数适用于docker-compose模式,其余则必须在swarm模式下才能生效。例如文件中给出的reservations参数在启动时会被自动忽略

- network:指定容器使用的网络,同一网络下的容器可通过容器名互相通信。指定的网络需在容器启动前提前创建
docker network minio create
补充:
docker-compose中还有project(项目)的概念,项目名默认为docker-compose.yaml所在的目录名,也可在容器启动时通过-p进行指定。
project的作用可在(但不仅仅在)未设置容器名或为指定network时体现出来
- 未设置containername时会默认以**project名_services名序号**的形式对容器进行命名

- 未设置network时会默认以project名_default的形式创建默认的network

常用参数:
- -f : 指定compose文件,若不指定默认寻找docker-compose.yaml文件
- -p: 指定项目名,不知道则默认以当前目录名作为项目名
- up -d : 后台启动compose文件中描述的所有容器
- down:停止compose文件中描述的所有容器
- ps -a:列出通过docker-compose启动的所有容器的状态
