如何在桥接网络中按名称访问docker容器?

时间:2018-01-17 14:09:55

标签: java docker docker-compose

我创建了一个桥接网络,以便我的所有容器都在其中。

这是关于我的docker网络的信息(为了便于阅读,输出被截断):

docker network inspect bridge

"Name": "bridge",
"Containers": {
  "4ae08..d80d": {
    "Name": "zimidy.chat-server.staging",
  },
  "61cdb..1c4b": {
    "Name": "zimidy.web-server.staging",
  },
  "8c45..d391": {
    "Name": "zimidy.neo4j.staging",
  },
  "bcf..093": {
    "Name": "zimidy.api.staging",
  },
  "ca1f..c5aa": {
    "Name": "zimidy.web.staging",
  }
}, 
"Options": {
  "com.docker.network.bridge.default_bridge": "true",
  "com.docker.network.bridge.enable_icc": "true",
  "com.docker.network.bridge.enable_ip_masquerade": "true",
  "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
  "com.docker.network.bridge.name": "docker0",
  "com.docker.network.driver.mtu": "1500"
}

但我无法从“zimidy.web-server.staging”访问“zimidy.web.staging”。

我尝试使用以下代码访问它:

HttpClient client = HttpClients.createDefault();
HttpGet requestToWebModule = new HttpGet("http://zimidy.web.staging:88/app");
HttpResponse responseFromWebModule = client.execute(requestToWebModule);

会引发以下错误:

java.net.UnknownHostException: zimidy.web.staging: Name or service not known

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

  

“com.docker.network.bridge.default_bridge”:“true”

(注意:你实际上编辑了你的问题并在我写答案时删除了这篇文章)

来自docker networking documentation

  

连接到默认bridge网络的容器可以通过IP地址相互通信。 Docker不支持默认bridge网络上的自动服务发现。如果您希望容器能够按容器名称解析IP地址,则应使用用户定义的网络。

据我所知,您说您创建了一个新网络,但无论出于何种原因,该网络的行为与默认网络相似,这意味着您无法通过主机名解析。

答案 1 :(得分:0)

默认桥接网络上的容器只能通过 IP 地址相互访问,除非您使用 --link option?,这被认为是旧版。

更好的主意是使用 user-defined bridge networks?,在这种情况下,您可以在容器内按名称 ping 其他容器(此功能称为自动服务发现。)。


[注意]: