Skip to content

第四章 Docker Compose v1.0 ​

第一部分 简介 ​

一、什么是Docker Compose ​

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用程序的服务,然后使用一个命令就可以创建并启动所有服务。

二、核心概念 ​

  • 服务(Service):一个容器的配置,包括镜像、端口、环境变量等
  • 项目(Project):一组服务的集合,由一个 docker-compose.yml 文件定义
  • 网络(Network):服务之间通信的桥梁
  • 卷(Volume):数据持久化的存储

第二部分 安装与配置 ​

一、安装 ​

新版 Docker 已经将 Compose 作为 Docker CLI 插件提供,安装 Docker Engine 时可以一并安装。

bash
# 检查是否安装
docker compose version

二、配置文件结构 ​

yaml
version: "3.8"  # Docker Compose 文件版本

services:       # 定义服务
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    networks:
      - app-network
    depends_on:
      - app

  app:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
    networks:
      - app-network

networks:       # 定义网络
  app-network:
    driver: bridge

volumes:        # 定义数据卷
  db-data:

第三部分 常用命令 ​

一、服务管理 ​

bash
# 启动所有服务(后台运行)
docker compose up -d

# 停止并删除容器、网络
docker compose down

# 停止并删除容器、网络、数据卷
docker compose down -v

# 重启所有服务
docker compose restart

# 停止所有服务
docker compose stop

# 启动已停止的服务
docker compose start

二、查看状态 ​

bash
# 查看服务状态
docker compose ps

# 查看服务日志
docker compose logs -f

# 查看特定服务日志
docker compose logs -f <服务名>

# 查看资源使用情况
docker compose top

三、构建与拉取 ​

bash
# 构建或重新构建服务
docker compose build

# 拉取服务依赖的镜像
docker compose pull

# 强制重新创建容器
docker compose up -d --force-recreate

第四部分 配置详解 ​

一、镜像与构建 ​

yaml
services:
  # 使用现有镜像
  web:
    image: nginx:latest

  # 使用 Dockerfile 构建
  app:
    build:
      context: ./app        # 构建上下文路径
      dockerfile: Dockerfile # 指定 Dockerfile
      args:                  # 构建参数
        - NODE_ENV=production

二、端口映射 ​

yaml
services:
  web:
    ports:
      - "8080:80"           # 宿主机端口:容器端口
      - "443:443"
      - "127.0.0.1:3000:3000"  # 指定绑定地址

三、数据卷挂载 ​

yaml
services:
  db:
    volumes:
      - ./data:/var/lib/mysql        # 本地目录挂载
      - db-data:/var/lib/mysql        # 命名卷
      - ./config/my.cnf:/etc/mysql/my.cnf:ro  # 只读挂载

volumes:
  db-data:

四、环境变量 ​

yaml
services:
  app:
    # 方式一:直接定义
    environment:
      - NODE_ENV=production
      - DB_HOST=db
    
    # 方式二:使用 .env 文件
    env_file:
      - .env

五、依赖关系 ​

yaml
services:
  web:
    depends_on:
      - app
      - db
  
  app:
    depends_on:
      db:
        condition: service_healthy  # 等待 db 健康检查通过

六、网络配置 ​

yaml
services:
  web:
    networks:
      - frontend
      - backend
  
  db:
    networks:
      - backend

networks:
  frontend:
  backend:

第五部分 实战示例 ​

一、Web应用 + 数据库 ​

yaml
version: "3.8"

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./html:/usr/share/nginx/html
    depends_on:
      - app
    networks:
      - frontend

  app:
    build: ./app
    ports:
      - "3000:3000"
    environment:
      - DB_HOST=db
      - DB_USER=root
      - DB_PASSWORD=secret
      - DB_NAME=myapp
    depends_on:
      db:
        condition: service_healthy
    networks:
      - frontend
      - backend

  db:
    image: mysql:8
    environment:
      - MYSQL_ROOT_PASSWORD=secret
      - MYSQL_DATABASE=myapp
    volumes:
      - db-data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - backend

networks:
  frontend:
  backend:

volumes:
  db-data:

二、监控栈(Prometheus + Grafana) ​

yaml
version: "3.8"

services:
  prometheus:
    image: prom/prometheus:latest
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus-data:/prometheus
    networks:
      - monitoring

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=admin
    volumes:
      - grafana-data:/var/lib/grafana
    depends_on:
      - prometheus
    networks:
      - monitoring

  node-exporter:
    image: prom/node-exporter:latest
    ports:
      - "9100:9100"
    networks:
      - monitoring

networks:
  monitoring:

volumes:
  prometheus-data:
  grafana-data:

第六部分 常用技巧 ​

一、使用 .env 文件 ​

创建 .env 文件管理环境变量:

bash
# .env
MYSQL_ROOT_PASSWORD=secret
MYSQL_DATABASE=myapp
APP_PORT=3000

在 docker-compose.yaml 中使用:

yaml
services:
  db:
    image: mysql:8
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
  
  app:
    ports:
      - "${APP_PORT}:3000"

二、多环境配置 ​

bash
# 开发环境
docker compose -f docker-compose.yaml -f docker-compose.dev.yaml up -d

# 生产环境
docker compose -f docker-compose.yaml -f docker-compose.prod.yaml up -d

三、常用别名 ​

bash
# 在 ~/.bashrc 或 ~/.zshrc 中添加
alias dc='docker compose'
alias dcup='docker compose up -d'
alias dcdown='docker compose down'
alias dcps='docker compose ps'
alias dclogs='docker compose logs -f'