Docker Compose 入门指南
Docker Compose 用一份 YAML 定义多容器应用:服务、网络、卷一键起停。本文以全栈应用为例走通安装、编写 compose 文件、构建运行与服务间通信全流程。
直接回答:Docker Compose 是多容器应用的编排工具——compose.yaml 声明服务(web/db/cache)、网络与卷,docker compose up 一条命令按依赖顺序拉起全部服务,服务间以服务名互访。单机开发与小型部署的标准答案。
解决什么问题
手动跑全栈应用:docker run 数据库、记 IP、再 docker run 应用并 link……服务一多就是灾难。Compose 把这一切收进一份 YAML——环境即代码,clone 下来 compose up 就跑。
一份典型 compose.yaml
services:
web:
build: .
ports: ["127.0.0.1:8080:8080"]
depends_on: [db, cache]
environment:
DATABASE_URL: postgres://app:${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD}@db:5432/app
db:
image: postgres:16
environment:
POSTGRES_USER: app
POSTGRES_DB: app
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?Set POSTGRES_PASSWORD}
volumes: ["pgdata:/var/lib/postgresql/data"]
cache:
image: redis:7
volumes:
pgdata:
这是应用骨架,需自备监听 8080 的应用与 Dockerfile,并实现数据库连接重试。先在受控环境设置 POSTGRES_PASSWORD;URL 特殊字符需编码,密码不可入库。生产使用文件密钥或外部密钥管理。
核心命令
docker compose up -d # 后台起全部
docker compose ps # 状态
docker compose logs -f web # 追日志
docker compose exec web sh # 进容器
docker compose down # 全部停掉并清理网络
# 仅对可丢弃数据的测试项目执行:
# docker compose down -v # 删除本项目非 external 卷及匿名卷
docker compose ps 显示容器运行后,再访问应用接口并检查数据库连接日志,确认服务真正可用。
服务间通信
接入同一 Compose 网络的服务以服务名为主机名互访(postgres://db:5432)——内置 DNS 自动解析,不用管 IP。
常见问题(FAQ)
Q:depends_on 会等数据库就绪吗?
A:默认只等容器启动,不等服务就绪。配 condition: service_healthy + 数据库的 healthcheck 才靠谱。
Q:生产环境能用 Compose 吗?
A:单机小项目完全可用(很多团队这么跑);多机与高可用需求上 Swarm/K8s。
Q:compose.yaml 和 docker-compose.yml 有什么区别?
A:新旧文件名,都认。命令也从 docker-compose(v1 Python 版)演进为 docker compose(v2 插件,空格无连字符)。
官方参考
本文依据官方文档整理,示例未在本文中进行运行验证。生产部署需按所用版本、权限和实际负载验证。