求助:AWS中独立Docker容器访问同环境容器的域名解析问题
嘿,我来帮你搞定这个头疼的问题!你遇到的FetchError: getaddrinfo ENOTFOUND本质是contC无法解析xxx.com到contA的IP地址,而且你不想把contC加入contA的虚拟网络,那咱们可以用以下几种方法解决,按推荐程度排序:
1. 最简便:启动contC时添加自定义host映射
Docker提供了--add-host参数(Docker Compose里用extra_hosts),可以直接在容器的/etc/hosts文件里添加域名与IP的映射,完全不需要修改网络配置。
操作步骤:
- 先获取contA的内部IP地址:
执行后会得到类似docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' contAxxx.xx.xx.xxx的IP。 - 启动contC时加上
--add-host参数:
这样contC内部的docker run --add-host xxx.com:xxx.xx.xx.xxx [其他启动参数] your-contc-image/etc/hosts就会自动添加一条xxx.xx.xx.xxx xxx.com的记录,发起请求时就能直接解析到contA的IP了。
如果用Docker Compose,在contC的服务配置里加上:
services: contC: # 其他配置 extra_hosts: - "xxx.com:xxx.xx.xx.xxx"
2. 已启动容器临时修改(重启失效)
如果contC已经在运行,不想重启的话,可以手动进入容器修改/etc/hosts:
docker exec -it contC /bin/bash echo "xxx.xx.xx.xxx xxx.com" >> /etc/hosts
⚠️ 注意:这种方法是临时的,容器重启后修改会丢失,所以还是推荐第一种方法。
3. 不推荐:修改resolv.conf配置DNS
你提到的修改/etc/resolv.conf其实是配置DNS服务器,而不是直接映射域名。如果要走这条路,你需要搭建一个私有DNS服务器(比如Bind9),在里面配置xxx.com指向contA的IP,然后在contC的resolv.conf里把这个私有DNS设为首选。这种方法太繁琐,只是为了解析单个域名的话完全没必要,所以不推荐。
为什么之前的--link没用?
Docker的--link参数已经被废弃了,而且只在默认的bridge网络下有限支持,如果你contA和contB用的是自定义虚拟网络,--link根本不会生效,所以这个方法早就不建议使用啦。
另外,Postman能访问是因为你的本地机器的hosts或DNS能正确解析xxx.com,而contC的网络环境和本地完全独立,所以会出现解析失败的差异。
内容的提问来源于stack exchange,提问作者Donna Ann Issac

