bigywater.tech
Docker · 68

Compose 扩容:scale 与端口冲突

docker compose --scale 到底做了什么?缩容删哪个、服务名怎么解析、带端口映射的服务能不能扩、container_name 会不会挡路?这篇逐项实测。

编号小的保留
--scale 缩容时保留 worker-1,删掉编号大的
3 个 IP
client 解析服务名 worker 得到的地址数,与 3 个副本一一对应
退出码 1
固定宿主机端口 "9941:80" 扩成 2 个副本时 docker compose up 的退出码

缩容与扩容

实测 · 本机执行输出
  up -d --scale worker=3:['worker-1', 'worker-2', 'worker-3']
  再 --scale worker=1:剩下 ['worker-1'];被保留的 worker-1 是原来那个吗?True
  再 --scale worker=3:['worker-1', 'worker-2', 'worker-3'];worker-1 仍是原来的?True;worker-2 是新建的(ID 变了)吗?True

缩容保留编号小的容器(原容器,ID 不变),删除编号大的;再扩容出来的是新容器。

名字解析

实测 · 本机执行输出
  client 解析 worker 得到 ['172.19.0.3', '172.19.0.4', '172.19.0.5'];3 个副本的真实 IP ['172.19.0.3', '172.19.0.4', '172.19.0.5'];一致吗?True

服务名解析出所有副本的 IP(顺序可能变,见后面的 DNS 轮询一篇),这是 compose 里最简单的服务发现。

replicas

实测 · 本机执行输出
  deploy.replicas: 2,docker compose up -d:['worker-1', 'worker-2']
  命令行 --scale worker=4 覆盖 replicas:['worker-1', 'worker-2', 'worker-3', 'worker-4']

deploy.replicas 在 docker compose up 里生效;命令行的 --scale 优先。

端口映射

实测 · 本机执行输出
  固定宿主机端口 "9941:80" --scale worker=2:退出码 1;运行中的副本 ['worker-2'];Error response from daemon: failed to set up container networking: driver failed programming external connecti
  端口范围 "9942-9944:80" --scale worker=2:退出码 0;运行中的副本 ['worker-1', 'worker-2'];
  只写容器端口 "80" --scale worker=2:退出码 0;运行中的副本 ['worker-1', 'worker-2'];

多个副本不能抢同一个宿主机端口,要用端口范围或让 docker 随机分配。固定端口那次实验里最终只有 worker-2 在运行,具体是 worker-1 没起来还是被清理,我没有细查。

container_name

实测 · 本机执行输出
  worker 设了 container_name,--scale worker=2:退出码 1;WARNING: The "worker" service is using the custom container name "bwlab-c63-fixed". Docker requires each container to have a unique name. Re

设了 container_name 的服务只能有一个容器,--scale 到 2 会被拒绝。

分步演示

compose 扩缩容
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Docker Desktop(Engine 29.8.2,容器跑在 Docker Desktop 自带的 Linux 虚拟机里,内核与宿主机的 macOS 不同);镜像为 linux/arm64;需要看虚拟机内部时用特权容器 + nsenter;计时用 time / date +%s%N,数字每次运行会有小幅抖动。Docker Compose v5.5.1;服务是 alpine:3.20 sleep 300;容器 ID 前 6 位用来判断是否是同一个容器;DNS 用 busybox nslookup(排除了 127.0.0.11:53 这行服务器地址);端口 9941–9944 是我选的空闲端口;项目 bwlab-c63,实验后已 down -v
    • 没有验证:缩容时被删容器的选择规则的完整描述(只看到保留编号小的)、滚动更新、副本的负载均衡(DNS 轮询见后面一篇)、资源限制 deploy.resources、docker compose up --scale 与 depends_on 的组合
    京ICP备2026067502号-1京公网安备11010502063487号