这个问题可能已经解决了所有 docker 。但是,让我先提供一些背景知识。我遇到了dns解析问题(在docker的默认网络“bridge”上),直到我在https://docs.docker.com/engine/userguide/networking/上阅读了文档中的以下内容
The docker network inspect command above shows all the connected containers and their network resources on a given network. Containers in this default network are able to communicate with each other using IP addresses. Docker does not support automatic service discovery on the default bridge network. If you want to communicate with container names in this default bridge network, you must connect the containers via the legacy docker run --link option.
随着
--link
选项的弃用,使任何docker run
命令挂起,并最终(我在本地)粉碎了docker daemon进程,我尝试使用其他桥接用户网络并将其固定为虚拟实例。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
命名的服务/容器的问题,但这是一个问题:为什么在默认网桥网络上无法解析服务/容器名称?
如果任何 docker 网络专家可以给出提示,那将是很棒的。问候。
最佳答案
Why is service/container name resolution not possible on the default bridge network?
出于技术原因,这是不可能的,但是保留了向后兼容性的决定。
默认(“桥接”)网络从不支持通过内置DNS进行服务发现,并且在开发此功能时,某些项目的维护者担心他们不希望在默认网络上添加此功能,因为这会阻止其他实现。 。
此外,自定义网络旨在明确允许容器进行通信。在默认网络上,这是通过禁用“容器间通信”(
--icc=false
),并使用--link
在容器之间建立链接来实现的。对连接到默认网络的任何容器进行自动发现会使使用起来更加复杂。所以;创建一个自定义网络,并将容器连接到该网络(如果它们之间能够相互通信)。
请注意,在许多情况下,并不需要您指定的所有选项。只需运行
docker network create foo
就可以在大多数情况下工作。
关于docker - 默认桥接网络上的docker嵌入式dns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41400603/