当使用 Docker 启动 MySQL 容器失败时,可以按照以下步骤进行排查和解决:
错误表现:Bind for 0.0.0.0:3306 failed: port is already allocated
解决方案:
- 检查是否有其他 MySQL 实例正在运行:
bash
sudo netstat -tulnp | grep 3306
- 停止占用端口的服务,或者修改 Docker 容器的映射端口:
bash
docker run -p 3307:3306 --name mysql-container -e MYSQL_ROOT_PASSWORD=your_password -d mysql:tag
错误表现:Can't create/write to file '/var/lib/mysql/is_writable' (Errcode: 13 - Permission denied)
解决方案:
- 确保挂载的本地目录有正确权限:
bash
sudo chown -R 999:999 /path/to/your/local/mysql/data
- 或者使用 Docker 数据卷:
bash
docker volume create mysql_data
docker run --name mysql-container -v mysql_data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=your_password -d mysql:tag
错误表现:[ERROR] InnoDB: Cannot allocate memory for the buffer pool
解决方案:
- 增加 Docker 内存限制
- 或者调整 MySQL 配置减少内存使用:
bash
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=your_password -e MYSQL_INNODB_BUFFER_POOL_SIZE=64M -d mysql:tag
错误表现:Unknown variable
或 Invalid argument
解决方案:
- 检查环境变量拼写是否正确
- 参考官方文档使用正确的参数格式:
bash
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=your_password -e MYSQL_DATABASE=mydb -d mysql:tag
错误表现:各种兼容性问题
解决方案:
- 使用特定版本而非 latest 标签:
bash
docker pull mysql:8.0
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=your_password -d mysql:8.0
查看容器日志:
docker logs mysql-container
检查容器状态:
docker ps -a
进入容器排查:
docker exec -it mysql-container bash
尝试简单启动测试:
docker run --rm -it mysql:tag mysql --version
清理旧容器和数据(如果需要):
docker stop mysql-container
docker rm mysql-container
docker volume prune
# 使用数据卷和自定义配置的完整示例
docker volume create mysql_data
docker run -d \
--name mysql-container \
-p 3306:3306 \
-v mysql_data:/var/lib/mysql \
-v /path/to/custom.cnf:/etc/mysql/conf.d/custom.cnf \
-e MYSQL_ROOT_PASSWORD=your_secure_password \
-e MYSQL_DATABASE=myappdb \
-e MYSQL_USER=myappuser \
-e MYSQL_PASSWORD=myapppassword \
--restart unless-stopped \
mysql:8.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
如果问题仍然存在,请提供具体的错误日志以便更精确地诊断问题。