Docker内置DNS主机名无法解析:Bridge网络容器间访问故障求助
验证PostgreSQL容器通过Docker Bridge网络的跨容器访问
清理所有容器
# /!\ 删除所有容器 /!\ docker rm -vf $(docker ps -aq)
启动数据库容器
docker run --name db \ --env POSTGRES_PASSWORD=asdf \ --detach postgres:alpine
通过IP测试连接
IP=`docker network inspect bridge | grep IPv4 | grep -o -P '\d+\.\d+\.\d+\.\d+'`; \ docker run --env IP=$IP alpine sh -c "apk add --update --no-cache netcat-openbsd && nc -zv $IP 5432"
执行结果:
Connection to 172.17.0.2 5432 port [tcp/*] succeeded!
连接成功!
通过主机名测试连接
docker run alpine sh -c "apk add --update --no-cache netcat-openbsd && nc -zv db 5432"
执行结果:
nc: getaddrinfo for host "db" port 5432: Name does not resolve
连接失败...
问题原因
Docker默认的bridge网络不支持容器名的自动DNS解析,仅自定义桥接网络提供容器间DNS解析能力,允许通过容器名直接访问。
解决方法
创建自定义桥接网络,将数据库容器与测试容器加入同一网络即可实现主机名访问:
- 创建自定义网络
docker network create my-bridge-network
- 启动数据库容器并指定加入该网络
docker run --name db \ --env POSTGRES_PASSWORD=asdf \ --network my-bridge-network \ --detach postgres:alpine
- 使用同一网络的测试容器通过主机名访问
docker run --network my-bridge-network alpine sh -c "apk add --update --no-cache netcat-openbsd && nc -zv db 5432"
执行后会返回连接成功的结果,说明容器名访问正常。
内容的提问来源于stack exchange,提问作者pietrodito
相关产品推荐
相关产品推荐

