如何使用 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

七、总结

特性 描述
简化部署 一个文件描述全部服务
自动依赖 自动处理服务之间的启动顺序
统一网络 服务之间通过服务名通信
持久化支持 支持卷与数据库等服务结合
方便调试 使用 logsexec 方便调试

八、参考文章

Docker Compose 实战:如何使用 Docker Compose 进行多容器应用编排

posted @ 2025-04-25 10:55  槑孒  阅读(156)  评论(0)    收藏  举报