docker-compose的使用总结
以下是一份 Docker Compose 使用总结,涵盖核心配置、网络管理、调试技巧及常见问题解决方案,适用于开发和生产环境:
一、核心概念与配置要点
-
版本选择
• 使用version: '3.8'
及以上版本,支持更多新特性(如资源限制、健康检查)。• 新版 Compose(V2+)统一使用
docker compose
命令,无需-f
指定文件。 -
服务定义
•services
:定义每个容器的镜像、端口、卷、环境变量等。services:web:image: nginx:latestports:- "80:80"volumes:- ./nginx.conf:/etc/nginx/nginx.conf
-
网络管理
• 默认网络:所有服务默认加入同一网络,通过服务名互通。• 自定义网络:显式定义网络提高可读性,隔离不同环境。
networks:frontend:driver: bridgebackend:driver: bridge
-
依赖与启动顺序
•depends_on
:仅控制容器启动顺序,不保证服务可用性。• 健康检查(Healthcheck):确保依赖服务真正就绪。
services:db:image: postgreshealthcheck:test: ["CMD-SHELL", "pg_isready -U postgres"]interval: 5stimeout: 3sretries: 5backend:depends_on:db:condition: service_healthy
二、数据持久化与资源控制
-
卷(Volumes)
• 匿名卷:数据随容器删除丢失(仅开发调试用)。• 命名卷:持久化数据,推荐生产使用。
volumes:db_data: # 命名卷driver: local services:db:volumes:- db_data:/var/lib/mysql
-
资源限制
• 防止单一服务耗尽宿主机资源。services:redis:deploy:resources:limits:cpus: '0.5'memory: 512M
三、网络通信最佳实践
-
服务间通信
• 使用服务名:直接通过服务名(如http://backend:8000
)访问。• 避免硬编码 IP:依赖 Docker DNS 自动解析。
-
端口暴露规则
• 仅暴露必要端口:如 Web 服务的80:80
。• 内部端口优先:服务间通信使用容器内部端口(如
8000
),而非宿主机映射端口。 -
解决 Host 头校验问题
• 修正请求头:确保Host
头不含端口(如algorithm_service
而非algorithm_service:8000
)。• 调整服务配置:如 Django 的
ALLOWED_HOSTS
添加服务名或通配符(仅开发环境)。
四、调试与日志管理
-
日志查看
• 实时查看日志:docker compose logs -f service_name
• 过滤错误日志:
docker compose logs service_name | grep -i error
-
进入容器调试
docker compose exec service_name sh # 进入容器 Shell curl -v http://dependent_service:port # 测试内部通信
-
网络诊断
• 检查容器 IP:docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name
• 测试端口连通性:
nc -zv service_name port
五、多环境配置技巧
-
多 Compose 文件
• 分离开发、测试、生产配置:# 开发环境 docker compose -f docker-compose.yml -f docker-compose.dev.yml up# 生产环境 docker compose -f docker-compose.yml -f docker-compose.prod.yml up
-
环境变量文件
• 使用.env
管理敏感信息:# .env DB_PASSWORD=secret
• 在 Compose 中引用:
services:db:environment:- POSTGRES_PASSWORD=${DB_PASSWORD}
六、常见问题与解决
问题场景 | 解决方案 |
---|---|
服务启动顺序导致依赖失败 | 使用 depends_on + healthcheck 确保依赖服务可用。 |
容器间无法通过服务名通信 | 检查是否在同一网络,通过 docker network inspect network_name 验证。 |
端口冲突或无法访问 | 确认宿主机端口未被占用,检查防火墙规则。 |
数据卷权限问题 | 在 Dockerfile 或启动命令中设置用户权限(如 chown )。 |
镜像拉取失败 | 检查镜像名称和标签,或配置私有仓库认证(registry: 私有仓库地址 )。 |
七、性能优化建议
-
镜像瘦身
• 使用多阶段构建(Multi-stage Build)减少生产镜像体积。# Dockerfile FROM node:18 as builder WORKDIR /app COPY . . RUN npm buildFROM nginx:alpine COPY --from=builder /app/dist /usr/share/nginx/html
-
缓存优化
• 在docker-compose.yml
中利用缓存加速构建:services:web:build:context: .cache_from:- myapp:latest
-
并行启动
• 使用docker compose up --parallel
并行启动无依赖的服务。
八、安全注意事项
-
最小化权限
• 避免容器以root
用户运行:services:app:user: "1000:1000"
-
密钥管理
• 使用 Docker Secrets 或环境变量文件(.env
)管理敏感信息,禁止硬编码。 -
镜像来源
• 优先使用官方镜像,定期扫描漏洞(如docker scan
)。
通过以上总结,可快速定位 Docker Compose 的配置问题,优化容器化应用的部署和管理效率。