1130 - Host ‘xxx.x.xx.xxx‘is not allowed to connect to this MySQL server
以下为本次问题的解决办法:
1、暂停mysql容器: docker stop mysql
2、删除mysql容器:docker rm mysql
3、查看mysql容器是否被删除:docker ps -a #没有mysql容器就是删除成功
4、run mysql容器:
docker run -d --name mysql-server --restart always -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=1234 -e MYSQL_USER=rootname -e MYSQL_PASSWORD=1234 -e MYSQL_DATABASE=your_database -p 3306:3306 mysql:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
以下为解析:
-
-d
后台运行容器(detached mode),避免阻塞终端。 -
--name mysql-server
为容器指定名称,便于后续管理(如docker start mysql-server
)。 -
--restart always
设置容器自动重启策略:- 容器退出时自动重启
- Docker 服务重启时自动启动
- 适用于需要高可用性的服务(如数据库)。
-
mysql:8.0
指定镜像版本为 MySQL 8.0(建议使用具体版本号而非latest
,确保环境稳定性)。 -v mysql-data:/var/lib/mysql
创建名为mysql-data
的命名卷(volume),将容器内/var/lib/mysql
目录(MySQL 数据存储路径)挂载到卷中。
作用:- 避免容器删除时数据丢失
- 支持多容器共享数据
- 便于数据备份与迁移
-
MYSQL_ROOT_PASSWORD=1234
设置 MySQL root 用户密码(必填)。
注意:- 生产环境建议使用强密码(至少 16 位,包含大小写、数字、符号)
- 避免在命令行中明文传递敏感信息(可用
--env-file
加载环境变量文件)
-
MYSQL_USER=rootname
创建新用户rootname
(非 root 用户)。
注意:- 不要将新用户命名为
root
(会与系统默认 root 用户冲突) - 建议使用业务相关的用户名(如
app_user
)
- 不要将新用户命名为
-
MYSQL_PASSWORD=1234
设置rootname
用户的密码。
注意:- 与
MYSQL_ROOT_PASSWORD
相同密码存在安全风险 - 生产环境需使用不同的强密码
- 与
-
MYSQL_DATABASE=your_database
初始化一个名为your_database
的数据库(容器启动时自动创建)。 -p 3306:3306
将容器内的 MySQL 服务端口(3306)映射到主机的 3306 端口。
访问方式:- 主机本地:
mysql -h 127.0.0.1 -u rootname -p
- 外部网络:
mysql -h [主机IP] -u rootname -p
注意: - 确保主机 3306 端口未被占用(可用
netstat -tulpn | grep 3306
检查) - 生产环境建议修改映射端口(如
3307:3306
)减少暴露风险
- 主机本地:
-
--character-set-server=utf8mb4
设置服务器默认字符集为utf8mb4
(支持 emoji 等特殊字符)。 -
--collation-server=utf8mb4_unicode_ci
设置默认排序规则为utf8mb4_unicode_ci
(不区分大小写,支持更广泛的语言排序)。
对比:utf8mb4_unicode_ci
:更标准的 Unicode 排序utf8mb4_general_ci
:性能略高,但部分语言排序可能不准确