Docker Compose 完全指南:从入门到实践

Docker Compose 完全指南:从入门到实践

文章目录

当你的应用从单个容器扩展为多个相互协作的容器(Web 服务 + 数据库 + 缓存)时,手动输入一串串 docker run 命令会成为噩梦。Docker Compose 正是为解决这一痛点而生的多容器编排工具。

一、Docker Compose 是什么?

Docker Compose 是 Docker 官方推出的开源工具,核心使命是:用一个 YAML 配置文件定义多容器应用,然后一条命令完成所有容器的创建、启动、停止和删除

💡 类比理解

单独使用 docker run 部署多容器应用,就像手工挑选乐高零件一块块拼装;

Docker Compose 则是先画好"图纸",一按开关,所有积木自动组合成完整模型。

二、核心概念:服务、网络、卷

概念 说明 类比
服务 定义应用的每个组件(Web、数据库、缓存等),每个服务对应一个容器实例 乐高模型中的零件
网络 定义容器间的通信规则。Compose 为项目创建默认网络,容器通过服务名互相访问 零件间的连接件
管理数据持久化,容器删除后数据不丢失 存放成品的展示柜

通过这三个抽象,Compose 可以完整描述多容器应用的拓扑结构、通信方式数据存储策略

三、为什么需要 Docker Compose?

痛点 1:手动操作繁琐

一个典型 Web 应用(前端 + MySQL + Redis),不用 Compose 时你需要:

bash 复制代码
docker network create mynet
docker run -d --name mysql --net mynet -e MYSQL_ROOT_PASSWORD=secret mysql:8
docker run -d --name redis --net mynet redis:7
docker build -t myweb .
docker run -d --name web --net mynet -p 8080:80 myweb

而使用 Compose,所有操作简化为一条命令:

bash 复制代码
docker compose up -d

痛点 2:依赖顺序混乱

Web 容器必须在数据库启动后才能正常工作。Compose 通过 depends_on 处理启动顺序:

yaml 复制代码
services:
  web:
    image: nginx
    depends_on:
      - db
  db:
    image: postgres

痛点 3:环境不一致

开发、测试、生产环境配置经常"水土不服"。Compose 将配置固化为代码,只需调整少量环境变量即可保证一致性。

四、如何工作?

Docker Compose 的工作流程分为三步:

  1. 定义 :编写 compose.yaml,声明所有服务、网络、卷。
  2. 构建/拉取 :执行 docker compose up,按需构建或拉取镜像。
  3. 启动 :根据 depends_on 顺序创建并启动容器,自动加入共享网络。

底层机制亮点

  • 网络自动化:每个项目生成独立的默认网络,服务名自动成为 DNS 可解析的地址。
  • 配置合并:支持多个 Compose 文件叠加,后面文件的配置覆盖前面文件。
  • 声明式模型 :遵循 Compose 规范,可被不同工具(如 Docker Compose、Podman)解析执行。

五、核心配置文件:compose.yaml

一个典型文件结构如下:

yaml 复制代码
version: "3.8"

services:
  web:
    image: nginx:latest
    container_name: my_web
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html
    depends_on:
      - db

  db:
    image: postgres:15
    environment:
      POSTGRES_PASSWORD: secret
    volumes:
      - pgdata:/var/lib/postgresql/data

volumes:
  pgdata:

networks:
  my_network:
    driver: bridge
字段 说明
version Compose 文件版本(3.x 最常用)
services 所有容器的声明,包含镜像、端口、卷等
volumes 持久化数据卷的声明
networks 自定义网络(可选,默认自动创建)

📁 文件名说明 :官方推荐使用 compose.yamlcompose.yml 亦可),但旧项目中的 docker-compose.yaml 依然兼容。

六、常用命令速查表

命令 说明
docker compose up -d 后台启动所有服务
docker compose down 停止并删除容器、网络(卷保留)
docker compose ps 列出服务状态
docker compose logs -f 实时查看所有服务日志
docker compose stop 停止服务(容器保留)
docker compose start 启动已存在的服务容器
docker compose config 验证并展示最终配置
docker compose up --build 重新构建镜像后启动
docker compose exec <service> bash 进入指定服务的容器内执行命令

⚠️ 注意 :执行命令时,当前目录需包含 compose.yaml,或通过 -f 指定路径。

七、典型使用场景

  1. 本地开发环境

    在笔记本上运行完整微服务栈(前端+后端+数据库+缓存),配置纳入版本控制,团队内一键拉起环境。

  2. CI/CD 自动化测试

    集成测试时用 Compose 拉起数据库、消息队列等依赖,测试完毕后自动销毁。

  3. 小型生产部署

    对于单台服务器、服务数量 2~6 个、流量稳定的应用,Compose 足够胜任生产环境。

  4. 快速原型验证

    几分钟内搭建完整架构,验证技术方案可行性。

八、Docker Compose vs. Kubernetes

维度 Docker Compose Kubernetes
学习曲线 低,几小时上手 高,需理解 Pod、Service 等概念
部署目标 单台主机 集群(多台主机)
自动扩缩容 不支持 原生支持(HPA)
高可用 非原生 原生(多副本 + 自愈)
滚动更新 不支持 原生(零停机)
服务发现 简单 DNS(服务名) DNS + 标签,功能更强
适用场景 开发、测试、单机生产 大规模生产环境

如何选择?

  • 选 Docker Compose:你习惯单机端到端掌控,服务数量少且稳定,不需要自动扩缩容和滚动更新。
  • 考虑 Kubernetes:你需要多节点冗余、自动扩缩容、零停机更新,或者服务规模已超过单机承载能力。

官方目前推荐在开发测试阶段继续使用 Compose,生产环境则视规模选择 Swarm 或 K8s。

九、实用技巧与最佳实践

1. 多环境配置隔离

使用 docker-compose.override.yml 自动覆盖开发环境配置(该文件会被 up 默认加载)。或者显式指定多个文件:

bash 复制代码
docker compose -f compose.base.yml -f compose.prod.yml up

2. 使用 .env 管理敏感信息

在项目根目录创建 .env

复制代码
MYSQL_PASSWORD=SuperSecret123

在 Compose 文件中引用:

yaml 复制代码
services:
  db:
    environment:
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}

3. 健康检查与启动顺序

定义服务的 healthcheck,然后在 depends_on 中等待健康状态:

yaml 复制代码
services:
  db:
    image: postgres
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      retries: 5
  web:
    depends_on:
      db:
        condition: service_healthy

4. 资源限制

防止某个容器耗尽宿主机资源:

yaml 复制代码
services:
  web:
    deploy:
      resources:
        limits:
          cpus: '0.5'
          memory: 512M

注意deploy 字段在 docker compose up 中有效,但在 Swarm 模式下行为略有不同。

5. 调试时进入容器

bash 复制代码
docker compose exec web bash

十、总结

Docker Compose 的本质是将多容器应用的部署说明书用 YAML 写出来,让复杂的容器编排变得像填表格一样简单。它不是为超大规模集群而生的工具,但在开发、测试、原型验证以及小型生产场景中,它依然是当前最轻量、最直接的选择。

如果你正被手动管理多个容器的琐碎流程困扰,不妨花 15 分钟写一个 compose.yaml,体验一下"一键启动、一键清理"带来的工作流升级。


本文参考 Docker 官方文档及社区最佳实践,所有命令基于 Docker Compose V2(docker compose 子命令)编写。

相关推荐
敖行客 Allthinker5 小时前
Parallels Ubuntu虚拟机项目如何让手机访问?完整解决方案
linux·运维·ubuntu
BullSmall6 小时前
Anolis OS 8.10 完整安装 Docker CE(生产可用,解决 podman 冲突)
docker·容器·podman
元Y亨H7 小时前
生产环境监控与故障应急处理(5-5-5 标准)指南
运维
观山岳五楼8 小时前
Ubuntu 24 怎么使用Ubuntu 20 的镜像源
linux·运维·ubuntu
寒晓星8 小时前
[linux]线程及多线程
linux·运维
慧一居士9 小时前
Linux如何设置固定的静态ip
运维
梦梦代码精10 小时前
开源AI应用平台BuildingAI解析:插件化架构、应用市场与热门案例
人工智能·机器学习·docker·开源
国服第二切图仔10 小时前
13其他工具 - Skill/LSP/Sleep等
linux·运维·里氏替换原则
暴力求解11 小时前
Linux ---线程控制(二)
linux·运维·服务器·操作系统
梦痕长情12 小时前
等保三级三权账户
linux·运维·服务器