Docker同步容器无法连接Postgres数据库容器问题求助
以下是针对你的问题的具体排查步骤:
确认两个容器处于同一Docker网络
Docker默认bridge网络存在DNS解析限制,建议创建自定义网络并将Postgres和同步服务容器都加入其中。加入后,同步服务可直接用Postgres容器名称作为连接主机名(如postgres:5432),无需手动指定IP。若使用默认bridge网络,先确认同步容器能ping通Postgres容器的IP(172.19.0.2),排除基础网络连通性问题。检查Postgres的监听地址配置
进入Postgres容器,查看postgresql.conf中的*listen_addresses*参数:docker exec -it <postgres-container-id> cat /var/lib/postgresql/data/postgresql.conf | grep listen_addresses如果值为
localhost,Postgres仅监听容器内部的127.0.0.1,其他容器无法连接。需将其修改为*,再重启Postgres容器:docker exec -it <postgres-container-id> sed -i "s/listen_addresses = 'localhost'/listen_addresses = '*'/g" /var/lib/postgresql/data/postgresql.conf docker restart <postgres-container-id>验证Postgres的访问控制规则(pg_hba.conf)
检查pg_hba.conf是否允许Docker子网的连接:docker exec -it <postgres-container-id> cat /var/lib/postgresql/data/pg_hba.conf添加一行允许172.19.0.0/16子网的规则(对应你的Docker子网):
docker exec -it <postgres-container-id> echo "host all all 172.19.0.0/16 md5" >> /var/lib/postgresql/data/pg_hba.conf docker restart <postgres-container-id>修正同步服务的连接字符串
容器间连接无需使用宿主机的映射端口,直接用Postgres容器内部的5432端口。确保Go服务的连接字符串格式正确,例如:connStr := "host=172.19.0.2 port=5432 user=your_user dbname=your_db password=your_pass sslmode=disable"注意不要用
0.0.0.0作为主机名(这是监听地址,不是连接目标);若在同一自定义网络,用容器名替代IP更可靠,比如host=postgres。确认Postgres容器内部端口监听状态
进入Postgres容器,检查5432端口是否正常监听:docker exec -it <postgres-container-id> netstat -tulpn | grep 5432输出应显示
0.0.0.0:5432或:::5432,表示允许外部连接;若仅显示127.0.0.1:5432,说明监听地址配置有误,回到第二步修正。
内容的提问来源于stack exchange,提问作者Flo Sojer

