503 字
3 分钟
Docker Compose 多容器实操
Docker Compose 使用一个 YAML 文件描述服务、网络、卷和依赖关系,适合本地开发、小型部署以及可复现的集成测试环境。
示例结构
example/├── compose.yaml├── .env├── app/│ └── Dockerfile└── data/compose.yaml:
services: app: build: ./app ports: - "8080:8000" environment: DATABASE_URL: postgresql://app:${POSTGRES_PASSWORD}@db:5432/app depends_on: db: condition: service_healthy restart: unless-stopped
db: image: postgres:18 environment: POSTGRES_DB: app POSTGRES_USER: app POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} volumes: - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U app -d app"] interval: 5s timeout: 3s retries: 10
volumes: postgres-data:.env:
POSTGRES_PASSWORD=replace-with-a-strong-password.env 不应提交到公共仓库。提交一份不含敏感值的 .env.example。
启动与停止
docker compose configdocker compose up -d --builddocker compose psdocker compose logs -fdocker compose downdocker compose config 会展开变量并校验最终配置,适合在启动前检查缩进、引用和合并结果。
服务名就是默认网络中的主机名
应用应连接 db:5432,而不是 localhost:5432。容器内的 localhost 指当前容器自身。
docker compose exec app getent hosts dbdocker compose exec db psql -U app -d app更新单个服务
docker compose build appdocker compose up -d --no-deps app拉取新镜像:
docker compose pulldocker compose up -d查看与执行命令
docker compose logs --tail 100 appdocker compose exec app shdocker compose exec db pg_isready -U app -d appdocker compose topexec 在已运行容器中执行命令;一次性任务可用:
docker compose run --rm app python -m pytest卷与数据
普通停止不会删除命名卷:
docker compose down删除命名卷:
docker compose down --volumesWARNING
--volumes会永久删除 Compose 管理的数据库数据。执行前确认备份和卷名称。
健康检查与依赖
depends_on 的健康条件能减少启动竞争,但不能替代应用自身的重试机制。数据库可能在运行中重启或短暂不可用,应用仍应设置连接超时和有限重试。
多环境配置
可以使用多个文件覆盖配置:
docker compose -f compose.yaml -f compose.prod.yaml configdocker compose -f compose.yaml -f compose.prod.yaml up -d基础文件保存通用配置,覆盖文件只描述环境差异,避免复制整份服务定义。
参考资料
Docker Compose 多容器实操
https://zh19990906.github.io/fuwari/posts/docker-compose-practice/