Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
docker容器与swarm通信问题_Docker_Neo4j_Docker Swarm - Fatal编程技术网

docker容器与swarm通信问题

docker容器与swarm通信问题,docker,neo4j,docker-swarm,Docker,Neo4j,Docker Swarm,我有几个docker容器,可以在一台机器上一起运行。一个绑定到端口80,另一个连接到同样旋转的neo4j容器。其他的用于容器间工作(我没有构建它们,但我必须托管它们)。我有一个docker swarm设置,docker engine 1.12和一个progrium/Consor集群,分布在swarm中的3台机器上。concur集群可以看到所有的容器,当使用just run-d(在前面提到的每个主机上)时,它们都可以工作。一旦我把它们中的任何一个作为“服务”发布,它们就无法再通信了。我尝试创建一个

我有几个docker容器,可以在一台机器上一起运行。一个绑定到端口80,另一个连接到同样旋转的neo4j容器。其他的用于容器间工作(我没有构建它们,但我必须托管它们)。我有一个docker swarm设置,docker engine 1.12和一个progrium/Consor集群,分布在swarm中的3台机器上。concur集群可以看到所有的容器,当使用just run-d(在前面提到的每个主机上)时,它们都可以工作。一旦我把它们中的任何一个作为“服务”发布,它们就无法再通信了。我尝试创建一个新的覆盖网络,但没有效果

我还尝试将绑定到端口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-create-service
而不是
docker-run-d
时,人们的期望是,如果我用192.168.2.201替换neo4j IP,它应该可以工作

我还尝试使用覆盖网络:

docker network create -d overlay my-net

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

您不应该指定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"
注意:此时,我们已经创建了一个容器,它实际上不做任何事情,但我们将登录到它,以便我们可以以交互方式进行探索,看看发生了什么

查找运行演示服务的节点

docker service ps demo-alpine #this will report which node is running the container
docker service scale demo-redis=3
SSH连接到运行demo alpine的节点并连接到其外壳上

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
从演示容器中运行脚本

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

为了获得额外的乐趣,如果它对您有用,请缩放redis服务以查看它是否可以缩放到已经运行的Python脚本

从另一个终端会话ssh到manager节点,这样您就不会停止演示会话

docker service ps demo-alpine #this will report which node is running the container
docker service scale demo-redis=3
您应该开始看到新的增量值从新缩放的redis服务打印到屏幕上,集群应该循环请求到每个新创建的redis服务。同步数据是另一回事,但这不是快速演示的重点


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

请包括您正在运行的命令,包括网络和服务创建命令,以及任何调试输出。因此,这些系统位于内部虚拟机上。首先,我加载neo4j时使用:docker run-d-p192.168.2.201:7474:7474——volume=$HOME/neo4j/data:/data neo4j:3.0。然后,后续容器使用:docker run-d-e“CONSULJOIN=172.17.0.2”-e“NEO4J_HOST=172.17.0.4”-e“NEO4J_PASSWORD=$NEO4J_PASS”容器加入docker swarm上的领事集群。当我使用docker create服务代替docker run-d时,人们的期望是,如果我用192.168.2.201替换neo4j IP,它应该可以工作。很抱歉,我还应该声明,虽然我在Linux管理部门工作了一段时间,但我是docker的新手。我已经用您上面的评论更新了这个问题。您还可以使用您尝试的网络创建命令进行编辑吗?在幕后,Docker正在创建桥接网络,并使用iptables控制访问,因此您应该能够使用标准的Linux工具集进行调试。使用
docker exec-it/bin/bash
连接到任何容器中的bash外壳以进行进一步调试。谢谢,很抱歉,我最初尝试了它,但没有创建新的覆盖网络,然后使用docker创建了一个。我在上面添加了这个命令,当我启动服务时,我包括了--net=my-net部分。事实上,我将朝着使用Kubernetes的方向发展,所以让它工作起来并不是那么重要,但如果知道我哪里出了问题,那就好了。谢谢非常感谢。我们将对此进行分析,并尝试改变调用其他容器的方式。我是个老派的,巨石系统公司的家伙,所以我只是需要一点时间来理解集装箱化的做事方式。我的荣幸。我总是喜欢一个相对端到端的例子,因为在经历了一个简单的例子之后,它会使我们更容易在以后继续集成自己的工作。请注意,我刚刚修复了最后一条语句中的一个bug,它扩展了服务。我最初是将命令的输出放在这里,而不是命令的输出,现在已经修复了。我也在我的Github帐户上写下了这一点,并计划扩展它。