
目录
什么是Docker Compose?
Docker Compose是一个用于定义和运行多容器Docker应用的工具。无需为每个容器输入冗长的docker run命令,只需编写一个docker-compose.yml文件,然后运行docker compose up即可启动所有服务。
例如,一个典型的Web应用通常由三个部分组成:Web服务器、应用服务器和数据库。Docker Compose可以让这三个服务协同工作,无需手动为每个容器配置网络。
💡 Docker Compose是Docker生态系统的一部分。从Docker v20.10开始,Compose v2已作为标准插件内置,无需单独安装。
Docker与Docker Compose的区别
初学者常常混淆这两者。下表进行了清晰对比:
| 功能 | Docker | Docker Compose |
|---|---|---|
| 管理范围 | 单个容器 | 同时管理多个容器 |
| 主要命令 | docker run | docker compose up |
| 配置文件 | Dockerfile | docker-compose.yml |
| 网络配置 | 手动指定参数 | 自动创建网络 |
| 适用场景 | 单一服务、CI/CD | 多服务应用、开发/生产 |
| 依赖顺序 | 不支持 | 通过depends_on支持 |
在Ubuntu VPS上安装Docker + Compose
适用于运行Ubuntu 22.04或24.04的VPS,按以下步骤操作:
第一步:更新软件包并安装依赖
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg lsb-release
第二步:添加Docker GPG密钥和仓库
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
第三步:安装Docker Engine + Compose插件
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin
第四步:将用户添加到docker组
sudo usermod -aG docker $USER
newgrp docker
验证安装
docker --version
docker compose version
⚠️ 如果找不到docker compose(v2),请确认已安装docker-compose-plugin——不要与已废弃的docker-compose(v1,带连字符)混淆。
docker-compose.yml文件结构
docker-compose.yml使用YAML格式,主要包含三个部分:
services: # 定义每个容器
web:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
depends_on:
- app
app:
build: .
environment:
- DB_HOST=db
networks:
- backend
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: secret
volumes:
- db_data:/var/lib/mysql
networks:
- backend
volumes: # 定义命名卷
db_data:
networks: # 定义自定义网络
backend:
| 键名 | 说明 |
|---|---|
services | 所有容器的集合 |
image | 使用的Docker镜像 |
build | 从Dockerfile构建 |
ports | 映射宿主机:容器端口 |
volumes | 挂载文件/目录 |
environment | 设置环境变量 |
depends_on | 指定启动依赖顺序 |
networks | 分配到指定网络 |
restart | 自动重启策略 |
示例:WordPress + MySQL
这是最常见的Docker Compose使用场景之一——运行WordPress和MySQL数据库:
version: '3.9'
services:
wordpress:
image: wordpress:latest
ports:
- "8080:80"
restart: always
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_DB_NAME: wordpress
volumes:
- wp_data:/var/www/html
depends_on:
- db
db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: wordpress
MYSQL_USER: wpuser
MYSQL_PASSWORD: ${DB_PASSWORD}
volumes:
- db_data:/var/lib/mysql
volumes:
wp_data:
db_data:
保存为docker-compose.yml,然后运行:
docker compose up -d
docker compose ps # 查看状态
常用命令
| 命令 | 说明 |
|---|---|
docker compose up -d | 后台启动所有服务 |
docker compose down | 停止并删除容器 |
docker compose down -v | 停止并删除容器+卷 |
docker compose ps | 查看所有服务状态 |
docker compose logs -f | 实时查看日志 |
docker compose logs web | 查看"web"服务的日志 |
docker compose exec app bash | 进入容器Shell |
docker compose restart db | 仅重启"db"服务 |
docker compose pull | 拉取最新镜像 |
docker compose build --no-cache | 重新构建镜像 |
网络与数据卷
网络
运行docker compose up时,Docker会自动创建一个名为<文件夹名>_default的默认网络。所有服务都可以通过服务名称互相通信——例如名为db的服务,可以在同一栈的其他容器中通过主机名db访问。
数据卷类型
| 类型 | 示例 | 适用场景 |
|---|---|---|
| 命名卷 | db_data:/var/lib/mysql | 数据库、持久化数据 |
| 绑定挂载 | ./src:/app/src | 开发环境、热重载 |
| 匿名卷 | /tmp/cache | 临时数据 |
使用.env管理环境变量
敏感信息(如密码)应存储在单独的.env文件中:
# .env
DB_PASSWORD=myS3cur3P@ss
MYSQL_ROOT_PASSWORD=r00tS3cr3t
Docker Compose会自动加载同目录下的.env文件,YAML中的${DB_PASSWORD}会被替换为实际值。
🔒 提交代码前务必将.env添加到.gitignore,防止凭据泄露。
生产环境最佳实践
- 添加
restart: always到关键服务,确保VPS重启后容器自动恢复。 - 限制资源使用
deploy.resources.limits,防止某个容器占用过多CPU或内存。 - 使用Nginx反向代理处理SSL终止和路由转发。
- 配置健康检查
healthcheck:,确保服务真正就绪后再启动依赖服务。 - 定期备份数据卷——命名卷数据存储在
/var/lib/docker/volumes/。 - 使用覆盖文件——
docker-compose.override.yml用于开发环境特有配置,保持基础文件适用于生产。
📌 AsiaGB VPS配备SSD存储,正常运行时间99%,适合运行Docker Compose应用。可选泰国(曼谷)或新加坡VPS,详见 asiagb.com/vps.html
常见问题
docker run管理单个容器。Docker Compose通过单个YAML文件定义和运行多容器应用,使服务编排更加简单便捷。docker-compose命令(基于Python,已废弃)。Compose v2是Docker CLI插件,使用docker compose命令(无连字符),性能更好,支持最新的Compose规范。docker compose up时,卷会重新挂载,数据库数据保持不变。只有docker compose down -v才会删除卷数据。-d表示后台(分离)模式,容器在后台运行,不在终端输出日志,终端可以继续正常使用。总结
Docker Compose是开发者在VPS上有序运行多容器应用的必备工具。主要优势包括:
- 用一个YAML文件定义整个应用栈——便于团队协作
- 自动创建网络——服务间通过名称直接通信
- 数据卷管理简便——重启后数据持久保留
- 一条命令
docker compose up -d启动所有服务
AsiaGB VPS配备SSD存储和99%正常运行时间,是从开发到生产部署Docker Compose应用的理想选择。