Docker Compose 字段讲解
内容:顶层字段 -> service 字段 -> 网络/存储 -> 进阶字段 -> 已废弃字段
version: "3.9" # 已可省略(v2 规范)
name: myapp
services:
networks:
volumes:
configs:
secrets:
- Compose v2 可以不写
- 官方推荐删除
# version: "3.9" # 可省略
指定 Project 名(优先级高于目录名)
name: myapp
等价于:
docker compose -p myapp up
定义所有服务(= 容器模板)
services:
web:
api:
db:
定义网络(默认会自动创建 <project>_default)
定义命名数据卷
- configs:配置文件(偏 Swarm / K8S)
- secrets:敏感信息
image:指定镜像
image: nginx:1.27-alpine
build:构建镜像
build: .
完整写法:
build:
context: .
dockerfile: Dockerfile
target: prod
args:
NODE_ENV: production
pull_policy:镜像拉取策略
pull_policy: if_not_present
可选:
- always
- missing
- never
container_name:指定容器名(⚠️ 不推荐在 scale 时使用)
container_name: my-nginx
command:覆盖镜像 CMD
command: ["nginx", "-g", "daemon off;"]
entrypoint:覆盖 ENTRYPOINT
entrypoint: ["/app/start.sh"]
working_dir:设置工作目录
working_dir: /app
user:指定运行用户(安全)
user: "1000:1000"
ports:端口映射(宿主机访问)
ports:
- "8080:80"
expose:仅容器间可见(不映射宿主机)
expose:
- "8080"
networks:指定服务加入的网络
networks:
- backend
hostname:容器主机名
hostname: web01
extra_hosts:修改 /etc/hosts
extra_hosts:
- "db.local:10.0.0.10"
environment
environment:
- ENV=production
- DEBUG=false
或:
environment:
ENV: production
DEBUG: "false"
env_file:从文件加载环境变量
env_file:
- .env
volumes:挂载数据
volumes:
- db_data:/var/lib/postgresql/data
- ./config:/etc/app:ro
tmpfs:内存文件系统
tmpfs:
- /run
- /tmp
depends_on:控制启动顺序(⚠️ 不保证服务可用)
depends_on:
- db
带 healthcheck:
depends_on:
db:
condition: service_healthy
healthcheck:健康检查(非常重要)
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 10s
timeout: 2s
retries: 3
deploy(⚠️ 在非 Swarm 下部分字段无效)
deploy:
resources:
limits:
cpus: "1.0"
memory: 512M
等价的非 deploy 写法(推荐本地用):
mem_limit: 512m
cpus: 1.0
restart
restart: unless-stopped
可选:
- no
- always
- on-failure
- unless-stopped
logging
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
privileged:是否特权模式(⚠️ 谨慎)
privileged: true
cap_add / cap_drop
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
security_opt
security_opt:
- no-new-privileges:true
networks:
backend:
driver: bridge
高级用法:
networks:
backend:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
volumes:
db_data:
driver: local
configs:
app_config:
file: ./config.yml
secrets:
db_password:
file: ./db_password.txt
| 字段 | 说明 |
|---|---|
| links | 已废弃,用 network |
| volumes_from | 不推荐 |
| extends | 不推荐 |
| cpu_shares | 已废弃 |
| version | 可省略 |
name: erp
services:
api:
build: .
image: erp-api:1.0.0
ports:
- "8000:8000"
env_file:
- .env
depends_on:
db:
condition: service_healthy
restart: unless-stopped
db:
image: postgres:16
volumes:
- pgdata:/var/lib/postgresql/data
environment:
POSTGRES_PASSWORD: secret
healthcheck:
test: ["CMD", "pg_isready"]
interval: 10s
retries: 5
volumes:
pgdata:
service 是容器模板,不是容器
depends_on 不等于服务就绪
Compose 是单机编排,不是生产调度