一文读懂 Docker Compose(白话版)
一、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:latestports:- "8080:80"volumes:- ./html:/usr/share/nginx/htmlnetworks:- frontendapi:build: ./apiports:- "5000:5000"environment:- DB_HOST=dbnetworks:- backend- frontenddb:image: postgres:13volumes:- db-data:/var/lib/postgresql/dataenvironment:POSTGRES_PASSWORD: examplenetworks:- backendvolumes: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 v3 语法设计,完整覆盖了开发、测试和部署场景。在实际使用中,应结合 .env
环境变量文件和分环境配置文件,实现开发、测试和生产环境的配置管理。
五、使用前后对比(真实体验)
使用前:
使用后:
六、优缺点大实话
👍 优点:
- 开发效率翻倍:新同事5分钟搭好环境
- 配置即文档:
.yml
文件就是环境说明书 - 隔离不串味:每个项目独立网络(像餐厅后厨分中西厨)
- 版本可控:配置文件塞进Git,随时回滚
👎 缺点:
- 单机限制:只能在一台机器玩(想集群?得升级K8s)
- 生产功能弱:没有自动重启、健康检查等高级功能
- 安全要手动:默认没限制权限(需自己加安全配置)
七、生产环境防坑指南
-
别用 latest 标签
# 危险写法 ❌ image: mysql:latest # 安全写法 ✅ image: mysql:8.0.33
-
必须设资源限制(防容器吃光内存)
services:web:deploy:resources:limits:cpus: '0.5'memory: 512M
-
敏感信息别硬编码
# 创建 .env 文件(别提交到Git!) DB_PASSWORD=mysecretpass
# docker-compose.yml 引用 environment:MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
-
健康检查不能少
healthcheck:test: ["CMD", "curl", "-f", "http://localhost:8080/health"]interval: 30stimeout: 5sretries: 3
-
日志要转存
logging:driver: "json-file"options:max-size: "10m"max-file: "3"
八、什么情况该用它?
场景 | 推荐指数 | 原因 |
---|---|---|
本地开发 | ⭐⭐⭐⭐⭐ | 秒建环境,告别"我电脑正常" |
测试环境 | ⭐⭐⭐⭐ | 快速部署测试套件 |
小微项目生产 | ⭐⭐⭐ | 简单应用直接上线 |
中大型项目生产 | ⭐ | 功能不够,上K8s! |
💡 经验之谈:
- 开发测试闭眼用,效率提升肉眼可见
- 生产环境若要用,记住三点:
1. 版本锁死(不用latest)
2. 资源限制(CPU/内存设上限)
3. 日志监控(日志存文件+健康检查)