Docker容器内如何使用自定义hostname访问同网络下的其他容器服务
解决方案
你可以根据实际需求选择以下任意一种配置方案:
方案1:容器间走内部网络互通(性能更好,不走宿主机端口映射)
Docker Compose 默认会为所有服务创建专属网桥网络,你只需要给home_app配置网络别名,让同网络内的容器可以通过home.local解析到它的IP即可。
修改后的docker-compose配置:
services: home_app: hostname: "home.local" image: "home-app" ports: - "8180:8080" # 新增网络别名配置 networks: default: aliases: - home.local data_app: hostname: "data.local" image: "data-app" # 原有links配置可以删除,该特性已过时,网络别名可以替代其功能 ports: - "9010:9010"
注意事项:
容器内部直接互通时,访问的是home_app的内部服务端口,也就是你的服务实际监听的8080,所以默认访问地址为http://home.local:8080。如果你一定要使用8180端口,只需要把home_app内部服务的监听端口改为8180,同时将端口映射规则改为8180:8180即可。
方案2:走宿主机端口映射互通(无需调整服务端口,和外部访问逻辑一致)
如果你不想调整服务本身的端口配置,还想和外部访问一样使用http://home.local:8180访问,可以直接给data_app配置hosts规则,把home.local指向宿主机IP,逻辑和你现在用host.docker.internal:8180完全一致。
修改后的docker-compose配置:
services: home_app: hostname: "home.local" image: "home-app" ports: - "8180:8080" data_app: hostname: "data.local" image: "data-app" ports: - "9010:9010" # 新增hosts配置,host-gateway为Docker内置的宿主机IP别名 extra_hosts: - "home.local:host-gateway"
注:host-gateway特性需要Docker 20.10及以上版本支持,如果你使用的是旧版本Docker,可以把host-gateway替换为你宿主机的实际IP地址。
这个方案不需要修改home_app的任何配置,也不需要调整服务端口,配置完成后在data_app里直接访问http://home.local:8180即可正常调用接口。
内容的提问来源于stack exchange,提问作者Dharmesh Mehta
相关产品推荐
相关产品推荐

