【问题标题】:Docker swarm with a custom network带有自定义网络的 Docker swarm
【发布时间】:2016-12-08 16:15:15
【问题描述】:

我正在尝试研究如何在 Docker 中正确使用 swarm 模式。首先,我尝试在我的 2 台工作人员和经理机器上运行容器,而不指定自定义网络(所以我使用默认的入口覆盖网络)。但是,如果我使用入口网络,由于某种原因我无法解析tasks.myservice

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

docker network create -d overlay elasticnet

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

有没有办法:

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

  2. 或者,使用自定义网络,但 --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

使用自定义网络:

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

【问题讨论】:

  • 你能发布一份你正在运行的所有命令的列表吗?用户定义的覆盖网络是要走的路。
  • @johnharris85 请看我的编辑。

标签: docker docker-swarm docker-networking


【解决方案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

如果要使用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.验证: 从其中一个节点测试暴露的端口:

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 per index

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

阅读更多关于shardsUse this的信息。

【讨论】:

    【解决方案2】:

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

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

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

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

    发布仍然可以在 swarm 上工作,但每个主机都会监听 1230 端口,然后将其网状路由到其中一个容器。

    【讨论】:

    • 请看我的编辑。问题是,例如,当我使用 -p 1230:123 时,这是否意味着端口 1230 应该在外部可用?如果是,我无法让该部分与自定义网络一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2020-01-21
    • 2017-10-15
    相关资源
    最近更新 更多