无法连接到 Docker 内的 MySQL 服务器

Posted

技术标签:

【中文标题】无法连接到 Docker 内的 MySQL 服务器【英文标题】:Cannot connect to MySQL server inside Docker 【发布时间】:2017-03-14 19:18:45 【问题描述】:

首先我运行mysql镜像:

docker run -e MYSQL_ROOT_PASSWORD=password  -d  -p 127.0.0.1:3308:3306 mysql

然后我使用容器 bash:

docker exec -it my_container_name bash

在 Bash 中,我可以通过命令成功连接到 MySQL 服务器:

mysql -uroot -ppassword

但是当我尝试从 Windows cmd 连接到 MySQL 容器时:

mysql -uroot -ppassword -h127.0.0.1 -P3308

ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (10061)

如果我改为连接到192.168.99.100(这个ip是docker-machine ip返回的),那么结果是一样的。

问题是:如何正确地将 Docker 内部的 MySQL 端口暴露给 Windows 外部?

【问题讨论】:

如果您使用 Docker Machine,则必须使用 Docker Machine VM 的 IP 地址而不是 127.0.0.1:mysql -uroot -ppassword -h192.168.99.100 -P3308。 192.168.99.100 通常是 Docker Machine VM 的 IP。 nwinkler 确实,192.168.99.100 返回购买 docker-machine ip 命令。但它替换 ip 并没有帮助 您能否运行docker ps -a 来检查端口映射是否设置正确? @nwinkler 它为 mysql 图像返回 127.0.0.1:3308->3306/tcp 您可以尝试从docker run 命令中删除127.0.0.1 吗? docker run -e MYSQL_ROOT_PASSWORD=password -d -p 3308:3306 mysql 【参考方案1】:

首先,检查netstat -an 以确保端口在 Windows 中打开。如果是,请检查 Windows 防火墙以确保没有任何东西阻止与端口的连接。

我的大部分 Docker 经验都在 CoreOS 中,所以我不确定 Windows 如何处理将流量路由到容器中。在 CoreOS 中,它使用proxy。如果 Windows 中有代理,请确保没有任何干扰。

【讨论】:

它没有打开,甚至在 netstat -an 输出中都没有提到【参考方案2】:

错误在于原始docker run命令中的端口映射,您只需要提供端口,而不是IP地址:

docker run -e MYSQL_ROOT_PASSWORD=password -d -p 3308:3306 mysql

您可以运行docker ps -a 来检查正在运行的容器中的端口映射。

您现在应该可以使用

连接到 MySQL
mysql -uroot -ppassword -h192.168.99.100 -P3308

【讨论】:

对于所有在这里和我一样的人.. 默认身份验证模式在 mysql8 中已更改,因此如果您仍然无法登录,请尝试docker run -e MYSQL_ROOT_PASSWORD=password -d -p 3308:3306 mysql:5.7 它只在添加空格时起作用 mysql -u root -p -h 127.0.0.1 -P 3308【参考方案3】:

更改运行映像的端口有效。 我检查了这个端口是否被其他东西使用,但它没有被使用。所以我只是-拼命地-在不同的端口'3309'中运行一个新容器。而且效果很好!

【讨论】:

【参考方案4】:

确保您已使用 -P 输入端口。

【讨论】:

以上是关于无法连接到 Docker 内的 MySQL 服务器的主要内容,如果未能解决你的问题,请参考以下文章

Django docker 容器无法连接到 mysql 容器,出现错误“无法连接到 'db' (111) 上的 MySQL 服务器”)

无法连接到 Docker 容器内的 MongoDB

无法连接到 docker 容器内的 SQL Server

无法从 docker 容器内的 Spring Boot 连接到 Redis

无法连接到在 Docker 操场上运行的 mysql 服务器 docker 容器

无法从 docker 容器连接到 Localhost Mysql