我已经在同一台机器上安装了 Docker 和 Podman。这是我的第一个问题吗?也许。但我的目标是两者都运行,无论如何我都想继续。
我的问题是:Docker 的规则和 Podman 的规则之间似乎存在 iptables 冲突,而我的工作解决方案对我来说没有任何意义。
版本信息:操作系统:RHEL 7.6 Podman:0.11.1.1 Docker:18.09.1 Iptables:1.4.21
两点信息:
- docker 守护进程在启动时为容器网络添加 iptables 规则。
- Podman 在运行容器时通过 CNI(容器网络接口)为容器网络添加 iptables 规则。
我正在运行一个带有 podman 的容器,该容器公开了一个端口(例如,5000)。我构建了 3 个测试用例来帮助说明我的问题以及我在案例 3 中遇到的使远程访问起作用的极其奇怪的行为。继续阅读。
第一种情况完全有道理:我正常安装 Podman,没有安装任何 Docker,然后运行容器。噗!容器运行,我可以远程访问端口,正如我所料。
第二种情况是远程访问失败。我正常安装 Podman,安装并运行 Docker 服务,然后使用 Podman运行我的容器。繁荣。远程访问失败,因为没有到主机的路由。
在我继续第三种情况之前,重要的是要注意两个非常具体的 iptables 规则。您可以通过运行以下命令查看这些规则(如果您正在运行 Docker 守护程序并启动了 Podman 容器):
iptables -t nat -nL PREROUTING
该命令的输出是:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
CNI-HOSTPORT-DNAT all -- 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
现在是第三种情况:
- 所以我在 iptables 中闲逛,我知道足够危险。
我决定删除CNI-HOSTPORT-DNAT
规则:
iptables -t nat -D PREROUTING 2
突然间,我又可以通过 5000 端口远程访问容器了。
我的问题是:
为什么删除上述规则会使事情再次发生?您会认为删除 CNI 生成的规则会破坏 Podman 网络。但事实并非如此。我很困惑!
提前致谢。
更新:发现了问题,这是我的错。
在 DNAT 之后,我的数据包被正确发送到 FORWARD 链,但我在该链上有一个默认的 DROP,并且该链上没有规则接受绑定到端口 5000 的数据包。一旦我添加了一个 FORWARD 规则来接受 dport=5000 数据包,它开始工作了。
这个问题可以关闭。