问题背景
- 虚拟机上手动安装的 MySQL (
/usr/local/mysql/bin/mysqld) 占用 3306 - kill PID 无效(可以先试试杀死占用3306端口的进程),因为有守护进程
mysqld_safe不断重启 - 系统没有 systemd mysqld 服务
- Docker 容器已存在但未启动,需要端口干净并设置开机自启
完整解决步骤
步骤 1:排查占用端口
1 | sudo lsof -i:3306 |
- 找到 mysqld 进程和父进程(守护进程)
- 确认路径,例如
/usr/local/mysql/bin/mysqld
步骤 2:停止所有虚拟机自带 MySQL 进程
1 | sudo pkill -f mysqld_safe |
- 确认端口已释放:
1 | sudo lsof -i:3306 |
- 输出为空表示干净
步骤 3:禁止虚拟机自带旧 MySQL 开机启动
- 禁用 init 脚本:
1 | sudo chkconfig mysql off |
- 检查 rc.local 或 cron:
1 | sudo cat /etc/rc.local |
- 注释掉任何启动 MySQL 的命令
- cron 任务如有也需删除
步骤 4:设置 Docker 容器开机自启
- 对已有容器设置自启:
1 | docker update --restart unless-stopped mysql |
- 启动容器:
1 | docker start mysql |
- 这样 mysql容器 会占用 3306,并且容器会随系统重启自动启动
步骤 5:确保 Docker 服务开机启动
1 | sudo systemctl enable docker |
- Docker 服务必须开机启动,容器自启才有效
步骤 6:验证
- 查看容器状态:
1 | docker ps |
- 确认容器状态是
Up
- 重启虚拟机:
1 | sudo reboot |
- 再次查看容器:
1 | docker ps |
- 如果容器
Up→ 开机自启成功
关键总结
- 手动安装 MySQL 通过
mysqld_safe守护进程不断重启 → 单 kill 无效 /etc/init.d/mysql脚本可能开机启动旧 MySQL →chkconfig mysql off禁用- 彻底释放端口后,再启动 Docker MySQL
- Docker 容器使用
--restart unless-stopped+ Docker 服务开机自启 → 容器随系统重启自动启动