Compose和Docker版本兼容性对应关系如下:
docker compose的顶级配置项有:
- version 定义了版本信息
- services 定义了服务的配置信息
services 的定义包含应用于为该服务启动的每个容器的配置,非常类似于将命令行的 docker container create - networks 定义了网络信息,提供给 services 中的 具体容器使用
networks 的定义类似于命令行的 docker network create - volumes 定义了卷信息,提供给 services 中的 具体容器使用
volumes 的定义类似于命令行的 docker volume create
services 常用相关配置
- container_name
指定容器名称。默认将会使用项目名称服务名称序号
container_name: nginx-front
#指定容器名称后,该服务将不允许进行扩展(scale),因为Docker不允许多个容器具有相同的名称。
- labels
定义容器的元数据(metadata)信息。例如可以为容器添加辅助说明信息
labels:
com.startupteam.description: "webapp for a startup team"
com.startupteam.department: "test department"
com.startupteam.release: "rc3 for v1.0"
3.构建过程中应用到的相关配置项
每个服务都必须通过 image 来指定镜像或 build 指令(需要 Dockerfile文件)等来自动构建生成镜像
如果使用 build 指令,那么在 Dockerfile 中设置的选项(例如:CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 docker-compose.yml 中再次设置
image用法
指定镜像名称或镜像 ID。如果该镜像在本地不存在,Compose 将会拉取这个镜像
image: nginx:latest
image: 5673fdg8f9
build用法
类似于命令行的 docker build .
指定 Dockerfile 所在文件夹的路径(可以是绝对路径,或者相对 docker-compose.yml 文件的路径)。 compose 将会利用它自动构建这个镜像,然后使用这个镜像
version: '3'
services:
nginx-front:
build: ./test
也可以使用 context 指令指定 Dockerfile 所在文件夹的路径。同时使用 dockerfile 指令指定 Dockerfile 文件 名
version: '3'
services:
nginx-front:
build:
context: ./test
dockerfile: Dockerfile-nginx
如果同时指定了 image和 build, image 不在具有单独使用它的意义,而是指定了目前要构建的镜像的名称。 也就是说 Compose 会使用 build 指令中指定的 Dockerfile 构建的镜像,之后构建的镜像名称使用 image 中指定的名字 nginx-front:tag命名
build: ./test
image: nginx-front:tag
4 . command
command指令可以覆盖容器启动后默认执行的命令
command: bundle exec thin -p 3000
也可以写成类似 Dockerfile 中的格式
command: [bundle, exec, thin, -p, 3000]
- depends_on
定于容器的依赖的其他容器及启动先后问题。以下例子中会先启动容器tomcat和redis再启动nginx
但是并不意味着nginx-front服务会等待redis和tomcat完全启动之后才启动
version: '3'
services:
nginx-front:
build: ./test
depends_on:
- tomcat
- redis
redis:
image: redis
tomcat:
image: tomcat
6.environment
设置环境变量。可以使用数组或字典两种格式
只给定名称的变量会自动获取运行 Compose 主机上对应变量的值,可以用来防止泄露不必要的数据
environment:
DEV_ENV: test
SESSION_SECRET:
environment:
- DEV_ENV=test
- SESSION_SECRET
- ports
映射端口信息
宿主端口:容器端口 (即:HOST:CONTAINER) 的格式格式,或者仅仅指定容器的端口(宿主将会随机选择端口)
ports:
- "80"
- "80:80"
- "6379:6379"
- "127.0.0.1:8080:8080"
注意:当使用 HOST:CONTAINER 格式来映射端口时,如果你使用的容器端口小于 60 并且没放到引号里,可能会得到错误结果,因为 YAML 会自动解析 xx:yy 这种数字格式为 60 进制。为避免出现这种问题,建议数字串都采用引号包括起来的字符串格式
- expose
暴露端口,但不映射到宿主机,只被连接的服务访问。仅可以指定容器内部的端口为参数
expose:
- "80"
- "443"
- networks
容器需要要加入的网络,使用顶级networks 定义下的条目
services:
nginx-front:
networks:
- test-network
...
networks:
test-network:
10.extra_hosts
类似Docker中的 --add-host 参数,指定container额外的host解析
extra_hosts:
- "registry.yun-ti.com:192.168.0.50"
- "code.yun-ti.com:192.168.0.50"
- healthcheck
通过命令检查容器是否健康运行
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 180s
timeout: 10s
retries: 3
volumes 常用相关配置
- volumes
该指令中路径支持相对路径。数据卷所挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER) 或加上访问模式 (HOST:CONTAINER:ro)
volumes:
- /etc/conf
- cache/:/tmp/cache
- ~/home/nginxlogs:/var/logs/nginx:ro
- 卷的 bind 和 volume 的混合使用示例
version: "3.2"
services:
nginx-front:
image: nginx:alpine
volumes:
# 卷 (volume)
- type: volume
source: ngx-cfg-data
target: /etc/nginx
volume:
nocopy: true
# 挂载 (bind)
- type: bind
source: /home/static
target: /usr/share/nginx/html
mysql:
image: mysql:5.7.3
volumes:
- "/var/run/mysql/mysql.sock:/var/run/mysql/mysql.sock"
- "msyql-data:/var/lib/mysql"
volumes:
ngx-cfg-data:
mysql-data
容器的限制的参数
- ulimits
指定容器的 ulimits 限制值。
e.g.指定最大进程数为 65535,指定文件句柄数为65535
ulimits:
nproc: 65535
nofile:
soft: 65535
hard: 65535
2.sysctl
配置容器内核参数
sysctls:
net.core.somaxconn: 10240
net.ipv4.tcp_syncookies: 0
sysctls:
- net.core.somaxconn=10240
- net.ipv4.tcp_syncookies=0
编写一个版本 3.6的docker-compose.yml示例
version: "3.6"
services:
redis:
image: redis:alpine
ports:
- "6379"
networks:
- frontend
deploy:
replicas: 2
update_config:
parallelism: 2
delay: 10s
restart_policy:
condition: on-failure
mysql:
image: mysql:5.7.3
volumes:
- db-data:/var/lib/mysql
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:
来源:CSDN
作者:扛枪不遇鸟
链接:https://blog.csdn.net/weixin_43855694/article/details/103458740