Docker MySQL 无法远程连接?排查发现竟是 IPv4 转发被禁用!—— 记一次 Docker MySQL 连接失败的深度排查:WARNING: IPv4 forwarding is disabled

一、Docker 中的 MySQL 突然无法远程连接?别只查数据库,可能是内核级问题!

昨天工作的过程中笔者公司的大楼意外跳闸导致内部服务器全部关机。来电后我重启服务器,一切看似恢复正常。然而,在尝试从外部客户端连接部署在 Docker 容器中的 MySQL 服务时,却出现了连接失败的问题。

最诡异的是:在服务器本地可以正常访问 MySQL,也能进入容器内部操作,但外部主机无论如何都无法连接
并报下列错误

2003 - Can't connect to MysOL server on '192.168.0.133'(10060 "Unknown error")

但在服务器上是可以通过 mysql -h 127.0.0.1 -u root -p 进入mysql。
后续依次检查了

  1. 端口映射 : docker ps | grep mysql 端口映射正常
  2. 用户权限:SELECT Host, User FROM mysql.user WHERE User = ‘root’; 权限正常
  3. 防火墙:防火墙相关端口是放开的
    这些均无异常。尝试了重启服务器和重启 Docker 容器但还是无法解决。最后不得以采用备份了数据库并打算重新实例mysql的方式。即便重新导入备份数据并重建 MySQL 容器,问题依旧存在。我人都要麻了,在重新检查 Docker 容器创建日志时,注意到一条被忽略的警告信息
[root@localhost ~]# docker run -d \
>   --name mysql \
>   -p 3306:3306 \
>   -e MYSQL_ROOT_PASSWORD=mysql \
>   -v /data/soft/mysql/data:/var/lib/mysql \
>   -v /data/soft/mysql/conf:/etc/mysql/conf.d \
>   -v /data/soft/mysql/logs:/var/log/mysql \
>   --restart unless-stopped \
>   mysql:8.0.26
WARNING: IPv4 forwarding is disabled. Networking will not work.
84fb0f8bb3d5e994161f19c79csssdvczzz1234567890

发现了问题根源是:Linux 内核的 IPv4 转发被禁用,导致 Docker 网络失效。

二、 根本原因:IPv4 转发被禁用导致 Docker 网络失效

Docker 使用 Linux 内核的 netfilter 和 iptables 实现容器网络。当使用 -p 3306:3306 时,Docker 会在宿主机上设置端口转发规则,将外部请求转发到容器内部。
但若内核参数 net.ipv4.ip_forward = 0,则表示禁止数据包在不同网络接口间转发,导致:
外部请求到达宿主机后,无法被转发到 Docker ;
容器内部的响应也无法返回给客户端;
结果就是:宿主机能访问,外部无法连接。
而断电重启后,系统临时配置被重置,触发了这个问题。

三、 解决方式:启用 IPv4 转发

1、临时启用 IPv4 转发(立即生效,重启失效)(不建议如果原人员离职新接手的人员很难发现这个问题)

sysctl -w net.ipv4.ip_forward=1

2、永久启用(避免重启后失效)(建议使用这种)

编辑 /etc/sysctl.conf:

vi /etc/sysctl.conf

net.ipv4.ip_forward = 0 这行的内容改成 net.ipv4.ip_forward = 1,如果找不到就自己添加一行 :net.ipv4.ip_forward = 1

让配置生效

sysctl -p
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐