Docker Compose 配置
基础
version: "3" # 版本号,一般使用最新版或适用版本
services: # 定义多个服务(容器)
service_name:
image: 镜像名
ports:
- "端口映射"
environment:
- 变量=值
volumes:
- 本地路径:容器路径
networks:
- 网络名
networks: #(可选)定义自定义网络
network_name:
volumes: #(可选)定义数据卷
volume_name:🍒 version
指定 Compose 文件格式的版本。推荐使用 3.8 或更高版本。
🍒 services
定义应用程序中运行的各个服务(容器)
每个服务都代表一个 Docker 容器
🍦🍦 image
image: 指定用于创建容器的 Docker 镜像。可以是 Docker Hub 上的公共镜像,也可以是您自己构建的镜像。yamlservices: web: image: nginx:latest
🍦🍦 build
build: 指定用于构建镜像的 Dockerfile 的路径。如果指定了build,则不需要image。yaml您还可以指定services: app: build: ./app # 指向包含 Dockerfile 的目录context和dockerfile:yamlservices: app: build: context: ./app dockerfile: Dockerfile.dev
🍦🍦 container_name
container_name: 为容器指定一个自定义名称,而不是让 Docker Compose 自动生成。yamlservices: db: container_name: my_database image: postgres:14
🍦🍦 ports
ports: 将容器的端口映射到主机的端口。格式为"HOST:CONTAINER"。yaml您可以省略主机端口,让 Docker 自动分配:services: web: image: nginx:latest ports: - "80:80" - "443:443"yamlservices: web: image: nginx:latest ports: - "80" # 映射到主机的随机端口
🍦🍦 volumes
volumes: 挂载卷或绑定挂载。命名卷 (Named Volumes): 更推荐的方式,Docker 管理卷的生命周期。
yamlvolumes: db_data: # 定义一个命名卷 services: db: image: postgres:14 volumes: - db_data:/var/lib/postgresql/data # 将命名卷挂载到容器内绑定挂载 (Bind Mounts): 将主机上的文件或目录挂载到容器内。
yamlservices: app: build: ./app volumes: - ./app:/app # 将本地的 ./app 目录挂载到容器的 /app - ./config/nginx.conf:/etc/nginx/nginx.conf:ro # 挂载一个只读配置文件
🍦🍦 environment
environment: 设置容器内的环境变量。yamlservices: app: image: python:3.9 environment: - NODE_ENV=production - DATABASE_URL=postgres://user:password@db:5432/mydb您也可以使用
.env文件来管理环境变量,并在docker-compose.yml中使用env_file。yaml# .env 文件 NODE_ENV=production DATABASE_URL=postgres://user:password@db:5432/mydb # docker-compose.yml services: app: image: python:3.9 env_file: - .env
🍦🍦 depends_on
depends_on: 指定服务的启动顺序。这不会等待依赖服务完全启动和运行,只是等待其容器启动。yamlservices: web: image: nginx:latest ports: - "80:80" depends_on: - app # web 服务会在 app 服务容器启动后启动 app: build: ./app ports: - "5000:5000" depends_on: - db # app 服务会在 db 服务容器启动后启动 db: image: postgres:14 environment: POSTGRES_DB: mydb POSTGRES_USER: user POSTGRES_PASSWORD: password
🍦🍦 networks
networks: 将服务连接到指定的网络。yamlnetworks: frontend: driver: bridge # 指定网络驱动 services: web: image: nginx:latest networks: - frontend # 将 web 服务连接到 frontend 网络
🍦🍦 restart
restart: 指定容器退出时的重启策略。no: 不重启(默认)。on-failure: 仅在容器以非零退出码退出时重启。always: 无论退出码如何,始终重启。unless-stopped: 始终重启,但如果容器被手动停止,则不重启。
yamlservices: app: build: ./app restart: unless-stopped
🍦🍦 healthcheck
healthcheck: 定义健康检查,用于监测容器是否正常运行。yamlservices: db: image: postgres:14 ports: - "5432:5432" healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] # 执行命令检查 interval: 10s # 每 10 秒检查一次 timeout: 5s # 检查超时时间为 5 秒 retries: 3 # 失败 3 次后认为容器不健康 start_period: 30s # 容器启动后 30 秒内不计入失败次数command: 覆盖镜像中定义的默认命令。yamlservices: app: image: alpine command: ["ping", "localhost"]
🍦🍦 entrypoint
entrypoint: 覆盖镜像中定义的默认入口点。yamlservices: app: image: alpine entrypoint: "/bin/sh" command: "-c 'echo Hello'"
🍦🍦 其他
hostname: 设置容器的主机名。domainname: 设置容器的域名。dns: 自定义 DNS 服务器。extra_hosts: 添加自定义的主机名到/etc/hosts映射。ulimits: 设置容器的 ulimit。
🍒 networks
允许您创建自定义网络,从而实现服务之间的隔离和通信。
driver: 指定网络驱动,最常用的是bridge。name: 指定网络的名称。ipam: IP 地址管理配置,允许您指定子网等。
networks:
my_app_net:
driver: bridge
ipam:
config:
- subnet: 192.168.99.0/24🍒 volumes
用于定义持久化存储卷。
name: 卷的名称。driver: 指定卷驱动,默认为local。driver_opts: 为卷驱动提供选项。
volumes:
postgres_data:
driver: local
driver_opts:
type: none
o: bind
device: /path/on/host/for/postgres_data # 绑定到主机上的目录(不推荐,通常使用命名卷)扩展
扩展 (Extensions)
Compose 文件格式允许使用扩展点,例如 extends。
extends: 从另一个 Compose 文件或服务继承配置。
# docker-compose.yml
services:
base_service:
image: alpine:latest
command: ["echo", "Hello"]
# docker-compose.override.yml
services:
app:
extends:
file: docker-compose.yml
service: base_service
ports:
- "8080:80"当您运行 docker compose -f docker-compose.yml -f docker-compose.override.yml up 时,app 服务将继承 base_service 的配置,并添加自己的配置。
覆盖文件 (docker-compose.override.yml)
您可以使用多个 Compose 文件,并且后面的文件会覆盖前面的文件的配置。通常,docker-compose.yml 用于生产环境的定义,而 docker-compose.override.yml 用于开发环境的覆盖,例如:
- 重新构建镜像。
- 修改端口映射。
- 挂载本地代码目录。
- 设置开发相关的环境变量。
示例:
docker-compose.yml (生产环境定义)
version: "3.8"
services:
app:
image: my_app:production
ports:
- "80:8000"
environment:
NODE_ENV: productiondocker-compose.override.yml (开发环境覆盖)
version: "3.8"
services:
app:
build:
context: ./app
dockerfile: Dockerfile.dev
ports:
- "3000:8000" # 映射到不同的端口
volumes:
- ./app:/app # 挂载本地代码
environment:
NODE_ENV: development使用 docker compose up 运行,将同时应用这两个文件的配置。
变量插值 (${VARIABLE})
您可以在 Compose 文件中使用环境变量来动态设置配置。
services:
db:
image: postgres:${POSTGRES_VERSION:-14} # 如果 POSTGRES_VERSION 未定义,则默认为 14
environment:
POSTGRES_USER: ${DB_USER}
POSTGRES_PASSWORD: ${DB_PASSWORD}可以在运行命令时设置这些变量: DB_USER=myuser DB_PASSWORD=mypassword docker compose up 或者通过 .env 文件。
版本兼容性
| Docker Engine 版本 | Compose 文件版本 |
|---|---|
| 19.03.0+ | 3.8 |
| 18.06.0+ | 3.7 |
| 18.02.0+ | 3.6 |
| 17.12.0+ | 3.5 |
| 17.09.0+ | 3.4 |
| 17.06.0+ | 3.3 |
| 17.04.0+ | 3.2 |