Django无法连接Fedora环境下运行中的Postgres Docker容器问题求助
排查步骤与解决方案
1. 优先验证容器网络基础连通性
先进入Django应用容器手动测试网络连通性,排除域名解析、端口不通问题:
- 执行进入容器命令:
docker exec -it data-management bash - 容器内执行ping测试:
ping postgresdb,如果ping不通说明docker网桥内部域名解析或网络隔离异常 - 容器内执行端口连通性测试:
nc -zv postgresdb 5432,如果返回连接失败说明postgres端口未对外开放或被拦截
2. 排查Fedora防火墙拦截问题
Fedora默认启用firewalld防火墙,大概率会拦截docker网桥内部的跨容器通信,可按以下步骤验证修复:
- 临时关闭防火墙测试:
sudo systemctl stop firewalld,之后重启docker服务和容器,看能否正常连接。如果恢复正常说明是防火墙规则问题 - 永久放行docker子网流量:
# 替换为你的docker实际子网,报错里的网段是172.27.0.0/16可直接用 sudo firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.27.0.0/16 accept' --permanent sudo firewall-cmd --reload sudo systemctl restart docker
3. 验证SELinux影响
即使没有权限相关报错,Fedora的SELinux策略也可能拦截容器间通信,可临时关闭验证:
- 临时关闭SELinux:
sudo setenforce 0,重启容器测试连接 - 如果确认是SELinux导致,可执行命令放开容器通信权限:
sudo semanage permissive -a container_t
4. 优化docker-compose配置
你使用的links属性已经被官方废弃,默认同docker-compose项目下的服务会加入同一个默认网桥,可调整配置明确网络配置和启动顺序:
version: "3.8" services: app: container_name: data-management restart: always build: ./ ports: - '3000:3000' volumes: - ./:/usr/local/share/src/app env_file: - .dev.env depends_on: - postgresdb networks: - app-network postgresdb: container_name: be-postgres restart: always image: postgres:13.4-alpine ports: - '5432:5432' volumes: - postgres-db:/var/lib/postgresql/data env_file: - .dev.env networks: - app-network volumes: postgres-db: networks: app-network: driver: bridge
调整配置后执行docker-compose up -d --force-recreate重建容器生效。
5. 验证Postgres访问配置
进入Postgres容器检查pg_hba.conf配置,确保允许外部网段访问:
- 进入postgres容器:
docker exec -it be-postgres bash - 查看配置文件:
cat /var/lib/postgresql/data/pg_hba.conf,确认存在host all all 0.0.0.0/0 scram-sha-256规则,没有的话手动添加后重启postgres容器即可。
内容的提问来源于stack exchange,提问作者dsax7
相关产品推荐
相关产品推荐

