无法从本地主机连接到 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 数据库

无法从 docker windows 容器中的 asp.net 核心应用程序连接到主机数据库

如何从 docker (Prisma) 连接到主机数据库

无法使用 JDBC 连接到 docker 中的本地 MySQL