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地址,但这是在群集上运行它的一点; 它可能在任何地方。