You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose 3.3同网络容器无法互访问题排查与解决

Docker Compose PostGIS-GeoServer 容器间连接失败排查与网络检查方案

一、可能的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 01:45:33