我的环境: 在一个台式机上安装了 CentOS 8,在 CentOS 8 上安装了 Docker,在 Docker 里运行了 Postgres 数据库的容器,容器的端口暴漏到主机(-p 5432:5432 )。 遇到的问题: 在本机( CentOS 8 )上可以通过 5432 端口访问 Postgres 数据库服务,但是只要 CentOS 的防火墙开着,在同一个局域网中的其他电脑访问不到( telnet: Unable to connect to remote host: No route to host );如果关了 CentOS 的防火墙,其他主机可以正常访问 Postgres 。 需要补充的说明:
postgresql.conf
和pg_hba.conf
已正常配置允许其他主机访问。firewall-cmd --zone=public --add-service=postgresql
,也尝试过firewall-cmd --zone=public --add-port=5432/tcp
。 1
wtks1 2020-10-03 16:47:36 +08:00 via Android
用 [netstat -atnp | grep LISTEN] 看看对应端口是哪个 IP 在监听的
|
2
wtks1 2020-10-03 16:48:57 +08:00 via Android
啊,抱歉,少看了一节,关了防火墙就行了的话,最好从其他群局域网设备上 telnet 一下这个端口,看看端口是不是真的开放了
|
3
mikeguan 2020-10-03 17:30:42 +08:00 via Android
建议 docker 和 firewallld 不共用,换 iptables
|
5
wtks1 2020-10-04 17:20:20 +08:00 via Android
@scfhao 开了防火墙不通的话,那就证明你添加的放行策略并未生效,需要再研究一下 firewall 的命令
|
6
ward56 2021-01-21 09:11:23 +08:00
首先,你要明白 docker 运行机制
你的情况我再刚接触容器时遇到过。 据我个人观察,原因是:容器运行时会调用系统防火墙(底层的 iptables ),这时你再启用 firewalld 就会覆盖掉容器写入的配置。 建议: 你先在运行容器时观察容器 log,以及它的启动过程,这样更容器深入了解容器; 拓展:创建一个网桥,并给容器指定 ip,否则你在重启 docker 服务或者关掉 pg 库在启动会失败,原因同上,因为你的 pg 库 ip 被写进 iptables,关闭重启之类的操作会导致防火墙规则异常,解决方法:就是清空 iptables 或者重启 iptables 。 方法都是一通百通的,希望对你有帮助。 |