几个复制品进入码头工人群

时间:2017-12-15 18:32:42

标签: docker docker-swarm

尝试将容器部署到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个端口。

2 个答案:

答案 0 :(得分:1)

在群集模式下使用缩放时,请勿发布端口。你只会遇到麻烦。
正确的方法是:

  1. 创建一个泊坞网络
  2. 将您的服务分配给此网络(不要发布端口)
  3. 在gobal模式下使用反向代理(例如nginx,apache或traefik),使您的服务在端口80上公开
  4. 因此,您的反向代理只会调用您的服务名称(--name your_service),并且internaly docker swarm模式将使用其包含的循环负载均衡器来调用您的第n个服务之一({{ 1}})

    这就是docker swarm模式的设计方式,并且开放式扩展可以实现负载均衡。

答案 1 :(得分:1)

这里发生的是您正在尝试创建多个附加到同一端口的服务。只有一项服务可以连接到任何一个端口 - 这不是特定于Docker的,并且您将在未来的技术努力中遇到这种情况。

然而;值得注意的是,默认情况下Swarm模式是ingress网络是set as the default network - 这是一个带路由网格的覆盖网络;实际上发生的事情实际上是Docker为您处理的第3层IP负载平衡。

所以你很好奇你正在遇到这个问题 - 我很想说你正在运行旧版本的Docker。

如果您想自己解决这个问题 - 最简单的方法是创建覆盖网络,例如:

docker network create --driver overlay my_new_network

然后在创建服务时,请确保指定网络:

docker service create --network my_new_network --name backend --replicas 3 --publish published=8080,target=80 my-repo/subserver:latest

这将解决基于IP的路由;但是如果你想做一些基于主机的路由,你可以像@Markus所说的那样使用Traefik,Docker Flow Proxy,HAProxy等第7层负载均衡器。