史上最全docker-compose.yaml语法规则

2,137 阅读7分钟

版本(version)

  • 含义:指定 Compose 文件的版本。
  • 所需值结构:字符串(string)
  • 示例
version: '3.8'

服务(services)

  • 含义:定义应用的服务。
  • 所需值结构:映射(map)

服务下的关键字

1. build
    • 含义:配置构建时信息。
    • 所需值结构:字符串(string)或映射(map)
    • 示例
build: ./path/to/dockerfile
# 或
build:
  context: ./path/to/dockerfile
  dockerfile: Dockerfile-alternate
2. cap_add, cap_drop
    • 含义:添加或删除容器的能力(Linux capabilities)。
    • 所需值结构:数组(array)
    • 示例
cap_add:
  - ALL
3. command
    • 含义:覆盖容器启动后默认执行的命令。
    • 所需值结构:数组(array)或字符串(string)
    • 示例
command: ["bundle", "exec", "thin", "-p", "3000"]
# 或
command: bundle exec thin -p 3000
4. configs
    • 含义:将配置项添加到容器中。
    • 所需值结构:数组(array)或映射(map)
    • 示例
configs:
  - my_config
# 或
configs:
  my_config:
    external: true
5. cgroup_parent
    • 含义:指定一个可选的父 cgroup 用于容器。
    • 所需值结构:字符串(string)
    • 示例
cgroup_parent: m-executor-abcd
6. container_name
    • 含义:指定自定义容器名称,而不是生成的默认名称。
    • 所需值结构:字符串(string)
    • 示例
container_name: my-web-container
7. depends_on
    • 含义:指定服务之间的依赖关系,影响启动顺序。
    • 所需值结构:数组(array)
    • 示例
depends_on:
  - db
  - redis
8. deploy
    • 含义:指定与服务的部署和运行有关的配置。
    • 所需值结构:映射(map)
    • 示例
deploy:
  replicas: 3
  update_config:
    order: start-first
9. devices
    • 含义:指定设备映射列表。
    • 所需值结构:数组(array)
    • 示例
devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"
10. dns
    • 含义:自定义 DNS 服务器。
    • 所需值结构:数组(array)
    • 示例
dns:
  - 8.8.8.8
  - 8.8.4.4
11. dns_search
    • 含义:自定义 DNS 搜索域。
    • 所需值结构:数组(array)
    • 示例
dns_search:
  - mydomain.com
12. entrypoint
    • 含义:覆盖容器的默认入口点。
    • 所需值结构:数组(array)或字符串(string)
    • 示例
entrypoint: ["php", "-d", "memory_limit=-1", "vendor/bin/phpunit"]
# 或
entrypoint: php -d memory_limit=-1 vendor/bin/phpunit
13. env_file
    • 含义:从一个文件中引入环境变量。
    • 所需值结构:数组(array)
    • 示例
env_file:
  - web-.env
14. environment
    • 含义:设置环境变量。
    • 所需值结构:映射(map)或数组(array)
    • 示例
environment:
  RACK_ENV: development
  SHOW: "true"
# 或
environment:
  - RACK_ENV=development
  - SHOW=true
15. expose
    • 含义:暴露端口,但不映射到宿主机,只被连接的服务访问。
    • 所需值结构:数组(array)
    • 示例
expose:
  - "8080"
16. extra_hosts
    • 含义:添加主机名映射。
    • 所需值结构:映射(map)
    • 示例
extra_hosts:
  - "host.docker.internal:host-gateway"
17. healthcheck
    • 含义:配置运行健康检查的命令。
    • 所需值结构:映射(map)
    • 示例
healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost"]
  interval: 10s
  timeout: 1s
18. image
    • 含义:指定容器启动所使用的镜像。
    • 所需值结构:字符串(string)
    • 示例
image: nginx:latest
19. labels
    • 含义:添加元数据到容器,以“label”形式。
    • 所需值结构:映射(map)
    • 示例
labels:
  com.example.version: 1.0.0
20. links
    • 含义:链接到其它服务中的容器,已被废弃,建议使用网络别名。
    • 所需值结构:数组(array)
    • 示例
links:
  - db
  - redis
21. logging
    • 含义:配置日志驱动。
    • 所需值结构:映射(map)
    • 示例
logging:
  driver: "json-file"
22. network_mode
    • 含义:设置网络模式。
    • 所需值结构:字符串(string)
    • 示例
network_mode: "bridge"
23. networks
    • 含义:将容器加入指定网络。
    • 所需值结构:数组(array)或映射(map)
    • 示例
networks:
  - webnet
24. ports
    • 含义:映射容器端口到宿主机。
    • 所需值结构:数组(array)
    • 示例
ports:
  - "80:80"
  - "443:443"
25. restart
    • 含义:配置容器的重启策略。
    • 所需值结构:字符串(string)
    • 示例
restart: always
26. secrets
    • 含义:配置存储敏感数据。
    • 所需值结构:数组(array)或映射(map)
    • 示例
secrets:
  - my_secret
# 或
secrets:
  my_secret:
    external: true
27. security_opt
    • 含义:为每个容器覆盖默认的标签。
    • 所需值结构:数组(array)
    • 示例
security_opt:
  - "apparmor:unconfined"
28. stop_grace_period
    • 含义:指定在容器无法处理 SIGTERM 信号,等待多久后发送 SIGKILL 信号强制停止容器。
    • 所需值结构:字符串(string)
    • 示例
stop_grace_period: 10s
29. stop_signal
    • 含义:设置替代信号来停止容器。
    • 所需值结构:字符串(string)
    • 示例
stop_signal: SIGINT

网络(networks)

  • 含义:定义自定义网络。
  • 所需值结构:映射(map)

网络下的关键字

1. driver
    • 含义:指定网络驱动类型。
    • 所需值结构:字符串(string)
    • 示例
driver: bridge
2. driver_opts
    • 含义:指定网络驱动程序选项。
    • 所需值结构:映射(map)
    • 示例
driver_opts:
  com.docker.network.bridge.enable_icc: "true"
3. external
    • 含义:指定网络是否是外部定义的。
    • 所需值结构:布尔值(boolean)
    • 示例
external: true
4. ipam
    • 含义:自定义 IPAM 配置。
    • 所需值结构:映射(map)
    • 示例
ipam:
  driver: default
5. internal
    • 含义:限制对网络的访问。
    • 所需值结构:布尔值(boolean)
    • 示例
internal: true
6. labels
    • 含义:为网络添加元数据。
    • 所需值结构:映射(map)
    • 示例
labels:
  com.example.version: 1.0.0
7. name
    • 含义:为网络设置自定义名称。
    • 所需值结构:字符串(string)
    • 示例
name: webnet

卷(volumes)

  • 含义:定义命名卷。
  • 所需值结构:映射(map)

卷下的关键字

1. driver
    • 含义:指定卷驱动类型。
    • 所需值结构:字符串(string)
    • 示例
driver: local
2. driver_opts
    • 含义:指定卷驱动程序选项。
    • 所需值结构:映射(map)
    • 示例
driver_opts:
  o: bind
3. external
    • 含义:指定卷是否是外部定义的。
    • 所需值结构:布尔值(boolean)或映射(map)
    • 示例
external: true
4. labels
    • 含义:为卷添加元数据。
    • 所需值结构:映射(map)
    • 示例
labels:
  com.example.version: 1.0.0
5. name
    • 含义:为卷设置自定义名称。
    • 所需值结构:字符串(string)
    • 示例
name: webdata

配置项(configs)

  • 含义:定义配置项,可以在服务中引用。
  • 所需值结构:映射(map)

配置项下的关键字

1. file
    • 含义:指定配置文件的路径。
    • 所需值结构:字符串(string)
    • 示例
file: ./path/to/config.yml
2. external
    • 含义:指定配置项是否是外部定义的。
    • 所需值结构:布尔值(boolean)
    • 示例
external: true
3. name
    • 含义:为配置项设置自定义名称。
    • 所需值结构:字符串(string)
    • 示例
name: my_config

密钥(secrets)

  • 含义:定义敏感数据,可以在服务中引用。
  • 所需值结构:映射(map)

密钥下的关键字

1. file
    • 含义:指定包含密钥内容的文件路径。
    • 所需值结构:字符串(string)
    • 示例
file: ./path/to/secret.txt
2. external
    • 含义:指定密钥是否是外部定义的。
    • 所需值结构:布尔值(boolean)
    • 示例
external: true
3. name
    • 含义:为密钥设置自定义名称。
    • 所需值结构:字符串(string)
    • 示例
name: my_secret

完整示例&注意说明

以下是一个包含上述关键字的 docker-compose.yml 文件示例:

# 注意📢,如果是关键字,其冒号后面都有空格或回车

version: '3.8' #冒号后面有空格,是kv对,值为字符串

services: #值是map,有换行,其后的web和db是关键字
  web:
    image: nginx:latest #nginx:latest是字符串,里面的冒号后没空格
    ports: #值是列表,列表的元素值是字符串
      - "80:80" #是字符串
    environment: #值是列表,列表的元素值是字符串
      - NGINX_HOST=example.com #是字符串
    volumes: #值是列表,列表的元素值是字符串
      - /data/nginx:/usr/share/nginx/html #是字符串
    networks:
      - webnet

  db:
    image: mysql:5.7 #字符串,如果冒号后面有空格才算是kv对,最好使用双引号包围好
    environment:
      - MYSQL_ROOT_PASSWORD=root #字符串
      - MYSQL_DATABASE=example
    volumes:
      - db_data:/var/lib/mysql #这种算是字符串,如果冒号后面有空格才算是kv对
    networks:
      - webnet

networks:
  webnet:
    driver: bridge

volumes:
  db_data:
    driver: local

这个例子中定义了两个服务:webdb,它们分别使用 nginxmysql 镜像。web 服务映射了端口 80,并设置了环境变量。db 服务设置了数据库的环境变量,并挂载了一个卷。两个服务都加入了名为 webnet 的网络。此外,还定义了一个名为 db_data 的卷。