无法从本地主机(Docker for Mac beta)连接到MySQL中的Docker

5

在Mac OS X El Capitan上。

以前使用的是Docker工具箱。刚卸载了它并安装了Docker for Mac beta。(我认为卸载和安装都很干净)

基本上像这样启动一个MySQL服务器容器:

docker run -e MYSQL_ROOT_PASSWORD=1234 -d mysql:5.7.13

我尝试使用 "Standard" 方式通过 Sequel Pro 连接主机为 127.0.0.1,用户名为 root,密码为 1234 的服务器。该服务器使用的是 MySQL 或 MySQL-Server 版本为 5.7.13。启动似乎没有问题。

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内容复制到新的虚拟机中)可能会保留一些旧数据(来自旧的MySQL容器),导致出现问题,但不知道该如何继续操作。

感谢您的帮助!


我不想在主机上安装MySQL命令行客户端,因此我无法执行“mysql -h...”来测试东西。 - zpz
你设置了端口吗?你提到在使用Docker Toolbox时使用了-p来设置端口为3306:3306。但是你在顶部的命令中没有包含这个选项。如果不是这个问题,我建议尝试一下你机器的IP地址(从ifconfig命令中获取),或者尝试使用localhost。 - Nauraushaun
在安装工具箱时,我使用了 --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 参数。 - zpz
你的 Mac 上是否运行了 MySQL(将使用端口 3306)? - techtabu
@techtabu 是的。在使用 Docker 之前,我的计算机上安装了一个旧版的 MySQL 服务器。 - zpz
3个回答

3

看起来您还没有为root用户配置除默认的localhost以外的其他主机访问权限。

通过-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

希望这能有所帮助。

2
问题已解决。原来我的电脑上安装了我不知道的mysql。它是在Docker之前安装的。ToolBox Docker没有与localhost冲突,因此问题没有显示出来。清理了mysql、boot2docker和VirtualBox。现在它可以工作了。 - zpz

0
如果你想连接到在Docker上运行的MySQL,使用--protocol=TCP参数。
示例: mysql --protocol=TCP -uroot -p1234 请查看this链接获取更多详细信息。

-1
如果上述解决方案无法帮助您,请检查您的计算机上是否已经启动了MySql:
mysql.server status

如果它正在运行,您可以通过以下方式停止它:

mysql.server stop

之后,重新构建DB Docker容器,一切都应该正常工作 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接