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 子命令)编写。

相关推荐
叶子上的考拉1 小时前
解决远程连接服务器反应较慢问题
linux·运维·服务器
lazybird742 小时前
vmware装的ubuntu22.04, 在vmware中将磁盘由40G调整为50G后,ubuntu中还需要进行调整
linux·运维·服务器
IMPYLH2 小时前
Linux 的 stat 命令
linux·运维·服务器·bash
error:(2 小时前
Linux系统Claude Code安装指南:绕过官方curl 403错误的解决方案
linux·运维·服务器
大大大大晴天️2 小时前
Flink技术实践-监控指标异常诊断与运维
大数据·运维·flink
hj2862512 小时前
Linux基础知识day04
linux·运维·服务器
TechMasterPlus2 小时前
Claude Code Skill 编写与应用:从自动化流程到可复用能力
运维·人工智能·自动化
谷子熟了2 小时前
电商智能客服系统本地搭建
经验分享·docker·typescript·ai编程·llama
cooldream20092 小时前
Docker Desktop 安装与配置全流程指南(含 WSL2、汉化与问题排查)
运维·docker·容器