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

无法从本地主机连接到Docker中的MySQL(Docker for Mac beta版),mysql,docker,localhost,Mysql,Docker,Localhost,在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服务器:5.7.13)。启动似乎很好。然后我尝试从Sequel Pro通过“标准”方式连接到该服务器,主机127.0.0.1,root,1234。得

在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服务器: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)
使用
-p3306:3306
没有帮助

它曾经和Docker工具箱一起工作,我是在那里启动的

    docker run \
      -e MYSQL_ROOT_PASSWORD=1234 \
      -d \
      --expose 3306 \
      -p 3306:3306 \
      mysql:5.7.12
并连接到主机192.168.99.100。效果很好

我怀疑Mac“迁移”Docker在安装期间(将现有Docker内容复制到新VM中)可能会保留一些导致问题的旧数据(来自旧MySQL容器),但不知道如何继续


谢谢你的帮助

看起来您尚未配置根用户从其他主机而不是默认本地主机的访问权限

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

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

mysql.server stop

在那之后,重建DB docker容器,一切都会正常工作:)

我不想在主机上安装MySQL命令行客户端,因此我无法执行
MySQL-h…
测试。您设置了端口吗?您提到使用Docker Toolbox时使用-p将端口设置为3306:3306。但是你没有把它包括在你的高层指挥中。如果不是这样的话,我建议您尝试一下您机器的ip(从ifconfig)以防万一…或本地主机。注意,在工具箱安装中,我启动了
--expose
-p
;在Sequel Pro上,我提供了“192.168.99.100”、“3306”、“root”、“1234”。效果很好。在Docker for Mac中,我没有使用
--expose
-p
。使用
-p
为我提供了
docker:来自守护进程的错误响应:驱动程序未能在端点本地docker mysql上编程外部连接(d9816ec5bc57dfd29df475195f3ab7d5b52fc0527677f1e705eecc02ebdac973):启动userland代理时出错:无法绑定已在使用的tcp 0.0.0.0:3306地址。
官方MySQL docker页面示例未使用
-p
。您的Mac上是否运行MySQL(将使用端口3306)?@techtabu是。docker days之前安装的mysql服务器潜伏在我的机器上。已解决。结果是我在不知情的情况下在我的机器上运行mysql。它安装在Docker之前。工具箱Docker与localhost没有冲突,因此没有显示问题。清理了mysql、boot2docker和VirtualBox。现在它开始工作了。