docker集装箱与群体沟通问题

我有几个docker集装箱,可以在一台机器上一起运行。 一个绑定到端口80,另一个连接到neo4j容器,也是旋转起来的。 其他的是为了容器间的工作(我没有build立它们,但我必须承载它们)。 我有一个docker swarm设置,docker engine 1.12和一个progrium / consul cluster,在群中的3台机器上。 consul集群可以看到所有的容器,并且只要运行-d(在提到的每个主机上)就可以工作。 只要我把它们中的任何一个作为“服务”,就不能再进行交stream了。 我试过创build一个新的覆盖networking,但没有影响。

我也尝试运行绑定到端口80的一个容器,作为所有其他系统作为服务运行的系统上的单独容器。 Docker检查将它们显示在同一个172.17.0.0networking上。

我真的可以用一些想法看看。 谢谢。


首先,我加载neo4j:

docker run -d -p 192.168.2.201:7474:7474 \ --volume=$HOME/neo4j/data:/data neo4j:3.0 

然后,后续的集装箱正在joindocker群上的领事集群,使用:

 docker run -d -e "CONSULJOIN=172.17.0.2" -e "NEO4J_HOST=172.17.0.4" \ -e "NEO4J_PASSWORD=$NEO4J_PASS" container 

而不是docker run -d -D我使用docker create service ,期望是,如果我用192.168.2.201replaceneo4j IP,它应该工作。

我也尝试使用覆盖networking:

 docker network create -d overlay my-net 

并在docker服务命令中包含了–net = my-net。 我不知道什么时候有时间进一步debugging,但如果这足以说明我做错了什么,那将是非常好的。 如果没有,我会尽量得到更多的信息,时间允许。

您不应该指定IP地址来查找群集上的服务。 它可以在群集上的任何机器上,除非您添加约束将其放置在特定的机器上。

一旦你创build了一个networking覆盖,你可以通过容器/服务名称而不是一个特定的IP地址来引用服务。 例如,在返回到您的应用程序之前,通过一个简单的示例。

这假定你已经创build了你的群集:

创build一个networking覆盖

 docker network create --driver overlay my-app-network 

开始一个简单的redis服务

 docker service create --replicas 1 --network my-app-network \ --name demo-redis redis 

创build一个虚拟服务,我们将login进一步探索:

 docker service create --replicas 1 --network my-app-network \ --name demo-alpine alpine /bin/sh -c "trap 'exit 0' INT TERM; while true; do echo Hello World; sleep 10; done" 

注意:在这一点上,我们创build了一个没有任何function的容器,但是我们将会login到这个容器中,这样我们就可以交互地浏览,看看发生了什么。

find运行demo-alpine服务的节点

 docker service ps demo-alpine #this will report which node is running the container 

SSH到正在运行demo-alpine的节点并附加到它的shell

 docker ps #lists all the running containers on that node, find the container ID of demo-alpine docker exec -i -t <container id> /bin/sh #install python,pip and redis(for python) in your demo-alpine container apk update apk add python apk add py-pip pip install redis 

创build一个脚本来通过容器/服务名称 vi test.py 来打你的redis服务,并粘贴如下所示:

 import redis import time loopy = True while loopy == True: # I'm creating the connection each time so we can see the change when we scale the Redis service # and the new service is brought online; connections should start rotating through the scaled Redis servers. # If one uses a Redis connection scoped outside of the loop then it would remain connected to the first Redis # service and we wouldn't see the new one come online. r = redis.StrictRedis(host='demo-redis', port=6379, db=0) r.incr('counter') print(r.get('counter')) time.sleep(3) 

从您的demo-alpine容器中运行脚本

 python test.py 

请注意,我已经通过它的容器/服务名称而不是IP引用了redis服务,因为它可能在群集上的任何地方。 你应该开始看到增加的值打印到屏幕上。

为了获得更多的乐趣,如果它为你工作,扩展redis服务,看它是否扩展到已经运行的Python脚本。

从另一个terminal会话ssh到pipe理器节点,所以你不要停止你的演示高山会议

 docker service scale demo-redis=3 

您应该开始看到从新缩放的redis服务打印到屏幕的新增量值,并且群集应该将请求循环到每个新创build的redis服务。 同步数据是另一回事 – 但这不是快速演示的重点。

在这一点上,你应该能够回到你的应用程序,并让它在你的集群上运行。 您可能必须更改您的代码以引用容器名称而不是IP地址,但这是在群集上运行它的一点; 它可能在任何地方。