Docker Compose 基础配置
概述
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用程序的服务,然后使用一个命令就可以创建并启动所有服务。
docker-compose.yml 文件结构
基本结构
version: '3.8'
services:
service_name:
# 服务配置
volumes:
# 卷配置
networks:
# 网络配置
版本说明
version: 指定 Compose 文件格式版本- 常用版本:
3.8: 支持 Docker Engine 19.03.0+3.7: 支持 Docker Engine 18.06.0+3.6: 支持 Docker Engine 18.02.0+
常用配置项
1. 服务配置 (services)
基本服务定义
services:
web:
image: nginx:latest
container_name: my-nginx
restart: always
使用 Dockerfile 构建
services:
app:
build:
context: .
dockerfile: Dockerfile
args:
- NODE_ENV=production
端口映射
services:
web:
image: nginx
ports:
- "80:80" # 主机端口:容器端口
- "443:443"
- "8080-8090:8080-8090" # 端口范围
环境变量
services:
app:
image: node:14
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:pass@db:5432/mydb
env_file:
- .env
- .env.local
卷挂载
services:
app:
image: nginx
volumes:
- ./html:/usr/share/nginx/html:ro # 只读挂载
- ./config:/etc/nginx/conf.d
- data_volume:/var/lib/data # 命名卷
2. 网络配置 (networks)
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true # 内部网络,不能访问外部
services:
web:
image: nginx
networks:
- frontend
api:
image: node:14
networks:
- frontend
- backend
3. 卷配置 (volumes)
volumes:
postgres_data:
driver: local
redis_data:
external: true # 使用外部已存在的卷
services:
db:
image: postgres:13
volumes:
- postgres_data:/var/lib/postgresql/data
4. 依赖关系
services:
web:
image: nginx
depends_on:
- api
- db
api:
image: node:14
depends_on:
- db
db:
image: postgres:13
5. 重启策略
services:
app:
image: nginx
restart: always # 总是重启
# restart: unless-stopped # 除非手动停止
# restart: on-failure # 失败时重启
# restart: no # 不重启(默认)
完整示例
version: '3.8'
services:
# Web 服务器
nginx:
image: nginx:alpine
container_name: web-server
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./html:/usr/share/nginx/html:ro
- ./ssl:/etc/nginx/ssl:ro
depends_on:
- app
networks:
- frontend
restart: unless-stopped
# 应用服务
app:
build:
context: ./app
dockerfile: Dockerfile
container_name: node-app
environment:
- NODE_ENV=production
- DATABASE_URL=postgresql://user:password@db:5432/myapp
volumes:
- ./app:/usr/src/app
- /usr/src/app/node_modules
depends_on:
- db
- redis
networks:
- frontend
- backend
restart: unless-stopped
# 数据库
db:
image: postgres:13-alpine
container_name: postgres-db
environment:
- POSTGRES_DB=myapp
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
networks:
- backend
restart: unless-stopped
# 缓存
redis:
image: redis:6-alpine
container_name: redis-cache
command: redis-server --appendonly yes
volumes:
- redis_data:/data
networks:
- backend
restart: unless-stopped
# 卷定义
volumes:
postgres_data:
driver: local
redis_data:
driver: local
# 网络定义
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true
最佳实践
1. 文件组织
- 将
docker-compose.yml放在项目根目录 - 使用
.env文件管理环境变量 - 将配置文件放在专门的目录中
2. 命名规范
- 使用有意义的服务名称
- 容器名称使用项目前缀
- 卷和网络使用描述性名称
3. 安全考虑
- 不要在 compose 文件中硬编码敏感信息
- 使用 secrets 管理敏感数据
- 限制容器权限
services:
app:
image: myapp
user: "1000:1000" # 非 root 用户
read_only: true # 只读文件系统
tmpfs:
- /tmp
cap_drop:
- ALL
cap_add:
- NET_BIND_SERVICE
4. 资源限制
services:
app:
image: myapp
deploy:
resources:
limits:
cpus: '0.5'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
常见问题
1. 端口冲突
- 检查主机端口是否被占用
- 使用不同的主机端口
- 使用端口范围映射
2. 卷挂载问题
- 确保主机路径存在
- 检查文件权限
- 使用绝对路径或相对路径
3. 网络连接问题
- 确保服务在同一网络中
- 使用服务名称进行通信
- 检查防火墙设置
总结
Docker Compose 基础配置涵盖了服务定义、网络配置、卷管理等核心概念。掌握这些基础配置是使用 Docker Compose 的第一步,为后续的高级功能奠定基础。
通过合理的配置和最佳实践,可以构建出稳定、可维护的多容器应用程序。