Docker群与自定义networking

我正在努力解决如何在Docker中正确使用swarm模式。 首先,我尝试在我的2个工作人员和pipe理器机器上运行容器,而没有指定自定义networking(所以我使用默认的入口覆盖networking)。 但是,如果我使用入口networking,出于某种原因,我无法解决tasks.myservice

所以我尝试configuration一个像这样的自定义networking:

 docker network create -d overlay elasticnet 

所以,现在,当我打开一个容器时,我可以成功parsingtasks.myservice但是我不能再访问我在服务创build时定义的端口 – 在外部使用--publish (我可以使用入口networking)。

有什么办法可以:

  1. 使用入口networking,并能解决任何将直接到我的服务容器的任何DNS tasks.myservice或任何其他DNSlogging?

  2. 或者,使用自定义networking,但--publish正确--publish端口,以便我可以在外部访问它们?

编辑

这是我如何创build我的服务,

没有自定义networking:

 docker service create --replicas 3 --label elasticsearch --endpoint-mode vip --name elastic -e ES_HOSTS="tasks.elastic" --publish 9200:9200 --mount type=bind,source=/tmp/es,destination=/usr/share/elasticsearch/config --update-delay 10s es:latest 

使用自定义networking:

 docker service create --replicas 3 --network elasticnet --label elasticsearch --endpoint-mode vip --name elastic -e ES_HOSTS="tasks.elastic" --publish 9200:9200 --mount type=bind,source=/tmp/es,destination=/usr/share/elasticsearch/config --update-delay 10s es:latest 

看下面的例子:

1.创build用户定义的覆盖networking:

 sudo docker network create overlay1 --driver overlay 9g4ipjn513iy overlay1 overlay swarm 

2.运行暴露的端口和3个副本的服务:

 sudo docker service create --name nginx --replicas 3 --publish 80:80 --network overlay1 nginx 

如果您要使用VIP ,则不需要指定endpoint-mode

 sudo docker service ps nginx ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR dbz8b4jjfp6xg3vqunt1x8shx nginx.1 nginx dg1 Running Running 13 minutes ago 9d8zr6zka0sp99vadr8eqq2t2 nginx.2 nginx dg3 Running Running 13 minutes ago cwbcegunuxz5ye9a8ghdrc4fg nginx.3 nginx dg3 Running Running 12 minutes ago 

3.validation:从其中一个节点testing暴露的端口:

 administrator@dg1:~$ telnet localhost 80 Trying ::1... Connected to localhost. Escape character is '^]'. 

从外部主机testing暴露的端口:

 user@externalhost /home/balrog% telnet dg1 80 Trying 172.30.135.101... Connected to 172.30.135.101. Escape character is '^]'. 

从容器内部testingDNS查找:

 sudo docker exec -it 05d05f934c68 /bin/bash root@05d05f934c68:/# ping nginx PING nginx (10.0.0.3): 56 data bytes 64 bytes from 10.0.0.3: icmp_seq=0 ttl=64 time=0.050 ms 64 bytes from 10.0.0.3: icmp_seq=1 ttl=64 time=0.121 ms root@05d05f934c68:/# ping tasks.nginx PING tasks.nginx (10.0.0.5): 56 data bytes 64 bytes from 10.0.0.5: icmp_seq=0 ttl=64 time=0.037 ms 64 bytes from 10.0.0.5: icmp_seq=1 ttl=64 time=0.149 ms 

ElasticSearch具体build议

Elasticseach有自己的集群,提供FailoverLoadbalancingfunction。

您可以在elasticsearch集群的elasticsearch主机中为每个index使用分shardsreplicas

这就是说,我build议你创build3个Services ,每个1个replica ,然后join一个elasticsearch集群,然后创build3个分shards和3个replicas indexes 。 您将在elasticsearch集群中进行loadbalancingfailover

要阅读更多关于shards , 请使用这个 。

我们在这里所缺less的是你的服务定义,或者你在定义容器时只使用了很好的旧时装docker run。

如果您已经使用docker服务function(在docker 1.12中提供),您仍然可以通过服务公开端口

 docker create --name nodejs1 --network anti-spam -p 1230:123 --replicas 1 image:version 

您的服务将在反垃圾邮件networking上创build,并且如果您创build了另一个服务nodejs2,则它们将能够使用服务名称(如主机名)到达对方。

发布仍然在群集上工作,但是每个主机将监听端口1230,然后将其路由到其中一个容器。