Docker Compose 的详细使用总结、常用命令及配置示例

以下是 Docker Compose 的详细使用总结、常用命令及配置示例,帮助您快速掌握这一容器编排工具。


一、Docker Compose 核心概念

  1. 定位:用于定义和管理多容器 Docker 应用,通过 YAML 文件配置服务、网络、卷等资源。
  2. 核心概念
    • 服务 (Service):一个容器的定义(镜像、端口、环境变量等)。
    • 项目 (Project):一组关联服务的集合,默认以当前目录名命名。
  3. 核心文件docker-compose.yml(或通过 -f 指定其他文件)。

二、Docker Compose 常用命令

1. 基础操作
命令 作用 常用参数
docker compose up 创建并启动服务 -d(后台运行)、--build(强制重建镜像)
docker compose down 停止并删除所有资源 -v(同时删除卷)、--rmi all(删除镜像)
docker compose build 构建服务镜像 --no-cache(禁用缓存)
docker compose logs 查看日志 -f(实时跟踪)、service_name(过滤服务)
2. 管理服务
命令 作用
docker compose ps 查看容器状态
docker compose start 启动已停止的服务
docker compose stop 停止运行中的服务
docker compose restart 重启服务
docker compose exec <service> <cmd> 在容器内执行命令(如 exec app sh
3. 调试与扩展
命令 作用
docker compose config 验证配置文件语法
docker compose top 显示容器内进程
docker compose pull 拉取服务的最新镜像
docker compose scale web=3 扩展服务实例数量(需删除 depends_on

三、docker-compose.yml 配置详解

1. 基础结构
yaml 复制代码
version: '3.8'  # 推荐使用 3.8+ 版本
services:
  service1:  # 服务名称
    image: nginx:alpine  # 使用现成镜像
    # 其他配置...
  service2:
    build: .  # 基于 Dockerfile 构建镜像
    # 其他配置...
volumes:  # 声明卷
  my_volume:
networks:  # 声明网络
  my_network:
2. 完整配置示例:Web + MySQL + Redis
yaml 复制代码
version: '3.8'

services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app
      - static_volume:/app/static
    environment:
      - DEBUG=True
    env_file:
      - .env
    depends_on:
      - db
      - redis

  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: app_db
    volumes:
      - mysql_data:/var/lib/mysql
    healthcheck:  # 健康检查
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 5s
      timeout: 3s
      retries: 5

  redis:
    image: redis:alpine
    volumes:
      - redis_data:/data
    command: redis-server --requirepass yourpassword

volumes:
  static_volume:
  mysql_data:
  redis_data:

四、关键配置项说明

1. 服务配置
  • build :构建镜像(优先于 image

    yaml 复制代码
    build:
      context: ./dir  # Dockerfile 所在目录
      dockerfile: Dockerfile.prod
      args:  # 构建参数
        APP_VERSION: 1.0
  • ports :端口映射

    yaml 复制代码
    ports:
      - "80:80"         # 宿主机:容器
      - "443:443/tcp"   # 指定协议
      - "3000-3005:3000-3005"  # 范围映射
  • volumes :数据卷

    yaml 复制代码
    volumes:
      - /host/path:/container/path  # 绑定挂载
      - named_volume:/container/path  # 命名卷
      - config_file.conf:/app/config.conf:ro  # 只读挂载
2. 环境管理
  • environment :直接定义变量

    yaml 复制代码
    environment:
      - DB_HOST=db
      - DB_PORT=3306
  • env_file :从文件加载变量

    yaml 复制代码
    env_file:
      - .env
      - dev.env
3. 依赖与健康检查
  • depends_on :控制启动顺序

    yaml 复制代码
    depends_on:
      - db
      - redis
  • healthcheck :定义健康检查

    yaml 复制代码
    healthcheck:
      test: ["CMD-SHELL", "curl -f http://localhost/health || exit 1"]
      interval: 30s
      timeout: 10s
      retries: 3
4. 网络配置
yaml 复制代码
services:
  frontend:
    networks:
      - frontend
  backend:
    networks:
      - frontend
      - backend

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

五、进阶使用技巧

1. 多环境配置
  • 开发环境:挂载代码目录,启用调试模式

  • 生产环境 :使用构建好的镜像,限制资源

    bash 复制代码
    # 合并多个配置文件
    docker compose -f docker-compose.yml -f docker-compose.prod.yml up
2. 资源限制
yaml 复制代码
deploy:  # 需 Swarm 模式
  resources:
    limits:
      cpus: '0.5'
      memory: 512M
    reservations:
      memory: 256M
3. 扩展服务
bash 复制代码
# 启动 3 个 web 实例
docker compose up -d --scale web=3

六、常见问题与解决

  1. 容器启动顺序问题

    • 使用 depends_on + healthcheck 确保依赖服务真正可用。
  2. 端口冲突

    • 检查宿主机端口占用,或让 Docker 自动分配端口:

      yaml 复制代码
      ports:
        - "3000"  # 容器 3000 端口映射到宿主机随机端口
  3. 数据持久化

    • 始终使用命名卷(named volume)保存数据库等关键数据。

通过合理配置 docker-compose.yml,您可以快速部署复杂的多容器应用。建议结合具体需求逐步完善配置,并善用 docker compose config 验证文件语法。

相关推荐
佩奇的技术笔记2 小时前
Java学习手册:单体架构到微服务演进
java·微服务·架构
小猪写代码2 小时前
分布式处理架构
分布式·架构
GUIQU.2 小时前
【Vue】微前端架构与Vue(qiankun、Micro-App)
前端·vue.js·架构
AnnyYoung3 小时前
从Dockerfile 构建docker镜像——保姆级教程
docker·容器·eureka
何怀逸3 小时前
安装 Docker
运维·docker·容器
杰克逊的日记3 小时前
运维体系架构规划
运维·架构
云攀登者-望正茂3 小时前
通过Kubernetes 外部 DNS控制器来自动管理Azure DNS 和 AKS
容器·kubernetes·azure
裁二尺秋风3 小时前
k8s(11) — 探针和钩子
java·容器·kubernetes
Microsoft Word5 小时前
Hadoop架构再探讨
大数据·hadoop·架构