无法从本地主机连接到 Docker 中的 MySQL(Docker for Mac beta)
Posted
技术标签:
【中文标题】无法从本地主机连接到 Docker 中的 MySQL(Docker for Mac beta)【英文标题】:Unable to connect to MySQL in Docker from local host (Docker for Mac beta) 【发布时间】:2016-10-31 17:47:31 【问题描述】:在 Mac OS X El Capitan 上。
用于使用 Docker 工具箱。刚刚删除它并安装了 Docker for Mac beta。 (我认为拆卸和安装是干净的。)
基本上像这样启动 mysql 服务器容器:
docker run -e MYSQL_ROOT_PASSWORD=1234 -d mysql:5.7.13
(或 mysql/mysql-server:5.7.13)。启动似乎很好。然后我尝试通过“标准”方式从 Sequel Pro 连接到此服务器,主机 127.0.0.1,root,1234。得到
Unable to connect to host 127.0.0.1 because access was denied.
Double-check your username and password and ensure that access from your current location is permitted.
MySQL said: Access denied for user 'root'@'localhost' (using password: YES)
使用-p 3306:3306
没有帮助。
它曾经与我启动的 Docker Toolbox 一起工作
docker run \
-e MYSQL_ROOT_PASSWORD=1234 \
-d \
--expose 3306 \
-p 3306:3306 \
mysql:5.7.12
并连接到主机 192.168.99.100。效果很好。
我怀疑 Docker for Mac 在安装过程中“迁移”(将现有的 Docker 内容复制到新的 VM 中)可能会保留一些导致问题的旧数据(来自旧的 MySQL 容器),但不知道如何继续。
感谢您的帮助!
【问题讨论】:
我不想在宿主机上安装 MySQL 命令行客户端,所以我不能用mysql -h...
来测试。
你设置端口了吗?您提到使用 Docker Toolbox 使用 -p 将端口设置为 3306:3306。但是您没有将其包含在顶部的命令中。如果不是这样,我建议您尝试使用您机器的 ip(来自 ifconfig)以防万一……或 localhost。
注意在工具箱安装中,我用--expose
和-p
启动;在 Sequel Pro 上,我提供了“192.168.99.100”、“3306”、“root”、“1234”。那工作得很好。在 Docker for Mac 中,我没有使用 --expose
和 -p
。使用-p
给了我docker: Error response from daemon: driver failed programming external connectivity on endpoint local-docker-mysql (d9816ec5bc57dfd29df475195f3ab7d5b52fc0527677f1e705eecc02ebdac973): Error starting userland proxy: Failed to bind tcp 0.0.0.0:3306 address already in use.
官方MySQL docker页面示例不使用-p
。
您的 Mac 上是否运行 MySQL(将使用端口 3306)?
@techtabu 是的。我的机器上潜伏着一个 docker 前的 mysql 服务器安装。
【参考方案1】:
看起来您没有为来自其他主机而不是默认本地主机的 root 用户配置访问权限。
传递 -p 3306:3306 你只是创建了一个从主机到访客的端口转发。因此,您可以简单地允许您的用户从您的主机(即 172.17.0.1)连接到数据库。
例如我正在使用以下虚拟容器启动脚本来更改 root 的密码,以防它之前不会更改:
#!/bin/bash
cd $(dirname $0)
docker-compose up -d
ROOT_PASSWORD=root
CONTAINER=____mysql_container_name___
CHANGE_PASS_SQL="delete from mysql.user;grant all on *.* to 'root'@'%' identified by '$ROOT_PASSWORD' with grant option;flush privileges;"
CHANGE_PASS="docker exec -it $CONTAINER mysql -s -uroot -e \"$CHANGE_PASS_SQL\" 2>/dev/null"
WITH_PASS='echo "select now();" | docker exec -i $CONTAINER mysql -root -proot 1>&2 2>/dev/null'
NO_PASS='echo "select now();" | docker exec -i $CONTAINER mysql -root 1>&2 2>/dev/null'
WITH_PASS_EXIT_CODE=1000
NO_PASS_EXIT_CODE=1000
while [ $WITH_PASS_EXIT_CODE -gt 0 ];do
eval "$WITH_PASS"
WITH_PASS_EXIT_CODE=$?
eval "$NO_PASS"
NO_PASS_EXIT_CODE=$?
echo -n .
if [ $NO_PASS_EXIT_CODE -eq 0 ];then
eval "$CHANGE_PASS"
else
sleep 1
fi
done
echo
希望这会有所帮助。
【讨论】:
已解决。原来我在我不知情的情况下在我的机器上运行了 mysql。它是在 Docker 之前安装的。 ToolBox Docker 与 localhost 没有冲突,因此问题没有出现。清理了 mysql、boot2docker、VirtualBox。现在它正在工作。【参考方案2】:如果上述解决方案对您没有帮助,请检查您的计算机上是否已经启动了 MySql:
mysql.server status
如果它正在运行,您可以通过以下方式停止它:
mysql.server stop
之后,重建 DB docker 容器,一切都会正常工作:)
【讨论】:
以上是关于无法从本地主机连接到 Docker 中的 MySQL(Docker for Mac beta)的主要内容,如果未能解决你的问题,请参考以下文章
如何从 AWS SAM 本地 docker 实例连接到主机 MySQL?
Docker compose api无法连接到主机MongoDB数据库
允许 docker 容器连接到本地/主机 postgres 数据库