现场是这样的。应用连不上同编排文件里的数据库,容器都在跑,用宿主地址能通,用服务名却报找不到主机。
真正麻烦的地方在于,几个原因的现象几乎一样。服务不在同一个网络里;连接用的是容器名而不是服务别名;网络被自定义配置覆盖,别名没有注册。
上来先看各容器所属网络
docker inspect -f '{{.Name}} {{range .NetworkSettings.Networks}}{{.NetworkID}}{{end}}' $(docker ps -q)
然后确认服务名解析是否正常
docker exec -it 应用容器 getent hosts 数据库服务名
接着在编排文件里声明同一网络
grep -n networks /opt/app/docker-compose.yml
末了重建容器让网络配置生效
docker compose up -d --force-recreate
这类改动我都写进变更记录,过两周再出问题时能对上号。
我习惯把每一步的执行时间和结果记在一边,后面复盘省事。
恢复的判定其实很直接。容器内用服务名能解析并连通,应用启动不再报连接失败。
容易忽略的是,服务名只在同一自定义网络里可解析,默认桥接网络不提供;改完网络必须重建容器,重启无效。报错文案容易误导,真正的原因往往在相邻那一层的日志里。