Docker-Compose部署PostgreSQL与PgAdmin无法连接求助
我使用以下docker-compose文件部署PostgreSQL与PgAdmin:
services: pgdatabase: image: postgres:13 environment: - POSTGRES_USER=root - POSTGRES_PASSWORD=root - POSTGRES_DB=ny_taxi volumes: - "./data:/var/lib/postgresql/data:rw" ports: - "5432:5432" pgadmin: image: dpage/pgadmin4 environment: - PGADMIN_DEFAULT_EMAIL=admin@admin.com - PGADMIN_DEFAULT_PASSWORD=root volumes: - "./data_pgadmin:/var/lib/pgadmin" ports: - "8080:80"
尝试通过PgAdmin连接PostgreSQL时,出现错误:
Unable to connect to server: could not translate host name "pgdatabase" to address: Name does not resolve
执行docker network ls得到结果:
NAME DRIVER SCOPE bridge bridge local docker-sql-pg_default bridge local host host local none null local
执行docker network inspect docker-sql-pg_default得到结果:
[ { "Name": "docker-sql-pg_default", "Id": "bfee2f08620b5ffc1f8e10d8bed65c4d03a98a470deb8b987c4e52a9de27c3db", "Created": "2023-01-24T17:57:27.831702189Z", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.24.0.0/16", "Gateway": "172.24.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "8f53be84a95c9c0591df6cc6edb72d4ca070243c3c067ab2fb14c2094b23bcee": { "Name": "docker-sql-pg-pgdatabase-1", "EndpointID": "7f3ddb29b000bc4cfda9c54a4f13e0aa30f1e3f8e5cc1a8ba91cee840c16cd60", "MacAddress": "02:42:ac:18:00:02", "IPv4Address": "172.24.0.2/16", "IPv6Address": "" }, "bf2eb29b73fe9e49f4bef668a1f70ac2c7e9196b13350f42c28337a47fcd71f4": { "Name": "docker-sql-pg-pgadmin-1", "EndpointID": "b3a9504d75e11aa0f08f6a2b5c9c2f660438e23f0d1dd5d7cf4023a5316961d2", "MacAddress": "02:42:ac:18:00:03", "IPv4Address": "172.24.0.3/16", "IPv6Address": "" } }, "Options": {}, "Labels": { "com.docker.compose.network": "default", "com.docker.compose.project": "docker-sql-pg", "com.docker.compose.version": "2.13.0" } } ]
尝试连接网关IP 172.24.0.1和PostgreSQL实例IP 172.24.0.2均出现超时错误,请问我的网络为何无法正常运行?
从提供的信息来看,两个容器确实处于同一默认网络,但出现域名解析失败和连接超时问题,可按以下步骤排查解决:
验证PostgreSQL容器运行状态
执行docker logs docker-sql-pg-pgdatabase-1,查看日志中是否存在database system is ready to accept connections的提示。如果PostgreSQL未完成启动或初始化失败,会直接导致连接失败。在容器内部测试连通性
进入pgadmin容器,直接测试与PostgreSQL的连通性:docker exec -it docker-sql-pg-pgadmin-1 bash # 测试域名解析 ping pgdatabase # 尝试用psql连接 psql -h pgdatabase -U root -d ny_taxi如果ping不通,说明容器间DNS解析存在异常;如果ping通但psql连接失败,需检查PostgreSQL的配置。
检查PostgreSQL监听配置
进入PostgreSQL容器,查看postgresql.conf中的listen_addresses参数:docker exec -it docker-sql-pg-pgdatabase-1 bash grep listen_addresses /var/lib/postgresql/data/postgresql.conf如果参数值为
localhost,则PostgreSQL仅监听本地回环地址,同网络的pgadmin无法连接,需修改为*后重启容器。排查防火墙/安全组限制
主机防火墙可能拦截了容器间的流量,可临时关闭主机防火墙测试,或检查Docker的iptables转发规则是否正常。重启Docker服务
若Docker网络组件出现异常,重启服务可修复DNS解析或网络连通问题:sudo systemctl restart docker重启后重新启动容器:
docker-compose up -d显式定义自定义网络(可选)
在docker-compose中显式创建自定义网络,避免默认网络的潜在问题:services: pgdatabase: # 保留原有配置 networks: - pg-net pgadmin: # 保留原有配置 networks: - pg-net networks: pg-net: driver: bridge重新部署后,容器间的DNS解析稳定性会提升。
内容的提问来源于stack exchange,提问作者OdiumPura

