试图将容器部署到swarm中。执行命令:
docker service create --name backend --replicas 3 --publish published=8080,target=80 my-repo/subserver:latest
它启动3个副本,但其中一个总是有错误:
docker service ps --no-trunc backend
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
0759ox8aganle2banj4s1uc31 backend.1 my-repo/subserver:latest Debian-70-wheezy-64-minimal Running Running 2 minutes ago
zjm9tf5ca1t58iuyjsyjqpjnq backend.2 my-repo/subserver:latest Debian-70-wheezy-64-minimal Running Running 2 minutes ago
u9ebicuyh0it6kvpaj9n7id2b backend.3 my-repo/subserver:latest Debian-70-wheezy-64-minimal Ready Ready less than a second ago
4kgwlm4rddj7zefr9tc1xst75 \_ backend.3 my-repo/subserver:latest Debian-70-wheezy-64-minimal Shutdown Failed 2 seconds ago "starting container failed: Address already in use"
dqvsyy5cjd95iid845ylrpdzi \_ backend.3 my-repo/subserver:latest Debian-70-wheezy-64-minimal Shutdown Failed 8 seconds ago "starting container failed: Address already in use"
ki0y94msyswqirm03qr7ldzl6 \_ backend.3 my-repo/subserver:latest Debian-70-wheezy-64-minimal Shutdown Failed 13 seconds ago "starting container failed: Address already in use"
emydpjqzzo5ce2ngid9ap9pb7 \_ backend.3 my-repo/subserver:latest Debian-70-wheezy-64-minimal Shutdown Failed 19 seconds ago "starting container failed: Address already in use"
尝试不同的端口。 Container包含PHP-FPM和nginx。服务从bash脚本开始:
#!/bin/bash
service nginx start
service php7.0-fpm start
while /bin/true; do
ps aux |grep nginx |grep -q -v grep
PROCESS_1_STATUS=$?
ps aux |grep php |grep -q -v grep
PROCESS_2_STATUS=$?
# If the greps above find anything, they will exit with 0 status
# If they are not both 0, then something is wrong
if [ $PROCESS_1_STATUS -ne 0 -o $PROCESS_2_STATUS -ne 0 ]; then
echo "One of the processes has already exited."
exit -1
fi
sleep 60
done
Docker文件只暴露80端口。
在群集模式下使用缩放时,请勿发布端口。你只会遇到麻烦。 正确的方法是:
因此,您的反向代理将只调用您的服务名称(qazxsw poi),并且内部docker swarm模式将使用其包含的循环负载均衡器来调用您的第n个服务之一(qazxsw poi)
这就是docker swarm模式的设计方式,并且扩展可以通过负载平衡开箱即用。
这里发生的是您正在尝试创建多个附加到同一端口的服务。只有一个服务可以连接到任何一个端口 - 这不是Docker特定的,你也会在未来的技术努力中遇到这个问题。
然而;令人好奇的是,默认情况下,Swarm模式是--name your_service
网络是--replicas n
- 这是一个带路由网格的覆盖网络;底层发生的事情实际上是Docker为您处理的第3层IP负载平衡。
所以很奇怪你遇到了这个问题 - 我很想说你正在运行旧版本的Docker。
如果您想自己解决这个问题 - 最简单的方法是创建一个覆盖网络,例如:
ingress
然后在创建服务时,请确保指定网络:
set as the default network
这将解决基于IP的路由;但是如果你想做一些基于主机的路由,你可以像@Markus所说的那样使用像Traefik,Docker Flow Proxy,HAProxy等的第7层负载均衡器。