Docker 入门(五):Docker Compose 编排多容器应用
当一个应用包含数据库、缓存、后端和前端等多个服务时,逐个执行 docker run 很快会变得难以维护。Docker Compose 使用一个 YAML 文件描述服务、网络、端口、环境变量和数据卷,让整套环境可以一次启动和停止。
常用生命周期命令
在 compose.yaml 或 docker-compose.yml 所在目录执行:
bash
docker compose up -d # 创建并后台启动
docker compose logs -f # 查看实时日志
docker compose stop # 停止容器,保留容器
docker compose start # 启动已停止的容器
docker compose down # 停止并删除容器、网络
新版 Docker 推荐使用 docker compose 子命令;旧环境也可能使用独立的 docker-compose 命令。
Compose 文件核心字段
services:定义应用服务。image:使用已有镜像;build:从 Dockerfile 构建镜像。command:覆盖镜像默认命令。container_name:指定容器名称,团队协作时应谨慎使用以避免重名。ports:将宿主机端口映射到容器端口。depends_on:声明启动顺序,不代表依赖服务已经真正就绪。environment:传入环境变量,敏感值应使用外部密钥管理。expose:只在 Compose 网络内声明服务端口,不发布到宿主机。restart:配置容器异常退出后的重启策略。volumes:挂载命名卷或宿主机目录,持久化数据和配置。networks:定义服务之间的通信网络。working_dir:设置容器内的工作目录。
一个简单示例
yaml
services:
web:
image: nginx:1.27-alpine
ports:
- "8080:80"
depends_on:
- api
networks: [app]
api:
build: ./api
environment:
DB_HOST: db
networks: [app]
db:
image: postgres:16
environment:
POSTGRES_PASSWORD: change-me
volumes:
- pgdata:/var/lib/postgresql/data
networks: [app]
volumes:
pgdata:
networks:
app:
在同一个 Compose 网络中,服务可以直接使用服务名互相访问,例如 API 通过 db:5432 连接数据库。生产环境不要把示例密码直接提交到代码仓库,应改用 .env、Secrets 或外部配置中心。
Portainer:可选的图形化管理
Portainer 可以通过 Web 界面查看容器、镜像、网络和卷,适合学习和日常运维。部署时仍要为管理端设置强密码,并限制访问来源。
小结
Compose 的价值在于把多容器环境声明式地保存下来。掌握服务、网络、卷、端口和环境变量后,就可以用同一份配置复现开发环境,并进一步接入 CI/CD。