如何用 Docker Compose 管理多个容器
概述
你有没有试过用 docker run
启动一个包含多个服务的应用?
比如一个典型的 Web 项目:
- 前端(Nginx)
- 后端(Node.js)
- 数据库(MySQL)
- 缓存(Redis)
你可能写了这样一堆命令:
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:8.0
docker run -d --name redis -p 6379:6379 redis:alpine
docker run -d --name backend -p 3000:3000 --link mysql --link redis my-backend:1.0
docker run -d --name frontend -p 80:80 --link backend nginx:alpine
不仅命令长,还容易出错,重启一次就得重新敲一遍……
别担心,Docker Compose 就是来解决这个问题的!
什么是 Docker Compose
Docker Compose 是一个用于定义和运行多容器 Docker 应用的工具。
你只需要写一个 docker-compose.yml
文件,描述所有服务,然后运行:
docker compose up
所有容器自动启动、联网、配置完成
安装Docker Compose的方法
在Linux系统上安装
确保已安装Docker,且系统版本为64位。运行以下命令下载Docker Compose的二进制文件:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
赋予二进制文件可执行权限:
sudo chmod +x /usr/local/bin/docker-compose
验证安装是否成功:
docker-compose --version
在Windows或macOS上安装
对于Windows和macOS用户,Docker Compose通常作为Docker Desktop的一部分自动安装。安装Docker Desktop后,Docker Compose将直接可用。
验证安装:
docker-compose --version
通过Python pip安装
如果系统已安装Python和pip,可以通过以下命令安装:
pip install docker-compose
注意:此方法可能因Python环境问题导致兼容性错误,推荐优先使用官方二进制文件安装。
升级Docker Compose
如需升级到最新版本,先卸载旧版本再重新安装:
sudo rm /usr/local/bin/docker-compose
随后按上述步骤重新下载和安装最新版本。Docker Compose
编写你的第一个 docker-compose.yml
我们以一个简单的 Node.js + MySQL 应用为例。
项目结构
my-app/
├── docker-compose.yml
├── backend/
│ ├── app.js
│ └── package.json
└── mysql/└── init.sql
创建 docker-compose.yml
version: '3.8'services:# 后端服务backend:build: ./backendports:- "3000:3000"environment:- DB_HOST=mysql- DB_USER=root- DB_PASSWORD=123456depends_on:- mysqlnetworks:- app-network# 数据库服务mysql:image: mysql:8.0environment:MYSQL_ROOT_PASSWORD: 123456ports:- "3306:3306"volumes:- ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql- mysql-data:/var/lib/mysqlnetworks:- app-network# 可选:前端 Nginxnginx:image: nginx:alpineports:- "80:80"volumes:- ./nginx.conf:/etc/nginx/nginx.confdepends_on:- backendnetworks:- app-network# 定义网络
networks:app-network:driver: bridge# 定义持久化卷
volumes:mysql-data:
我们逐项解释一下 docker-compose.yml:
字段 | 说明 |
---|---|
version: '3.8' | Compose 文件格式版本 |
services | 定义所有服务 |
build: ./backend | 从 Dockerfile 构建镜像 |
image: mysql:8.0 | 使用现成镜像 |
ports | 端口映射 |
environment | 环境变量 |
volumes | 挂载数据卷(持久化数据) |
depends_on | 声明启动顺序(先启动 mysql,再启动 backend) |
networks | 自动创建网络,服务间可通过服务名通信 |
服务之间通过服务名(如 mysql
)即可通信,无需手动配置 IP
启动整个应用
在 my-app
目录下运行:
docker compose up
- 第一次会自动构建
backend
镜像 - 所有服务按顺序启动
- 日志集中输出,便于调试
想后台运行?加 -d
:
docker compose up -d
常用命令
命令 | 说明 |
---|---|
docker compose up | 启动所有服务 |
docker compose up -d | 后台启动 |
docker compose down | 停止并删除容器 |
docker compose down -v | 删除容器和卷(慎用) |
docker compose logs | 查看日志 |
docker compose ps | 查看运行中的服务 |
docker compose build | 仅构建镜像 |
Docker Compose 的优点
优势 | 说明 |
---|---|
一键启动 | 一条命令启动所有服务 |
配置集中化 | 所有配置在 docker-compose.yml 中 |
服务互联 | 自动创建网络,服务名即主机名 |
依赖管理 | depends_on 控制启动顺序 |
开发利器 | 本地环境快速搭建,团队统一配置 |
最佳实践
- 为每个项目创建独立的
docker-compose.yml
- 使用
.env
文件管理环境变量
在MYSQL_ROOT_PASSWORD=123456 DB_PASSWORD=123456
docker-compose.yml
中引用:environment:MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
- 不同环境使用不同配置文件
docker-compose.yml
(通用)docker-compose.dev.yml
(开发)docker-compose.prod.yml
(生产)
总结
传统方式 | Docker Compose |
---|---|
多条 docker run 命令 | 一个 docker-compose.yml |
手动管理网络和卷 | 自动创建和连接 |
容易出错、难维护 | 配置即代码,易于共享和版本控制 |
Docker Compose 是管理多容器应用的必备工具,尤其适合本地开发、测试和微服务架构