firewalld 和 docker 冲突问题

本文深入探讨了CentOs7系统中firewalld与docker服务的冲突问题,阐述了firewalld重启时清空iptables规则导致docker容器启动失败的原因,并提供了三种解决方案,包括禁用firewalld、使用iptables.service替代以及调整docker网络模式。

造成冲突的主要原因是:iptables的存在。

firewalld 和 iptables

首先,firewalld 和 iptables 都不是防火墙,它们只是防火墙的管理程序,真正的防火墙是内核的netfilter。CentOs 6 中使用iptables来管理防火墙,到了CentOs 7 默认使用firewalld来管理防火墙,但需要注意的是 firewalld 的底层还是调用 iptables 的,firewalld在iptables的基础上加了许多很好用的功能。
firewalld 是系统服务,有守护进程。iptables 只是一个工具,不是服务。

docker 和 iptables

docker 使用iptables 来实现网络隔离。docker 默认使用 bridge 网桥模式来实现容器的网络。dockerd 会在 iptables 建立 docker 链来设置所有的规则。这个链是不能动的,如果用户想自定义一些规则,可以写在 docker-user链中。
更多docker网络相关,可参考:https://docs.docker.com/network/iptables/

冲突原因

firewalld 启动或重启时,会将iptables的规则清空。导致docker启动容器出错。这时就需要重启dockerd。
有一些文章说dockerd 在 firewalld之后启动,将不存在问题。按照目前的理解这样确实不会有问题(但我使用的时候还是有问题)。下面来实验一下
系统:CentOs 7.7 1908
1、关掉 docker 和 firewalld 服务

systemctl stop docker
systemctl stop firewalld

在这里插入图片描述
在这里插入图片描述
2、启动firewalld

systemctl start firewalld

在这里插入图片描述
此时iptables 已经被firewalld 恢复到默认设置了。
3、启动dockerd

ystemctl start docker

在这里插入图片描述
可以看到,docker服务一直没有起来,查看日志 也没有什么可用信息

#将docker 日志改为debug模式
vi /usr/lib/systemd/system/docker.service
#加入 --debug 
#再次启动docker
systemctl start docker
还是起不来,查看日志,也没啥有用的日志,猜测:firewalld 接管了netfilter后,docker 无法通过iptables来设置网络

解决方法

方法一、关闭 firewalld 且不让它开机启动

systemctl stop firewalld
systemctl disable firewalld

方法二、使用 iptables.service 代替firewalld
安装 iptables.service 的守护进程来替代firewalld
方法三、docker容器使用 host 主机网络模式,不要用bridge 模式

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值