gpt4 book ai didi

docker容器与群通信问题

转载 作者:行者123 更新时间:2023-12-02 19:10:36 26 4
gpt4 key购买 nike

我有几个 docker 容器可以在一台机器上很好地一起运行。一个绑定(bind)到端口 80,另一个连接到一个也启动的 neo4j 容器。其他用于容器间工作(我没有构建它们,但我必须托管它们)。我有一个带有 docker engine 1.12 的 docker swarm 设置和一个跨 swarm 中的 3 台机器的 progrium/consul 集群。 consul 集群可以看到所有容器,并且它们在使用 run -d 时工作(在提到的每个单个主机上)。一旦我将它们中的任何一个作为“服务”发布,它们就无法再进行通信。我尝试创建一个新的覆盖网络,但没有任何影响。

我还尝试在其他作为服务运行的所有系统上运行一个绑定(bind)到端口 80 的容器作为单独的容器。 Docker inspect 将它们全部显示在同一个 172.17.0.0 网络上。

我真的可以对要看的东西提出一些想法。谢谢。

首先,我加载 neo4j:

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

然后,后续容器使用以下命令加入 docker swarm 上的领事集群:
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我用 docker create service ,期望如果我用192.168.2.201替换neo4j IP,它应该可以工作。

我还尝试使用覆盖网络:
docker network create -d overlay my-net

并在 docker service 命令中包含 --net=my-net 。我不知道什么时候有时间进一步调试,但如果这足以至少告诉我我做错了什么,那就太好了。如果没有,我会在时间允许的情况下尝试获取更多信息。

最佳答案

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

创建网络覆盖后,您可以通过容器/服务名称而不是特定 IP 地址来引用服务。例如,在跳回您的应用程序之前先完成一个简单的示例。

这假设您已经创建了 swarm 集群:

创建网络覆盖

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

启动一个简单的redis服务
docker service create --replicas 1 --network my-app-network \
--name demo-redis redis

创建一个我们将登录以进行进一步探索的虚拟服务:
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"

注:至此,我们已经创建了一个容器,它实际上并没有做任何事情,但我们将登录到它,以便我们可以交互地探索以查看正在发生的事情。

找到运行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

创建一个脚本以通过容器/服务名称访问您的 redis 服务
vi test.py 并粘贴如下内容:
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)

从演示 Alpine 容器中运行脚本
python test.py

请注意,我通过容器/服务名称而不是 IP 引用了 redis 服务,因为它可能位于集群上的任何位置。您应该开始看到递增的值打印到屏幕上。

为了获得更多乐趣,如果它对您有用,请扩展 redis 服务以查看它是否扩展到已经运行的 Python 脚本。

从另一个终端 session ssh 进入管理器节点,这样您就不会停止演示 Alpine session
docker service scale demo-redis=3

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

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

关于docker容器与群通信问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38882898/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com