Docker部署MySQL无法连接问题求助(NestJS+TypeORM环境)
Docker部署MySQL无法连接的排查方案
问题场景
使用NestJS、TypeORM和Docker搭建API时,启动MySQL容器后无法从宿主机连接,执行命令及报错如下:
[mile@miles book-api]$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=12345 -d mysql:latest 3818cc3467f4ffc8be132a9670b097cc316ee75597d996635060b24213d7716b [mile@miles book-api]$ mysql -u root -h 172.17.0.2 -p12345 mysql: Deprecated program name. It will be removed in a future release, use '/usr/bin/mariadb' instead ERROR 2002 (HY000): Can't connect to server on '172.17.0.2' (115)
操作目录包含.env、ormconfig.json和docker-compose.yml文件,已拉取mysql:latest镜像。
已尝试的无效方案
- 切换到MariaDB(不符合工作要求,放弃)
- 确认容器IP地址正确
- 验证root密码正确
- 确认容器处于运行状态(无异常)
- 修改宿主机MariaDB配置文件
/etc/mysql/mariadb.conf.d/50-server.cnf,将bind-address = 127.0.0.1改为bind-address = 0.0.0.0并重启服务(无效)
可能的错误原因及解决方法
1. 容器端口未映射到宿主机
当前启动命令未做端口映射,宿主机无法直接通过容器IP访问MySQL服务。需添加端口映射参数重新启动容器:
docker run --name mysql -e MYSQL_ROOT_PASSWORD=12345 -p 3306:3306 -d mysql:latest
之后可通过localhost或宿主机IP连接:
mysql -u root -h localhost -p12345
2. MySQL用户权限限制
MySQL 8.0+默认root用户仅允许本地登录,需修改权限允许远程访问:
- 进入容器:
docker exec -it mysql bash - 登录MySQL:
mysql -u root -p12345 - 执行权限修改SQL:
ALTER USER 'root'@'%' IDENTIFIED BY '12345'; FLUSH PRIVILEGES;
注意:生产环境请勿直接开放
%权限,建议指定特定IP段以提升安全性。
3. 宿主机防火墙拦截
检查宿主机防火墙是否开放3306端口,以Raspbian系统为例:
sudo ufw allow 3306 sudo ufw reload
4. Docker网络配置异常
- 通过以下命令确认容器IP是否正确:
docker inspect mysql | grep "IPAddress" - 若使用自定义Docker网络,需确保容器与宿主机处于同一网络环境,或通过端口映射进行访问。
内容的提问来源于stack exchange,提问作者MS0L
相关产品推荐
相关产品推荐

