docker-compose之配置docker-compose.yml
当前有三种版本的Compose配置文件格式:
- Version 1
旧版格式,通过省略YAML的根配置项version来指定。
未声明版本的Compose配置文件都被视为V1版,所有的服务都作为根选项在Compose配置文件中声明。
支持V1的Compose最高到1.6.x,再高版本的Compose不推荐使用V1版Compose配置文件。
不支持数据卷、网络和构建参数配置。
V1的Compose不会利用网络优势,每个容器都位于默认的bridge网络上,并且可以从其他容器的IP地址访问,需要使用links来启用容器之间的发现。
- Version 2.x
通过YAML的根配置项version来指定,具体配置如version: '2'或version: '2.1'等。
必须在Compose配置文件根选项指定版本号,并且主版本数字为2,且所有服务必须在services配置项下声明。
1.6.0+版本的Compose都支持V2,Docker Engine的版本需要1.10.0+版本。
支持数据卷和网络的配置。
默认情况下,每个容器都加入了应用范围的默认网络,并且可以在与服务名称相同的主机名下发现。很大程度上links不是必要的。
V2中加入了环境变量替换。
- Version 3.x
最新版本,也是推荐使用版本,推出该版的目的是为了在Compose和Docker Engine的swarm模式之间形成交叉兼容。
通过YAML的根配置项version来指定,具体配置如version: '3'或version: '3.1'等。
V3删除了多个配置项,但也新增了更多配置项。
关于Compose配置文件版本的常见注意事项:
在声明V2和V3版本时需注意:
在指定Compose配置文件要使用的版本时,需同时指定主版本数字和次版本数字。如果未给定次版本数字,则默认使用0而不是最新版本,因此将不支持再更高版本中才加入的新功能。比如version: '3',使用的是3.0版本而不是目前最新的3.8版本。
在使用多Compose配置文件时需注意:
使用多个Compose配置文件扩展服务时,每个文件必须为相同的版本。
Compose配置文件格式版本 Docker Engine 版本
3.8 19.03.0+ 3.7 18.06.0+ 3.6 18.02.0+ 3.5 17.12.0+ 3.4 17.09.0+ 3.3 17.06.0+ 3.2 17.04.0+ 3.1 1.13.1+ 3.0 1.13.0+ 2.4 17.12.0+ 2.3 17.06.0+ 2.2 1.13.0+ 2.1 1.12.0+ 2.0 1.10.0+ 1.0 1.9.1.+
示例:
version: "3.8" services: redis: image: redis:alpine ports: - "6379" networks: - frontend deploy: replicas: 2 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure db: image: postgres:9.4 volumes: - db-data:/var/lib/postgresql/data networks: - backend deploy: placement: constraints: - "node.role==manager" vote: image: dockersamples/examplevotingapp_vote:before ports: - "5000:80" networks: - frontend depends_on: - redis deploy: replicas: 2 update_config: parallelism: 2 restart_policy: condition: on-failure result: image: dockersamples/examplevotingapp_result:before ports: - "5001:80" networks: - backend depends_on: - db deploy: replicas: 1 update_config: parallelism: 2 delay: 10s restart_policy: condition: on-failure worker: image: dockersamples/examplevotingapp_worker networks: - frontend - backend deploy: mode: replicated replicas: 1 labels: [APP=VOTING] restart_policy: condition: on-failure delay: 10s max_attempts: 3 window: 120s placement: constraints: - "node.role==manager" visualizer: image: dockersamples/visualizer:stable ports: - "8080:8080" stop_grace_period: 1m30s volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: placement: constraints: - "node.role==manager" networks: frontend: backend: volumes: db-data:
docker-compose.yml
version: '3' services: proxy: image: nginx ports: - "80:80" networks: - frantnet webapp: build: . networks: - frantnet - endnet redis: image: redis networks: - endnet networks: frantnet: endnet:
参数说明:
- version: 声明语法版本
- services: 指定服务
- image: 指定使用的镜像
- build: 使用编译Dockerfile的方式得到的镜像
- networks: 使用, 创建网络
- volumes: 数据卷, 处理容器中数据的持久化方式, 如果在多个容器见共享数据卷,则必须在顶级的volumes中定义这个数据卷
version: "3.2" services: web: image: nginx:alpine volumes: - type: volume # 随机找一个临时目录 source: mydata target: /data - type: bind # 绑定相对目录,绝对目录 source: ./nginx/logs target: /var/log/nginx jenkins: image: jenkins/jenkins:lts volumes: - jenkins_home:/var/jenkins_home - mydata:/data volumes: mydata: jenkins_home:
volumes两种方式:
1)绝对路径
db:
image: mariadb:latest
restart: always
ports:
- "3306:3306"
volumes:
- [直接使用宿主机的本地路径]:/var/lib/mysql
2)卷标
db:
image: mariadb:latest
restart: always
ports:
- "3306:3306"
volumes:
- [卷标名称]:/var/lib/mysql
volumes:
[卷标名称]:
使用卷标的方式,简洁易于管理,但是数据实际存放的位置需要费点周折才能看到。
查看某个卷信息: docker volume inspect volume_name
查看所有卷: docker volume ls
---
docker run -v /docker_dir ...
docker run -v /home:/docker_dir ...
当不指明宿主机目录时,Docker会默认在宿主机上创建一个临时目录: /var/lib/docker/volumes/[VOLUME_ID]/_data作为宿主机上的被挂载目录。
- environment: 定义环境变量
- ports: 定义端口映射
- container_name: 指定容器名称
- restart:
-
no
是默认的重启策略,在任何情况下都不会重启容器。 always
指定时,容器总是重新启动。on-failure
如果退出代码指示失败错误,则该策略会重新启动容器。unless-stopped
总是重新启动容器,除非容器停止(手动或其他方式)。
-
常用命令:
docker-compose -f docker-compose-dev.yml config -f: 指定配置文件 -p: 指定项目名称
config:不会执行真正的操作,而是显示docker-compose程序解析的配置文件内容
示例:
docker-compose -p testnet -f docker-compose-net.yml up -d
常用服务:
elasticsearch:
version: "3.9" services: elasticsearch: image: docker.elastic.co/elasticsearch/elasticsearch:6.8.23 container_name: elasticsearch environment: - discovery.type=single-node volumes: - ./es/data:/usr/share/elasticsearch/data # docker cp elasticsearch:/usr/share/elasticsearch/config/ ./es/ - ./es/config:/usr/share/elasticsearch/config ports: - 9200:9200 - 9300:9300 networks: - elastic networks: elastic:
更多参考项: Docker Compose 配置文件 docker-compose.yml 详解 - 云+社区 - 腾讯云 (tencent.com)