docker-compose.yml中服务名管理

1. docker-compose.yml 中“服务名”的本质

1.1 服务名是什么
docker-compose.yml 里,services 下的一级 key 就是服务名,它是 Compose 世界里的“逻辑身份”,不是容器名,但会参与生成容器名、网络 DNS 名称等。

1
2
3
4
5
6
version: "3.9"
services:
web:
image: nginx:alpine
db:
image: mysql:8.0

这里的 webdb 就是服务名

1.2 服务名的几个关键作用

  • docker compose up web:精确启动某一个服务
  • 容器默认名:<project>_<service>_<index>
  • 同一 compose 网络内的 DNS 名:服务名就是主机名(web:80db:3306
  • 依赖关系(depends_on)的锚点

2. 如何提取服务名

2.1 直接查看(最直观)

1
cat docker-compose.yml

services: 下的一级缩进字段即可。

2.2 命令行自动提取(脚本/自动化常用)

1
docker compose config --services

输出示例:

web
db
redis

这是最推荐的方式,因为它会解析变量、extends、profiles 之后的“真实服务列表”。


3. 逐个 up 服务(手动方式)

3.1 启动单个服务

1
2
3
docker compose up -d web
or
docker-compose up -d web

3.2 按顺序逐个启动

1
2
3
docker compose up -d db
docker compose up -d redis
docker compose up -d web

Compose 会自动处理:

  • 已存在的网络不会重复创建
  • 已运行的服务不会重复拉起

4. 逐个 up 服务(自动化/脚本方式)

4.1 最常见的一行写法

1
2
3
for s in $(docker compose config --services); do
docker compose up -d $s
done

在做受控启动 / 降低资源抖动时的标准姿势。

4.2 指定顺序(生产更推荐)

1
2
3
4
5
6
7
8
9
services=(
db
redis
web
)

for s in "${services[@]}"; do
docker compose up -d "$s"
done

原因很简单:

  • config --services 的顺序 ≠ 业务依赖顺序
  • 数据层、缓存层、应用层最好明确控制

5. 与 depends_on 的关系(一个常见误区)

5.1 depends_on 并不等于“逐个 up”

1
2
3
4
5
services:
web:
depends_on:
- db
- redis

它只保证:

  • 启动顺序(不是就绪状态)
  • 不会等待 db / redis 真正可用