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

时间:2016-06-29 06:59:45

标签: mysql docker localhost

在Mac OS X El Capitan上。

用于使用Docker Toolbox。刚删除并安装了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连接到这台服务器,通过" Standard"方式,主机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" migration"在安装过程中(将现有的Docker内容复制到新VM中)可能会保留一些导致问题的旧数据(来自旧的MySQL容器),但不知道如何继续。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

您似乎没有为其他主机配置root用户访问权限,而不是默认localhost。

传递 -p 3306:3306 您只需创建一个从主机转发到来宾的端口。因此,您只需允许您的用户从您的hist机器连接到数据库,即172.17.0.1。

E.g。我正在使用以下虚拟容器启动脚本,它会更改root的密码,以防它在以前不会更改:     #!/斌/庆典

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

希望这会有所帮助。

答案 1 :(得分:0)

如果上述解决方案对您没有帮助,请检查您的计算机上是否已启动MySql:

mysql.server status

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

mysql.server stop

在那之后,重建数据库docker容器,一切都会正常:)