无法连接到 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
来检查正在运行的容器中的端口映射。
您现在应该可以使用
连接到 MySQLmysql -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 容器内的 Spring Boot 连接到 Redis