如何使用 Docker Compose 进行多容器应用编排
一、Docker Compose 是什么?
Docker Compose 是用于 定义和管理多容器 Docker 应用 的工具。你可以用一个 docker-compose.yml 文件来配置应用的所有服务,然后使用一条命令 docker-compose up 启动它们。
二、基本命令速查表
| 命令 | 说明 |
|---|---|
docker-compose up |
启动所有服务 |
docker-compose up -d |
后台运行所有服务 |
docker-compose down |
停止并移除容器、网络等资源 |
docker-compose build |
构建服务镜像 |
docker-compose logs -f |
查看所有容器的日志(实时) |
docker-compose ps |
查看运行中的容器 |
docker-compose exec <svc> |
进入服务容器内部 |
三、docker-compose.yml 文件结构
version: '3.8' # Compose 文件语法版本
services: # 所有服务定义
service-name:
image: 镜像名 或 build: 路径
container_name: 自定义容器名
ports:
- "宿主端口:容器端口"
volumes:
- "主机路径:容器路径"
environment:
- "变量名=值"
depends_on:
- 另一个服务名
networks:
- 网络名
volumes: # 定义命名卷(持久化数据)
卷名:
networks: # 自定义网络
网络名:
四、常用字段详解
| 字段 | 说明 |
|---|---|
image |
使用已有镜像,如 nginx:alpine |
build |
指定 Dockerfile 所在目录,自动构建镜像 |
ports |
端口映射,如 3000:3000 |
volumes |
卷挂载,用于持久化或代码同步 |
environment |
设置环境变量 |
depends_on |
指定依赖服务的启动顺序 |
networks |
指定连接到的网络 |
五、典型应用场景示例(前后端 + 数据库 + 缓存)
🧩 目录结构
myapp/
├── docker-compose.yml
├── frontend/
│ ├── Dockerfile
├── backend/
│ ├── Dockerfile
🧾 docker-compose.yml 示例
version: '3.8'
services:
frontend:
build: ./frontend
ports:
- "8080:80"
depends_on:
- backend
networks:
- app-net
backend:
build: ./backend
ports:
- "5000:5000"
environment:
- DB_HOST=db
- REDIS_HOST=redis
depends_on:
- db
- redis
networks:
- app-net
db:
image: postgres:14
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
networks:
- app-net
redis:
image: redis:6
networks:
- app-net
volumes:
pgdata:
networks:
app-net:
✅ 后端 Node.js 示例代码(backend/index.js)
const express = require('express');
const { Pool } = require('pg');
const Redis = require('ioredis');
const app = express();
const port = 5000;
const db = new Pool({ host: process.env.DB_HOST, user: 'user', password: 'pass', database: 'mydb' });
const redis = new Redis({ host: process.env.REDIS_HOST });
app.get('/', async (req, res) => {
const time = await db.query('SELECT NOW()');
await redis.set('key', 'value');
const cache = await redis.get('key');
res.send(`Time: ${time.rows[0].now}, Redis: ${cache}`);
});
app.listen(port, () => console.log(`Server running on port ${port}`));
🌐 前端 Dockerfile(Vue/Vite)
FROM node:18 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
六、Compose 的高级用法
1. 使用 .env 文件
DB_HOST=db
REDIS_HOST=redis
Compose 文件中:
environment:
- DB_HOST=${DB_HOST}
- REDIS_HOST=${REDIS_HOST}
2. 多环境部署(开发、测试、生产)
可以使用多个 Compose 文件叠加运行:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
3. 常见调试技巧
- 进入容器查看日志或执行命令:
docker-compose exec backend bash
docker-compose logs backend
- 查看网络状态:
docker network ls
docker network inspect myapp_app-net
七、总结
| 特性 | 描述 |
|---|---|
| 简化部署 | 一个文件描述全部服务 |
| 自动依赖 | 自动处理服务之间的启动顺序 |
| 统一网络 | 服务之间通过服务名通信 |
| 持久化支持 | 支持卷与数据库等服务结合 |
| 方便调试 | 使用 logs、exec 方便调试 |

浙公网安备 33010602011771号