Docker安装MySQL时设置root密码方法及2002连接报错解决
问题原因
- 核心原因:容器启动时MySQL服务未运行。Docker镜像构建阶段(RUN指令执行时)的所有操作仅作用于临时构建层,构建完成后所有运行中的进程都会终止,你配置的CMD为
/bin/sh,容器启动后默认不会拉起MySQL服务,自然找不到sock文件。 - debconf密码配置错误:你使用的键名绑定了具体版本号
mysql-server-8.0.26,如果apt安装的MySQL版本和该版本不匹配,密码配置不会生效,后续MySQL初始化会失败。 - 交互式脚本阻塞构建:
mysql_secure_installation是交互式工具,在无交互的构建环境中运行会直接卡住或执行失败,导致后续修改权限、重启服务的步骤都不生效。 - 冗余防火墙配置:Docker容器的端口管控由Docker引擎负责,容器内开启ufw不仅多余,还可能阻塞MySQL端口,导致服务启动异常。
- 配置文件路径错误:Ubuntu 20.04默认MySQL 8.0的主配置文件路径为
/etc/mysql/mysql.conf.d/mysqld.cnf,你修改的/etc/mysql/my.cnf默认不存在,配置不生效。
修复方案
1. 修改mysql_setup.sh脚本
# 安装系统更新 apt-get update && apt-get upgrade -y # 设置时区 echo "America/Chicago" > /etc/timezone dpkg-reconfigure -f noninteractive tzdata # 安装基础依赖,debconf-utils为debconf配置工具必需依赖 apt-get -y install zsh htop debconf-utils # 非交互安装MySQL,默认root密码设置为root echo "mysql-server mysql-server/root_password password root" | debconf-set-selections echo "mysql-server mysql-server/root_password_again password root" | debconf-set-selections apt-get -y install mysql-server # 修改正确的配置文件,允许远程访问 sed -i 's/127\.0\.0\.1/0\.0\.0\.0/g' /etc/mysql/mysql.conf.d/mysqld.cnf # 临时启动MySQL配置root账号权限 service mysql start mysql -uroot -proot -e 'USE mysql; UPDATE `user` SET `Host`="%" WHERE `User`="root" AND `Host`="localhost"; FLUSH PRIVILEGES;' # 停止MySQL,方便后续容器启动时正常拉起 service mysql stop
2. 修改Dockerfile
将默认启动命令修改为前台运行MySQL,保持容器存活:
FROM ubuntu:20.04 COPY mysql_setup.sh /software/mysql_setup.sh RUN chmod +x /software/mysql_setup.sh && sh /software/mysql_setup.sh # 前台启动MySQL CMD ["mysqld", "--user=mysql"]
3. 构建验证
执行构建命令:docker build -t custom-mysql .
执行容器启动命令:docker run -d -p 3306:3306 --name mysql-test custom-mysql
进入容器验证登录:docker exec -it mysql-test mysql -uroot -proot
如果仅需要临时验证原有容器的登录功能,进入原有容器后先执行service mysql start再登录即可。
内容的提问来源于stack exchange,提问作者Manish
相关产品推荐
相关产品推荐

