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 compose(中间是空格,没有横杠)。老的 docker-compose 是独立安装的旧版,看到老教程里的写法知道是一回事即可。🛠 编写 docker-compose.yml
我们把前面用过的 MySQL 容器改造成 Compose 管理。新建一个目录,创建 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 run、docker 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 就够了。复杂项目会按环境(开发、生产)拆分多个文件,用到时再了解即可。
🧪 小练习
- 把前面 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
# 提示:在 services 下新增一个 mongo 服务
# 请在这里编写配置
- 在
docker-compose.yml中同时配置mysql和mongo两个服务,执行docker compose up -d后用docker compose ps确认两个容器都在运行,最后用docker compose down一键清理。
🎉 恭喜你已经掌握了 Docker Compose!至此 Docker 课程全部完成,你已经具备了用容器搭建和管理服务端环境的能力。接下来去 MySQL 课程里实战吧,那里的第一条命令对你来说已经是老朋友了。
