Docker群集与自定义网络

时间:2016-12-01 12:49:39

标签: docker docker-swarm docker-networking

我正在尝试研究如何在Docker中正确使用swarm模式。首先,我尝试在我的2台工作人员和经理机器上运行容器,而没有指定自定义网络(所以我使用默认的入口覆盖网络)。但是,如果我使用入口网络,由于某种原因我无法解析$user_id = isset($_GET['userid']) && ($_GET['userid']!= '') ? $_GET['userid'] : (isset($_POST['userid']) && ($_POST['userid']!='') ? $_POST['userid'] : null); $this->session->set_userdata('user_id', $user_id);

所以我尝试配置这样的自定义网络:

tasks.myservice

现在,当我docker network create -d overlay elasticnet 进入其中一个容器时,我可以成功解析bash但我无法再访问我在tasks.myservice下的服务创建中定义的端口外部(我在使用入口网络时可以使用)。

有没有办法:

  1. 使用入口网络并能够解析--publish或任何其他指向我所有服务容器的DNS记录?

  2. 或者,使用自定义网络,但tasks.myservice端口正确,以便我可以在外部访问它们?

  3. 修改

    这是我创建服务的方式,

    没有自定义网络:

    --publish

    使用自定义网络:

    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
    

2 个答案:

答案 0 :(得分:1)

请看下面的示例:

1.创建用户定义的覆盖网络:

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

如果您要使用endpoint-mode,则不必指定VIP,这是默认设置。

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.Verification: 从其中一个节点测试Exposed端口:

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

测试外部主机的公开端口:

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

从容器内部测试DNS查找:

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特定建议

Elasticseach拥有自己的群集,可提供FailoverLoadbalancing功能。

您可以在属于elasticsearch集群的elasticsearch主机中使用shardsreplicas / index

即便如此,我建议您创建3 Services,每个replica,然后加入弹性搜索群集,然后创建indexes 3 shards和3 replicas。您将在弹性搜索群集中拥有loadbalancingfailover

详细了解shardsUse this

答案 1 :(得分:0)

我们在这里缺少的是您的服务定义,或者您在定义容器时使用的是旧式时尚docker run。

如果您使用了泊坞窗服务功能(在docker 1.12中可用),您仍然可以通过服务公开您的端口

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

您的服务将在反垃圾邮件网络上创建,如果您创建了另一个服务nodejs2,他们将能够使用服务名称(如主机名)相互联系。

发布仍然适用于swarm,但是每个主机都会侦听端口1230,然后将其网格路由到其中一个容器。