踩坑:1Panel Docker 装 MySQL、Redis,3306/6379 本地连不上的原因

8 阅读3分钟

一、前言

前段时间用阿里云轻量级服务器部署个人项目时,用1Panel面板安装MySQL、Redis后本地连不上,现记录一下排查过程。如果有相同问题可以按照这个顺序排查一下。

image.png

二、排查过程

1.容器创建时确认勾选 端口外部访问 选项

image.png

2.阿里云云服务器安全组

确认已开放3306、6379端口。

image.png

3.服务器系统防火墙(1Panel 防火墙)

确认已开放3306、6379端口。

image.png

开放这两层防火墙后,仍然无法连接数据库。且本地使用命令:

telnet [ip] [port]

测试后发现其他已开放的80、443等端口可以成功连通,唯有3306、6379无法连通。 于是初步定位到问题可能出现在容器内部。

4. 检查Docker端口转发规则是否正确

image.png 端口映射必须为: 0:0:0:0:3306->3306 这样表示这个容器可以被外网连接 如果是 127:0:0:1:3306->3306 则表示仅可以被本机(服务器)连接。

5. 检查MySQL的权限配置

# 登录服务器本地
MySQL mysql -u root 
# 执行查询(复制粘贴即可) 
SELECT user,host,plugin FROM mysql.user WHERE user='root';

如果看到 host = % ✅:root 允许任何 IP 远程连接(权限没问题)

如果看到 host = localhost / 127.0.0.1 ❌:root 只允许服务器本地登录

-- 1. 创建/修改root,允许任何IP访问(%代表所有IP) 
CREATE USER 'root'@'%' IDENTIFIED BY '你的MySQL密码'; 
-- 2. 授予所有权限 
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; 
-- 3. 刷新权限(必须执行!) 
FLUSH PRIVILEGES; 
-- 4. 退出 
exit;

除了权限,Mysql的配置文件也需要检查。检查Mysql的绑定权限限制:

# 找到配置文件位置 
find / -name my.cnf 
# 编辑 
vim /etc/my.cnf

找到这一条:

bind-address = 127.0.0.1 # 只允许本地

改为:

bind-address = 0.0.0.0 # 允许所有IP 
# 或者直接注释掉这一行

重启Mysql服务/容器

systemctl restart mysqld 
# 或者
service mysql restart

6. Docker默认bridge网路的缺陷(本人踩坑)

Docker 默认桥接网络有防火墙隔离和通信限制,本地无法访问端口。且1panel应用创建容器时,未提供网络选项,容器创建后被放在默认的1panel-network下。

image.png

image.png 要解决这个问题,我们创建一个自定义网络,并把Mysql、Redis容器放进这个自定义网络里即可。修改后的结果如下:

image.png

image.png 最后测试连接成功

image.png

三、总结

云服务器部署数据库,优先先看安全组,再看服务器防火墙,从外到内逐层排查;

MySQL 远程连接两大核心:账号 Host 授权 + bind-address 放开绑定,缺一不可;

Docker 部署 MySQL 不能只做端口映射,还要留意容器网络模式,网络隔离是隐形坑;

远程数据库连接排错遵循顺序:外网安全组 → 服务器防火墙 → 软件权限 → 配置文件 → 容器网络,按顺序排查能少走很多弯路。