Docker Swarm-由于IP查找失败而无法连接到其他容器

时间:2019-07-12 00:02:59

标签: docker docker-swarm

假设我们使用docker swarm设置覆盖网络并创建具有以下名称的各种容器:

  • 爱丽丝
  • 鲍勃
  • 拉里
  • 约翰

现在,如果我们尝试从另一个ping通任何容器,则它将失败,因为它不知道如何进行IP查找,即alice不知道bob的IP等。我们一直在通过手动编辑每个容器上的/etc/hosts并在该文件中输入名称/ IP密钥值对来解决此问题,但是随着网络的每次重新启动,这变得非常繁琐。应该有一个更好的方法来处理这个问题。

例如,使用docker stack创建的服务不会遭受此问题的困扰。由于各种原因,我们坚持使用香草docker create创建容器。

>如何使容器在覆盖网络上彼此发现而无需人工编辑/etc/hosts

下面是我们目前必须遵循的详细工作流程:

  • 我们首先提供一个docker swarm和覆盖网络
  • 然后,对于每个容器,我们使用docker create命令创建它,然后使用docker start命令启动它。我们使用--network标志在创建时将容器附加到覆盖网络
  • 然后,我们使用docker container inspect获取每个容器的IP地址。这涉及到运行n命令并记下IP地址。
  • 然后,我们登录到每个容器并手动编辑/etc/hosts文件,并输入其他容器的(名称,IP)键值对。因此,这意味着跨容器求和时必须手动输入n*(n-1)记录。

不确定为什么docker create不能自动完成所有操作-码头工人已经知道(或可以知道)所有IP地址。例如,使用Docker堆栈调配的容器无需经过此手动过程即可彼此“发现”。我们之所以不能使用docker stack是因为:

  • 不允许我们指定容器名称
  • 我们在启动容器之前运行各种命令(主要是docker cp),并且无法使用堆栈来完成此操作

2 个答案:

答案 0 :(得分:0)

您可能已经看到了:DNS on User defines networks

您是否已像this doc?中的“将服务附加到叠加层”部分中那样创建服务,

答案 1 :(得分:0)

似乎唯一需要做的就是用容器的{name}.{network}而不是{name}来引用容器。无需编辑/etc/hosts或使用--add-host标志或运行其他DNS服务器。请参阅https://forums.docker.com/t/need-help-connecting-containers-in-swarm-mode/77944/6

更多详细信息:docker的官方文档在任何地方都没有提到将.{network}后缀添加到{containername}的必要性。实际上,在演练下的this链接的步骤#7上,没有使用.{network}后缀。所以不确定为什么我们需要这样做。对于Linux,我们正在使用的docker版本是18.06.1-ce