为什么Docker容器无法通过全限定域名调用同一主机上的其他容器
核心问题解答
Docker本身完全支持使用全限定URL调用其他容器,你遇到的报错和全限定URL的格式无关,本质是容器内部无法将你的宿主机域名my-computer.mydomain.net解析到正确的IP地址。
根本原因
容器的网络栈和宿主机是隔离的,DNS解析规则也和宿主机不互通:
- 你在宿主机浏览器可以正常访问域名,是因为宿主机的hosts配置或内网DNS可以把
my-computer.mydomain.net解析到宿主机自身的IP - Docker默认给容器分配内置DNS服务(默认地址为127.0.0.11),该服务只会解析Docker网络内部的容器/服务名,公网域名会自动转发到宿主机配置的公网DNS服务器解析
- 你的
my-computer.mydomain.net是本地自定义的开发域名,公网DNS没有对应解析记录,因此容器发起解析请求时直接返回Name or service not known错误 - 你可以正常访问公网网页,是因为公网域名可以被公网DNS正常解析,和这个场景的逻辑不同
无需Docker Compose的解决方案
如果你希望在容器内继续使用宿主机域名访问,可以选择以下任一方案:
- 启动容器时增加
--add-host参数,自动绑定宿主机域名到Docker网关:
其中docker run --add-host my-computer.mydomain.net:host-gateway <你的镜像名称>host-gateway是Docker 20.10及以上版本内置的内置变量,会自动匹配宿主机的Docker网关IP,不需要手动查询填写。 - 手动修改容器内部的
/etc/hosts文件,追加一行记录:<宿主机IP> my-computer.mydomain.net,该方案的缺点是容器重建后配置会失效。 - 把两个容器加入同一个自定义Docker网络,可直接用容器名作为域名互相调用,不需要走宿主机端口映射,性能和便捷性更高。
内容的提问来源于stack exchange,提问作者Vaccano
相关产品推荐
相关产品推荐

