Docker 简介

Docker Compose 多容器管理

学会用 Docker Compose 通过一个配置文件编排和管理多个容器。

🎯 引言

学完这篇文章,你能说清楚为什么需要 Docker Compose,并学会编写 docker-compose.yml 文件,用一条命令启动、停止一整套容器。这是 Docker 课程的收尾篇,学完后续 MySQL、MongoDB 课程的环境搭建对你来说都是顺手的事。


🧱 为什么需要 Docker Compose

到目前为止,我们每启动一个容器都要敲一条长长的 docker run 命令。回忆一下 MySQL 那条:

docker run --name mysql8 -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -v mysql-data:/var/lib/mysql -d mysql:8

一个容器还好,但真实项目往往是一套组合:应用容器 + MySQL 容器 + MongoDB 容器。每个容器都有一条长命令,问题就来了:

  • 命令太长,记在本子里容易丢、容易抄错。
  • 每换一台机器,要翻出所有命令挨个执行,顺序还不能乱。
  • 团队协作时,没法保证大家启动的环境一致。

Docker Compose 就是用来解决「多容器编排」问题的工具:把所有容器的配置写进一个文件,之后一条命令就能启动或停掉整套环境。


🧱 什么是 Docker Compose

Docker Compose 的核心是一个 YAML 配置文件,习惯命名为 docker-compose.yml。可以拿装修清单类比:

  • 以前你口头告诉师傅:这里刷漆、那里铺地板,说漏了就麻烦了。
  • 现在你把所有要求写在一张清单上,师傅照着单子干活,谁来干结果都一样。

docker-compose.yml 就是这张清单:项目里需要哪些容器(Compose 里叫服务,Service)、每个服务用什么镜像、映射什么端口、挂载什么卷,全部白纸黑字写清楚。这个文件可以直接提交到 Git 仓库,团队每个人拿到的环境完全一致。

新版 Docker Desktop 已内置 Compose,命令是 docker compose(中间是空格,没有横杠)。老的 docker-compose 是独立安装的旧版,看到老教程里的写法知道是一回事即可。

🛠 编写 docker-compose.yml

我们把前面用过的 MySQL 容器改造成 Compose 管理。新建一个目录,创建 docker-compose.yml

docker-compose.yml
services:
    mysql:
        image: mysql:8
        container_name: mysql8
        ports:
            - '3306:3306'
        environment:
            - MYSQL_ROOT_PASSWORD=123456
        volumes:
            - mysql-data:/var/lib/mysql

volumes:
    mysql-data:

和之前的 docker run 命令一一对应,应该能看懂个大概:

  • services:下面列出项目需要的所有服务,这里只有一个 mysql
  • image: mysql:8:对应命令最后的镜像名。
  • container_name: mysql8:对应 --name
  • ports:对应 -p,注意 YAML 里带冒号的端口映射要加引号。
  • environment:对应 -e,设置环境变量。
  • volumes:对应 -v,把命名数据卷 mysql-data 挂载到容器的数据目录。
  • 文件末尾的 volumes::声明项目用到的命名数据卷,Compose 会自动创建。

如果还需要 MongoDB,在 services 下再加一段就行,一个文件管全部。


🛠 常用命令

docker-compose.yml 所在目录执行命令。

启动所有服务

docker compose up -d

-d 表示后台运行。第一次执行会自动下载镜像、创建数据卷、启动容器,一条命令全部搞定。

查看运行状态

docker compose ps

停止并清理

docker compose down

这条命令会停止并删除这套环境的所有容器,但命名数据卷会保留,数据不会丢。下次 docker compose up -d 启动,数据原样还在。

查看日志

docker compose logs

加上服务名可以看单个服务的日志,比如 docker compose logs mysql


💡 为后续课程做准备

到这里,Docker 课程的核心内容就学完了。后续课程里你会大量用到这些知识:

  • MySQL 课程:用 docker run 启动 MySQL 容器,用 docker exec 进入客户端。
  • MongoDB 课程:同样的方式启动 MongoDB 容器,操作思路完全一致。

以后在别的课程里看到 docker rundocker exec 这样的命令,你都能看懂每个参数在做什么,也能自己动手调整端口、密码和数据卷了。


🧾 小节总结

  • 多容器项目用一条条 docker run 管理容易出错,Docker Compose 把配置固化到文件里,解决编排问题。
  • docker-compose.yml 是核心配置文件,服务、镜像、端口、环境变量、数据卷都写在里面,可以提交到 Git 共享。
  • docker compose up -d 启动整套环境,docker compose ps 查看状态,docker compose down 停止清理,docker compose logs 看日志。
  • docker compose down 会删除容器但保留命名数据卷,数据安全。
  • 新版命令是 docker compose(空格),旧教程里的 docker-compose(横杠)是旧版写法。

❓ 知识问答

Q1:YAML 文件有什么格式要求?

YAML 靠缩进表达层级,缩进必须用空格,不能用 Tab。同级配置缩进要一致,写错了 Compose 会报解析错误。本课程统一使用 4 空格缩进。

Q2:docker compose up 之后改了配置文件怎么办?

重新执行一次 docker compose up -d 即可,Compose 会自动对比配置变化,重建有改动的容器。

Q3:Compose 文件里的服务能互相访问吗?

能。同一个 Compose 项目里的服务会加入同一个内部网络,服务之间直接用服务名访问。比如应用容器里连接数据库,主机名直接写 mysql 就行,不用写 IP。

Q4:docker compose down 会把数据卷也删掉吗?

默认不会。加 -v 参数(docker compose down -v)才会连数据卷一起删,等于清空所有数据,学习阶段想推倒重来时可以用。

Q5:一个项目可以有多个 Compose 文件吗?

可以,但学习阶段一个 docker-compose.yml 就够了。复杂项目会按环境(开发、生产)拆分多个文件,用到时再了解即可。


🧪 小练习

  1. 把前面 MongoDB 的启动命令改造成 Compose 管理,写入 docker-compose.yml 并启动。原命令如下:
docker run -d --name mongo-demo -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME=root -e MONGO_INITDB_ROOT_PASSWORD=123456 mongo:8
docker-compose.yml
# 提示:在 services 下新增一个 mongo 服务
# 请在这里编写配置
  1. docker-compose.yml 中同时配置 mysqlmongo 两个服务,执行 docker compose up -d 后用 docker compose ps 确认两个容器都在运行,最后用 docker compose down 一键清理。

🎉 恭喜你已经掌握了 Docker Compose!至此 Docker 课程全部完成,你已经具备了用容器搭建和管理服务端环境的能力。接下来去 MySQL 课程里实战吧,那里的第一条命令对你来说已经是老朋友了。