这个问题可能是针对所有码头工人大师的。但首先让我先介绍一下背景。我遇到了dns解决问题(在码头工作者的默认网络"桥接"),直到我在https://docs.docker.com/engine/userguide/networking/的文档中阅读以下内容
上面的docker network inspect命令显示给定网络上的所有连接容器及其网络资源。此默认网络中的容器可以使用IP地址相互通信。 Docker不支持默认网桥上的自动服务发现。如果要与此默认网桥中的容器名称进行通信,则必须通过旧版docker run -link选项连接容器。 / p>
由于--link
选项已弃用,任何docker run
命令都会挂起并最终破坏docker守护程序进程(本地)我尝试使用不同的桥接用户网络并将虚拟实例固定到它。
docker network create -d bridge --subnet=172.15.0.0/16
--gateway=172.15.0.1
-o com.docker.network.bridge.default_bridge=false
-o com.docker.network.bridge.enable_icc=true
-o com.docker.network.bridge.enable_ip_masquerade=true
-o com.docker.network.driver.mtu=1500
-o com.docker.network.bridge.name=docker1
-o com.docker.network.bridge.host_binding_ipv4=0.0.0.0 a
docker run --name db1 -e MYSQL_ROOT_PASSWORD=a -d mysql:5.7.16
docker run --name db2 -e MYSQL_ROOT_PASSWORD=a -d mysql:5.7.16
docker network connect --ip 172.15.0.40 a db1
docker network connect --ip 172.15.0.40 a db2
现在,通过--name
命名的服务/容器的解析可以正常使用ping
,但问题是:
为什么默认桥接网络上无法解析服务/容器名称?
如果有任何码头网络大师可以给出一个提示,那将会很棒。问候。
答案 0 :(得分:10)
为什么默认桥接网络上无法解析服务/容器名称?
没有技术原因这是不可能的,而是决定保持向后兼容性。
默认(“网桥”)网络从未通过内置DNS支持服务发现,当该功能正在开发中时,某些项目的维护者提出了他们不希望在默认网络上添加此功能的担忧,因为它会阻止替代实施。
此外,自定义网络旨在显式允许容器进行通信。在默认网络上,这是通过禁用“容器间通信”(--icc=false
),并使用--link
在容器之间建立链接来实现的。对连接到默认网络的任何容器进行自动发现会使这使用起来更加复杂。
因此;创建一个自定义网络,并将容器连接到该网络,如果它们应该能够相互通信。
请注意,在许多情况下,并非所有您指定的选项都需要;只需运行docker network create foo
就可以适用于大多数用例。