Docker Compose 3.3同网络容器无法互访问题排查与解决
一、可能的Docker Compose配置问题
端口混淆:容器间通信需用内部端口
你本地能通过localhost:6666访问Postgres,说明YAML中Postgres的ports配置是"6666:5432"(主机端口映射到容器内部默认5432端口)。但容器间通信必须使用容器内部端口5432,而非主机映射的6666端口。用pg-db:6666连接自然会被拒绝。Postgres监听地址限制
默认Postgres仅监听localhost,容器内部需配置为监听所有地址(*),否则只接受容器内本地连接,拒绝其他容器请求。可通过两种方式修改:- 环境变量方式:添加
POSTGRES_HOST_AUTH_METHOD=trust(测试环境用,生产建议用md5认证); - 挂载自定义配置:将设置了
listen_addresses = '*'的postgresql.conf挂载到容器内对应路径。
- 环境变量方式:添加
网络归属不一致
你设置了COMPOSE_PROJECT_NAME=fgag,默认网络会命名为fgag_default,但如果YAML中显式定义了自定义网络,必须确保两个服务都加入该网络。若其中一个服务未指定networks字段,会被放入默认网络,导致不在同一网络无法通信。服务就绪状态未同步
即使容器显示"启动完成",Postgres首次启动时可能还在初始化数据库,此时服务并未就绪。未配置健康检查的depends_on,GeoServer可能在Postgres未就绪时尝试连接,导致后续测试仍失败。
二、网络检查实现方案
1. 验证容器网络归属
查看当前项目的Docker网络:
docker network ls | grep fgag正常应显示
fgag_default(或你自定义的网络名称)。检查两个容器是否在同一网络:
# 查看PostGIS容器的网络信息 docker inspect pg-db | grep -A5 Networks # 查看GeoServer容器的网络信息 docker inspect geoserver | grep -A5 Networks确认输出中的网络名称完全一致。
查看网络内的服务映射与IP:
docker network inspect fgag_default在
Containers节点下找到pg-db的IP地址,同时确认Name字段包含pg-db(服务名解析依赖此配置)。
2. 在GeoServer容器内做连通性测试
进入GeoServer容器:
docker exec -it geoserver bash测试服务名DNS解析:
ping pg-db若能收到响应,说明DNS解析正常;若失败,检查网络归属或Docker DNS配置。
测试Postgres内部端口连通性:
# 用telnet测试 telnet pg-db 5432 # 若无telnet,用nc替代 nc -zv pg-db 5432若连接成功,说明网络通路正常;若被拒绝,检查Postgres监听配置或端口是否正确。
3. 检查Postgres容器内部配置
进入PostGIS容器:
docker exec -it pg-db bash查看监听地址配置:
cat /var/lib/postgresql/data/postgresql.conf | grep listen_addresses确保输出为
listen_addresses = '*'(允许所有地址监听)。查看访问控制规则:
cat /var/lib/postgresql/data/pg_hba.conf需包含允许GeoServer所在网段连接的规则,例如:
host all all 0.0.0.0/0 md5查看Postgres日志排查启动或连接错误:
docker logs pg-db搜索
connection refused或listen相关关键词,定位具体问题。
4. 验证Postgres服务就绪状态
在PostGIS容器内测试本地连接:
psql -U <你的Postgres用户名> -d <你的数据库名>若能正常登录,说明Postgres服务本身正常。
(可选)为Postgres添加健康检查,确保GeoServer仅在Postgres就绪后启动:
在YAML的pg-db服务下添加:healthcheck: test: ["CMD-SHELL", "pg_isready -U your_user -d your_db"] interval: 5s timeout: 5s retries: 5同时GeoServer的
depends_on配置为:depends_on: pg-db: condition: service_healthy
内容的提问来源于stack exchange,提问作者TPPZ

