容器里的 127.0.0.1 指谁
容器里的 127.0.0.1 指向容器自身而不是宿主,这是容器网络里最容易误判的一点。连接被拒时先分清目标在哪:同容器内的进程、兄弟容器、还是宿主上运行的服务,三种情况的地址写法完全不同。
基本信息
| 容器内 | 127.0.0.1 表示容器自己 |
|---|---|
| 兄弟容器 | 用自定义网络里的服务名或别名 |
| 宿主服务 | 网关地址或宿主域名映射 |
| 自定义网络 | 自带名称解析,直接用服务名 |
| 常见误判 | 在宿主上验证通,进容器就不通 |
典型使用场景
- 排障:容器内访问本地地址失败时先确认执行位置
- 应用只监听回环地址导致其他容器连不上,定位监听配置
- 多容器编排时用服务名替代写死的地址
- 迁移到容器后接口连接配置需要改写时确定目标地址
- 把宿主能通、容器不通的现象拆成几层分别验证
分层核实
分层核实
docker exec web sh -c 'ip addr show eth0 | head -3' # 容器自己的地址
docker exec web getent hosts db # 自定义网络里按服务名解析
docker exec web sh -c 'ss -lntp 2>/dev/null || netstat -lntp' # 确认监听地址
docker inspect -f '{{.NetworkSettings.IPAddress}}' web # 默认 bridge 下的容器地址访问目标的正确写法
| 访问目标 | 正确写法 | 常见错误 |
|---|---|---|
| 同容器内进程 | 127.0.0.1 加端口 | 写成宿主地址 |
| 兄弟容器 | 服务名加端口 | 写死容器地址 |
| 宿主上的服务 | 网关地址或宿主标识 | 用回环地址指宿主 |
| 外部服务 | 服务地址或域名 | 沿用宿主的解析配置 |
同一条访问命令在宿主与容器内执行结果完全不同,调试脚本里先明确执行位置再判断结论。
服务只绑回环地址时,同一网络里的其他容器也连不上,这类问题要改监听地址而不是改网络。
把宿主上的排查经验直接搬进容器是常见误判来源,网络视图与解析配置都不是同一套。
需要容器访问宿主上的服务时,不同平台与版本的宿主标识支持情况不同,用之前先在目标环境确认。
默认 bridge 网络的容器互相只能靠地址访问,换到自定义网络才能用服务名,排障前先确认容器在哪个网络里。