一文读懂 Docker Compose(白话版)

发布于:2025-06-10 ⋅ 阅读:(26) ⋅ 点赞:(0)

一、Docker Compose 是个啥?

想象你开餐厅:

  • 单容器 = 一个厨师 👨🍳
  • Docker Compose = 整个后厨团队 👨🍳👩🍳🧑🍳 + 菜单 + 工作流程
    用个菜单文件(docker-compose.yml)就能一键启动整套服务!

二、它能干啥?(核心作用)

场景 传统方式 Compose 方式
启动 web服务+数据库 手动起2个容器+配网络 一句命令搞定
团队共享环境 每人自己配环境 共享配置文件
管理关联服务 手工记录启动顺序 自动按依赖启动
模拟生产环境 本地和生产环境差异大 本地/生产配置一致

三、装它!3步搞定

# 1. 先装好 Docker(略过)
# 2. Linux/macOS 一键安装
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 3. 给执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 检查版本(装成功会显示版本号)
docker-compose --version

💡 Windows 用户:安装 Docker Desktop 时默认包含 Compose


四、常用命令速查(每天用的)

命令 干啥用的 示例
up 启动所有服务 docker-compose up -d(后台运行)
down 关闭并清理 docker-compose down -v(连数据卷都删)
ps 查看运行中的服务 docker-compose ps
logs 看实时日志 docker-compose logs -f web(只看web服务)
build 重新构建镜像 docker-compose build(改过Dockerfile后用)
exec 进容器内部 docker-compose exec db bash(操作数据库容器)
restart 重启服务 docker-compose restart web
config 检查配置文件 docker-compose config(验证.yml是否正确)
常用命令示例:

以下是基于 Docker Compose v3 语法规范的常用命令详细说明和具体示例:

# docker-compose.yml v3 示例
version: '3.8'
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    networks:
      - frontend

  api:
    build: ./api
    ports:
      - "5000:5000"
    environment:
      - DB_HOST=db
    networks:
      - backend
      - frontend

  db:
    image: postgres:13
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: example
    networks:
      - backend

volumes:
  db-data:

networks:
  frontend:
  backend:
📋 核心操作命令
启动服务
docker compose up -d
  • 启动所有服务(后台模式)
  • 自动创建网络、卷并构建自定义镜像
  • 服务启动顺序:遵循 depends_on 配置的依赖关系
停止并清理
docker compose down --volumes --remove-orphans
  • --volumes: 删除声明在volumes部分的数据卷
  • --remove-orphans: 删除未在配置文件中定义的服务容器
  • --timeout 5: 设置停止容器的超时时间(默认10秒)
⚙️ 服务管理
查看运行状态
docker compose ps

示例输出:

NAME                SERVICE             STATUS              PORTS
project-web-1       web                 running             0.0.0.0:8080->80/tcp
project-api-1       api                 running             0.0.0.0:5000->5000/tcp
project-db-1        db                  running             5432/tcp
服务启停控制
# 启动单个服务
docker compose start db

# 停止服务(保留容器)
docker compose stop api

# 重启服务(保持依赖顺序)
docker compose restart web

# 强制重启(忽略依赖检查)
docker compose up -d --force-recreate api
🐞 调试与维护
实时日志查看
docker compose logs -f --tail=50 web
  • -f:实时跟踪日志输出
  • --tail=50:显示最后50行日志
  • 查看所有服务:docker compose logs -f
容器内执行命令
# 在db容器中执行bash
docker compose exec db bash

# 在web容器中执行命令
docker compose exec web nginx -t

# 以特定用户身份执行
docker compose exec -u root db psql -U postgres
服务检查与诊断
# 检查端口映射
docker compose port web 80

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

# 显示服务进程树
docker compose events
🔧 构建与配置
镜像构建管理
# 构建或重新构建服务镜像
docker compose build --no-cache --pull api

# 拉取服务最新镜像
docker compose pull --include-deps db
  • --no-cache:禁用构建缓存
  • --pull:始终尝试拉取最新基础镜像
  • --include-deps:同时更新依赖服务
配置验证
# 验证配置文件语法
docker compose config

# 显示最终服务列表
docker compose config --services

# 显示所有使用的镜像
docker compose images

# 以JSON格式输出配置
docker compose config --format json
🧩 高级操作技巧
跨文件项目部署
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
  • 支持多文件配置叠加(后覆盖前)
  • 常用模式:基础配置+环境覆盖配置
命名项目管理
docker compose -p ecommerce up -d
  • -p:指定项目名称(避免名称冲突)
  • 所有资源按projectname_servicename格式命名
服务伸缩
docker compose up -d --scale web=3 api=2
  • 为无状态服务启动多个副本
  • 需要移除容器的端口映射冲突
环境变量管理
# 使用.env文件
docker compose --env-file .env.prod up -d

# 覆盖环境变量
docker compose run -e DEBUG=1 api python app.py
📌 命令选项速查表
选项 说明 示例
-d 后台运行模式 up -d
-f 指定Compose文件 -f production.yml
-p 项目名称 -p myapp
-v 删除关联卷 down -v
--no-deps 不启动依赖服务 up --no-deps web
--remove-orphans 删除孤儿容器 down --remove-orphans
--build 强制重新构建镜像 up --build
--no-start 创建但不启动容器 create --no-start

提示:使用 docker compose help [command] 获取具体命令的详细帮助信息,如 docker compose help up

开始
docker compose up
创建网络
创建卷
构建镜像
启动db服务
启动api服务
启动web服务
运行完成

这些命令基于 Docker Compose v3 语法设计,完整覆盖了开发、测试和部署场景。在实际使用中,应结合 .env 环境变量文件和分环境配置文件,实现开发、测试和生产环境的配置管理。


五、使用前后对比(真实体验)

使用前:
在这里插入图片描述

使用后:
在这里插入图片描述


六、优缺点大实话

👍 优点:

  • 开发效率翻倍:新同事5分钟搭好环境
  • 配置即文档:.yml文件就是环境说明书
  • 隔离不串味:每个项目独立网络(像餐厅后厨分中西厨)
  • 版本可控:配置文件塞进Git,随时回滚

👎 缺点:

  • 单机限制:只能在一台机器玩(想集群?得升级K8s)
  • 生产功能弱:没有自动重启、健康检查等高级功能
  • 安全要手动:默认没限制权限(需自己加安全配置)

七、生产环境防坑指南

  1. 别用 latest 标签

    # 危险写法 ❌
    image: mysql:latest 
    
    # 安全写法 ✅
    image: mysql:8.0.33
    
  2. 必须设资源限制(防容器吃光内存)

    services:
      web:
        deploy:
          resources:
            limits:
              cpus: '0.5'
              memory: 512M
    
  3. 敏感信息别硬编码

    # 创建 .env 文件(别提交到Git!)
    DB_PASSWORD=mysecretpass
    
    # docker-compose.yml 引用
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
    
  4. 健康检查不能少

    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 30s
      timeout: 5s
      retries: 3
    
  5. 日志要转存

    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
    

八、什么情况该用它?

场景 推荐指数 原因
本地开发 ⭐⭐⭐⭐⭐ 秒建环境,告别"我电脑正常"
测试环境 ⭐⭐⭐⭐ 快速部署测试套件
小微项目生产 ⭐⭐⭐ 简单应用直接上线
中大型项目生产 功能不够,上K8s!

💡 经验之谈

  • 开发测试闭眼用,效率提升肉眼可见
  • 生产环境若要用,记住三点:
      1. 版本锁死(不用latest)
      2. 资源限制(CPU/内存设上限)
      3. 日志监控(日志存文件+健康检查)