4-Docker Compose使用
Docker Compose使用
一、概念介绍
在实际开发中,一个项目通常不只有一个容器。比如一个标准的网页应用通常需要:
- 前端容器(Nginx/React)
- 后端容器(Python/Node.js)
- 数据库容器(MySQL/PostgreSQL)
- 缓存容器(Redis)
如果你手动用 docker run 一个个启动,不仅要记长长的参数,还要手动处理它们之间的网络连接。Docker Compose 允许你用一个 .yml 配置文件来定义这些容器,然后只需一行命令就能全部搞定。
Docker Compose 使用 yml 文件管理多个容器,里面列出了容器之间是如何创建以及如何协同工作的。可以简单的把 Docker Compose 文件理解成一个或者多个的 docker run 命令按照特定的格式列到了一个文件里面。
二、示例:从 docker run 到 docker compose
1. 原始 docker run 命令
创建子网和容器,并将对应的容器添加到同一个子网中:
# 创建子网
docker network create network1
# 创建 my_mongodb 容器
docker run -d \
--name my_mongodb \
-e MONGO_INITDB_ROOT_USERNAME=name \
-e MONGO_INITDB_ROOT_PASSWORD=pass \
-v /my/datadir:/data/db \
--network network1 \
mongo
# 创建 my_mongodb_express 容器
docker run -d \
--name my_mongodb_express \
-p 8081:8081 \
-e ME_CONFIG_MONGODB_SERVER=my_mongodb \
-e ME_CONFIG_MONGODB_ADMINUSERNAME=name \
-e ME_CONFIG_MONGODB_ADMINPASSWORD=pass \
--network network1 \
mongo-express
2. 对应的 docker compose 文件写法
services:
my_mongodb:
image: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: name
MONGO_INITDB_ROOT_PASSWORD: pass
volumes:
- /my/datadir:/data/db
my_mongodb_express:
image: mongo-express
ports:
- 8081:8081
environment:
ME_CONFIG_MONGODB_SERVER: my_mongodb
ME_CONFIG_MONGODB_ADMINUSERNAME: name
ME_CONFIG_MONGODB_ADMINPASSWORD: pass
其中,services 元素中,每一个 service 都对应一个容器。
注意: docker compose 文件中没有 --network network1。这是因为 Docker 会为每一个 compose 文件都自动创建一个子网,同一个 compose 文件里面定义的所有容器都会自动加入到同一个子网中。
三、控制启动顺序(depends_on)
docker compose 中还有一个额外功能,可以自定义容器的启动顺序。
services:
my_mongodb:
image: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: name
MONGO_INITDB_ROOT_PASSWORD: pass
volumes:
- /my/datadir:/data/db
my_mongodb_express:
image: mongo-express
ports:
- 8081:8081
environment:
ME_CONFIG_MONGODB_SERVER: my_mongodb
ME_CONFIG_MONGODB_ADMINUSERNAME: name
ME_CONFIG_MONGODB_ADMINPASSWORD: pass
depends_on:
- my_mongodb
在 my_mongodb_express 下面添加 depends_on: - my_mongodb,表示 my_mongodb_express 容器依赖 my_mongodb 容器,所以程序会先把 my_mongodb 容器启动起来,再去启动 my_mongodb_express 容器。
四、用 AI 生成 docker compose 文件
可以将 docker run 命令给 AI,让它生成等价的 docker compose 文件。
提示词示例:
sudo docker network create network1
sudo docker run -d \
--name my_mongodb \
-e MONGO_INITDB_ROOT_USERNAME=gwt \
-e MONGO_INITDB_ROOT_PASSWORD=gwt123 \
--network network1 \
mongo
sudo docker run -d \
--name my_mongodb_express \
-p 8081:8081 \
-e ME_CONFIG_MONGODB_SERVER=my_mongodb \
-e ME_CONFIG_MONGODB_ADMINUSERNAME=gwt \
-e ME_CONFIG_MONGODB_ADMINPASSWORD=gwt123 \
--network network1 \
mongo-express
帮我将以上命令生成等价的 docker compose 文件
AI 生成的结果:
services:
mongodb:
image: mongo
container_name: my_mongodb
environment:
- MONGO_INITDB_ROOT_USERNAME=gwt
- MONGO_INITDB_ROOT_PASSWORD=gwt123
networks:
- network1
mongodb_express:
image: mongo-express
container_name: my_mongodb_express
ports:
- "8081:8081"
environment:
- ME_CONFIG_MONGODB_SERVER=my_mongodb
- ME_CONFIG_MONGODB_ADMINUSERNAME=gwt
- ME_CONFIG_MONGODB_ADMINPASSWORD=gwt123
networks:
- network1
depends_on:
- mongodb
networks:
network1:
driver: bridge
五、执行命令
vim docker-compose.yaml
# 使用该命令时,它会自动识别当前目录下严格叫做 docker-compose.yaml 的文件
# 若名字不一致,就识别不到
sudo docker compose up -d
# 若非标准文件名,可以用 -f 参数指定文件名
sudo docker compose -f test.yaml up -d
# 或在其他目录下
sudo docker compose -f /home/test.yaml up -d
查看运行的容器
sudo docker ps
# 或
sudo docker compose ps
输出示例:
giniclark@giniclark-VMware-Virtual-Platform:~$ sudo docker compose up -d
[+] Running 2/2
✔ Container my_mongodb Started 0.5s
✔ Container my_mongodb_express Started 0.7s
giniclark@giniclark-VMware-Virtual-Platform:~$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c72aa9033e1e mongo-express "/sbin/tini -- /dock…" 12 seconds ago Up 11 seconds 0.0.0.0:8081->8081/tcp, [::]:8081->8081/tcp my_mongodb_express
1cf8fb98e9b2 mongo "docker-entrypoint.s…" 12 seconds ago Up 12 seconds 27017/tcp my_mongodb
常见报错:unknown shorthand flag: ‘d’ in -d
unknown shorthand flag: 'd' in -d
这是因为在 Ubuntu 24.04 或类似系统中,docker-compose-v2 插件有时需要单独安装:
sudo apt update
sudo apt install docker-compose-v2
# 查看版本
docker compose version
六、常用命令对照表
| 操作 | 命令 | 说明 |
|---|---|---|
| 启动所有服务 | docker compose up -d |
-d 表示在后台运行 |
| 启动容器 | docker compose start |
启动容器 |
| 停止容器 | docker compose stop |
停止容器 |
| 停止并删除容器 | docker compose down |
停止容器并清理网络,非常干净 |
| 查看状态 | docker compose ps |
查看当前运行的服务列表 |
| 查看日志 | docker compose logs -f |
实时查看所有容器的输出日志 |
| 重新构建 | docker compose build |
当你修改了 Dockerfile 后使用 |
七、总结
Docker Compose 是一个轻量级的容器编排技术,适合个人使用、单机运行。对于企业级服务器集群大规模的容器编排需求,则需要 Kubernetes。
更多推荐

所有评论(0)