我刚刚安装了 docker-ce 在CentOS上,但我无法从相邻服务器访问已发布的端口,也无法从容器本身到达外部。

运行一个普通的CentOS 8,启用了NetworkManager和Firewalld。默认防火墙区域为 public 是的。

版本:

docker-ce 19.03.3(官方docker RPM)

containerd.io 1.2.6(CentOS 7的官方Docker RPM-CentOS 8尚未提供)

CentOS 8.0.1905(最小安装)

最佳回复

在花了几天的时间查看相关组件的日志和配置之后,我正要认输,回到fedora 30,在那里这似乎是一个开箱即用的方法。

专注于防火墙,我意识到禁用 firewalld 似乎是在耍花招,但我宁愿不这么做。在检查网络规则时 iptables ,我意识到 nftables 意思是 iptables 现在是一个抽象层,它只显示 nftables 规则。这意味着大部分——如果不是全部的话 firewalld 配置将应用于 iptables 是的。

我过去常常能在 iptables ,所以这需要一些时间来适应。

长话短说-为了让这个工作,我必须启用伪装。看起来像 dockerd 已经完成了 iptables ,但显然这需要为 iptables 假扮上班:

# Masquerading allows for docker ingress and egress (this is the juicy bit)
firewall-cmd --zone=public --add-masquerade --permanent

# Specifically allow incoming traffic on port 80/443 (nothing new here)
firewall-cmd --zone=public --add-port=80/tcp
firewall-cmd --zone=public --add-port=443/tcp

# Reload firewall to apply permanent rules
firewall-cmd --reload

重新启动或重新启动 dockerd ,入口和出口都应该有效。