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: production
docker-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 |