docker compose --scale 到底做了什么?缩容删哪个、服务名怎么解析、带端口映射的服务能不能扩、container_name 会不会挡路?这篇逐项实测。
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 里最简单的服务发现。
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 没起来还是被清理,我没有细查。
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 会被拒绝。