假设我们使用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
),并且无法使用堆栈来完成此操作答案 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
。