浪潮云+docker 莫名其妙无法访问

现象:

在浪潮云安装docker,隔几天就会无法访问,程序是正常运行的,尤其是集群部署时,甚至无法访问其他机器。

原因:

Docker daemon服务在启动过程中会检查系统的IP_FORWARD配置项,如果当前系统的IP_FORWARD功能处于停用状态,会帮我们临时启用IP_FORWARD功能,然而临时启用的IP_FORWARD功能会因为其他各种各样的原因失效。
Docker daemon启用IP_FORWARD功能是因为Docker容器默认的网络模式(bridge/网桥模式)会给每个容器分配一个私有IP,如果容器需要和外部通信,就需要使用到NAT。NAT需要IP_FORWARD功能支持,否则无法使用
这也解释了为什么会出现在IP_FORWARD功能停用的情况下,使用bridge模式的容器内外均无法访问的情况。

只是在Linux下,出于安全考虑,默认是停用IP_FORWARD功能的,Docker daemon服务在启动时会检查IP_FORWARD功能是否已经启用,如果没有启用的话,Docker daemon会悄无声息的临时启用此功能,然而临时启用的IP_FORWARD功能并不能持久化,会因为其他命令的干扰导致失效。
比如三鹿零安全服务器优化这个恶心的工具

解决办法:

麻烦运维人员从服务器上卸载三鹿零这玩意~~~

sysctl net.ipv4.ip_forward

0表示未开启

echo 'net.ipv4.ip_forward = 1' >> /usr/lib/sysctl.d/50-default.conf
sysctl -p /usr/lib/sysctl.d/50-default.conf

echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p

echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.d/99-sysctl.conf
sysctl -p /etc/sysctl.d/99-sysctl.conf

**修改network启动脚本,启动时手动设置ip_forward
**
vi /etc/init.d/network
**找到start代码段,在apply_sysctl下方加入以下代码:
**
sysctl -w net.ipv4.ip_forward=1 > /dev/null 2>&1
**重启network,检查是否生效
**
systemctl daemon-reload
systemctl restart network
sysctl net.ipv4.ip_forward

再不行上终极武器
crontab -e
0/1 * * * * sysctl -w net.ipv4.ip_forward=1

Docker浪潮云IP_FORWARD