如何获取Registry服务的本地Docker IP?容器间访问异常排查
问题解答:Docker Registry本地IP查找与容器间访问故障分析
一、查找Registry服务的本地Docker IP
有几种快速获取Registry容器IP的方法:
- 使用
docker inspect直接查询:docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' registry - 进入Registry容器内部查看IP:
docker compose exec registry hostname -i - 查看compose专属网络的详细信息(以你的
foo_default网络为例):docker network inspect foo_default | jq '.[].Containers | to_entries[] | "\(.key): \(.value.IPv4Address)"'
二、容器间访问失败的原因分析
从你的测试结果来看,问题出在端口使用和通信逻辑上:
curl registry失败:未指定端口时,curl默认访问80端口,但Registry容器内部监听的是5000端口,因此连接被拒绝。curl registry:5100失败:5100是宿主机的映射端口,容器间通信不需要经过宿主机端口转发,应直接使用容器内部暴露的5000端口。ports: - 5100:5000的作用是将宿主机5100端口映射到容器5000端口,仅用于外部(宿主机或非compose网络的容器)访问。curl 172.21.0.1:5100成功:172.21.0.1是foo_default网络的网关IP,指向宿主机,你实际是通过宿主机转发访问到Registry容器,但这不是容器间通信的最优方式。
三、正确的容器间访问方式
在同一个Docker Compose网络(foo_default)内,test容器可通过两种方式正常访问Registry:
- 使用服务名+容器内部端口(推荐,服务名会自动解析到容器IP):
curl registry:5000/v2/_catalog - 使用Registry容器的实际IP+5000端口:
比如查到Registry的IP是172.21.0.2,执行:curl 172.21.0.2:5000/v2/_catalog
补充说明
Docker Compose默认会为所有services创建专属网络,网络内的容器可直接通过服务名互相访问,无需手动配置IP。容器间通信使用容器内部端口,宿主机映射端口仅用于外部访问场景。
内容的提问来源于stack exchange,提问作者Patrick Kwok
相关产品推荐
相关产品推荐

