如何解决Docker桥接网络中容器无法通过名称访问的问题
解决Docker默认Bridge网络中容器名称无法解析的问题
你遇到的java.net.UnknownHostException问题,核心原因是Docker默认的bridge网络不支持容器名称的DNS解析。默认桥接网络里,容器之间只能通过IP地址通信,或者用已经被废弃的--link参数,显然这两种方式都不够方便。
解决方案:使用自定义桥接网络
Docker推荐使用自定义桥接网络来实现容器间的名称解析,操作步骤如下:
创建自定义桥接网络
执行以下命令创建一个名为zimidy-bridge的自定义桥接网络:docker network create zimidy-bridge停止并重新部署容器到自定义网络
先停止正在运行的相关容器:docker stop zimidy.chat-server.staging zimidy.web-server.staging zimidy.neo4j.staging zimidy.api.staging zimidy.web.staging- 如果是用
docker run启动容器,重新启动时添加--network zimidy-bridge参数,示例:docker run --name zimidy.web.staging --network zimidy-bridge -d [你的Web容器镜像] docker run --name zimidy.web-server.staging --network zimidy-bridge -d [你的WebServer容器镜像] - 如果是用Docker Compose管理容器,修改
docker-compose.yml文件,为所有服务指定自定义网络:
修改后执行version: '3' services: chat-server: image: [你的ChatServer镜像] container_name: zimidy.chat-server.staging networks: - zimidy-bridge web-server: image: [你的WebServer镜像] container_name: zimidy.web-server.staging networks: - zimidy-bridge neo4j: image: [你的Neo4j镜像] container_name: zimidy.neo4j.staging networks: - zimidy-bridge api: image: [你的API镜像] container_name: zimidy.api.staging networks: - zimidy-bridge web: image: [你的Web镜像] container_name: zimidy.web.staging networks: - zimidy-bridge networks: zimidy-bridge: driver: bridgedocker-compose up -d重新部署。
- 如果是用
验证容器间的名称解析
进入zimidy.web-server.staging容器,尝试pingzimidy.web.staging来验证解析是否正常:docker exec -it zimidy.web-server.staging ping zimidy.web.staging如果能正常ping通,再运行你的Java HttpClient代码,应该就能成功访问了。
补充说明
自定义桥接网络默认启用了DNS服务发现功能,容器之间可以直接通过容器名称(或Compose服务名)通信,这不仅比默认bridge网络更易用,还提供了更好的隔离性和安全性,是Docker官方推荐的容器间通信方式。
内容的提问来源于stack exchange,提问作者victordobry
相关产品推荐
相关产品推荐

