firewalld防火墙开启后无法启动docker的问题
一、出现问题的原因
firewall的底层是使用iptables进行数据过滤,建立在iptables之上,而docker使用iptables来进行网络隔离和管理,这可能会与 Docker 产生冲突。当 firewalld 启动或者重启的时候,将会从 iptables 中移除 DOCKER 的规则,从而影响了 Docker 的正常工作。
也就是说,firewalld和docker都在操作iptables的规则,但是docker和firewalld发生了冲突,导致docker和firewall的设置的不一致,所以出现了问题。
二、解决办法
让docker绕过firewall
我们让docker不修改 iptables 就可以解决问题了:
##修改docker配置
vim /etc/docker/daemon.json
# 添加规则
{
...
"experimental" : true,
"iptables": false
}
#设置"experimental" : true这个设置启用 Docker 的实验性特性
#设置 "iptables": false 会禁用 Docker 自动配置 iptables 规则的行为。
# 重启 docker
systemctl daemon-reload
systemctl restart docker
# 启动容器
docker run -d -p 80:80 nginx
# 查看iptables规则 发现 docker 没有添加规则
iptables --list
#解决docker容器无法访问外网的问题
#开启防火墙NAT网络地址转换
sudo firewall-cmd --zone=public --add-masquerade --permanent
#重新加载防火墙配置
sudo firewall-cmd --reload