无法连接到 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 服务器的主要内容,如果未能解决你的问题,请参考以下文章