无法从本地连接到 mysql docker

Posted

技术标签:

【中文标题】无法从本地连接到 mysql docker【英文标题】:not able to connect to mysql docker from local 【发布时间】:2018-08-07 17:57:13 【问题描述】:

我正在尝试从 docker 映像连接到 mysql 数据库。但是它会引发错误。

以下是我正在使用的 docker 镜像。 https://hub.docker.com/_/mysql/

以下是我用来运行 docker 映像的命令。

docker run -p 3306:3306 --name mysql_80 -e MYSQL_ROOT_PASSWORD=password -d mysql:8

以下是docker ps命令的输出

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                              NAMES
9f35d2e39476        mysql:8             "docker-entrypoint.s…"   5 minutes ago       Up 5 minutes        0.0.0.0:3306->3306/tcp

如果我使用 docker inspect 检查 IP 并 ping 该 IP,则显示 IP 不可访问。

docker inspect 9f35d2e39476 | grep -i ipaddress

如果我尝试使用localhost127.0.0.1 进行连接,则会出现以下错误。

无法加载身份验证插件“caching_sha2_password”。

【问题讨论】:

【参考方案1】:

首先,请注意您使用的是不稳定的软件,因此版本之间可能会有重大变化和意外行为。

编辑:不再开发,稳定版于 2018 年 4 月 19 日推出

其次,你不能直接ping你的容器,它在其他网,但是你可以很容易地用另一个容器来ping他。

mysql 8 使用caching_sha2_password 作为默认身份验证插件,而不是mysql_native_password。 More info here.

许多 mysql 驱动程序还没有添加对caching_sha2_password 的支持。

如果您遇到问题,可以更改为旧的身份验证插件,如下所示:

docker run -p 3306:3306 --name mysql_80 -e MYSQL_ROOT_PASSWORD=password -d mysql:8 mysqld --default-authentication-plugin=mysql_native_password

【讨论】:

谢谢,我将版本更改为 5 并解决了问题。 参数 --default-authentication-plugin 对我帮助很大,因为我默认安装 sha 256 并稍后尝试更改,即使通过 mysqlshel 也失去了对容器的所有访问权限。谢谢【参考方案2】:

我在从 docker-compose 启动时找到了一个修复 here:

services:

  db:
    image: mysql
    command: mysqld --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example

即在启动 MySQL 时从新的 MySQL 密码/身份验证机制恢复。

【讨论】:

在 PDO 更新他们的身份验证方法之前为 docker 人员提供正确答案 我正在寻找这样的东西,非常感谢...【参考方案3】:

我遇到了同样的问题,但是对于运行 mysql 8.X 的 Docker 容器,这并没有为我解决。 我登录了容器

docker exec -it CONTAINER_ID bash

然后以root身份登录mysql

mysql --user=root --password

输入root密码(默认为'root') 最后运行:

ALTER USER 'username' IDENTIFIED WITH mysql_native_password BY 'password';

一切就绪。

这里已经回答了这个问题:post

【讨论】:

每次重新启动容器时,我都必须重新执行此操作。您如何配置它使其成为永久性的? 重新启动容器时更改仍然存在。每次生成新容器时都必须重新执行此操作。如果你真的需要,你也许可以使用一个在启动/重启时运行的脚本,看看这个帖子***.com/questions/28522607/… 谢谢兄弟,这对我有用 :D,在 mac 环境中! 这是最好的答案。【参考方案4】:

psychemedia 的回答几乎对我有用(win 10 上的全新安装)。这也是我必须做的一件非常重要的事情,因为这不是我的第一次尝试。如果您已附加数据文件夹,在我的示例 mysql 卷中,首先,清空/删除此文件夹的内容。我的工作 docker-compose 文件:

version: '3'
services:
    mysql-development:
      image: mysql:8.0.19
      container_name: mysql
      command: --default-authentication-plugin=mysql_native_password
      environment:
        MYSQL_ROOT_PASSWORD: XXX
        MYSQL_DATABASE: YYY
        MYSQL_USER: ZZZ
        MYSQL_PASSWORD: WWW
      ports:
        - "3306:3306"
        - "33060:33060"
      working_dir: /var/lib/mysql
      volumes:
        - "./mysql:/var/lib/mysql:rw"
更新 docker-compose 文件中的环境变量。 为 mysql 数据(卷)创建文件夹:mkdir mysql 检查语法:docker-compose.exe config 构建它:docker-compose.exe 构建 运行它:docker-compose.exe up

【讨论】:

您先生,是救生员!确实,命令“命令:--default-authentication-plugin=mysql_native_password”与删除数据库的内容一样重要mysql_native_password 设置。这也修复了它,以便 Sequel Pro 可以在 mac 上运行!【参考方案5】:

如果您尝试使用终端本身连接到 MySQL,您可能会遇到错误的构建。但是,如果您尝试使用 GUI 客户端(例如 Sequel Pro)连接到 MySQL,它可能不支持 MySQL 8 的新身份验证功能。

作为一种解决方法,您可以在最后使用--default-authentication-plugin=mysql_native_password 命令启动 docker 容器,它会默认 MySQL 使用旧的身份验证:

docker run -p 3306:3306 --name mysql_80 -e MYSQL_ROOT_PASSWORD=password -d mysql:8 --default-authentication-plugin=mysql_native_password

【讨论】:

【参考方案6】:

上面的信息很好,但这里有一个额外的想法,可能会对一些人有所帮助。 root 帐号默认无法远程连接。要启用它,您必须包含主机权限。在版本 8(我使用的是 8.0.25)中,这可以通过设置 MYSQL_ROOT_HOST 来完成。 3.8 docker-compose.yml 的相关部分对我来说如下所示:

mysqldb:
    image: $REPONAME/mysql:$MYSQLDB_VERSION
    build:
      context: ./docker/mysqldb
      args:
        MYSQLDB_VERSION: $MYSQLDB_VERSION
    environment:
      MYSQL_ROOT_PASSWORD: $MYSQL_ROOT_PASSWORD
      MYSQL_ROOT_HOST: "%"
      MYSQL_DATABASE: dbname
      MYSQL_USER: dbuser
      MYSQL_PASSWORD: dbpass
    command: [mysqld, --default-authentication-plugin=mysql_native_password, --character-set-server=utf8mb4, --collation-server=utf8mb4_unicode_ci, --innodb_monitor_enable=all, --max-connections=1001]
    ports:
      - 3306:3306
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      timeout: 10s
      retries: 10

【讨论】:

【参考方案7】:

如果您想使用 MySQL 8.0 并且不出现“caching_sha2_password 插件”错误,请查看我写的几篇关于如何使用持久数据在 Docker 中设置 MySQL 8.0 的博客文章,以及关于如何运行的文章带有 mysql_native_password 的 MySQL 8.0 容器。

简而言之,您可以创建一个本地“my.cnf”配置文件:

$ sudo nano /usr/local/opt/mysql/config/my.cnf`

添加必要的配置语句:

[mysqld]
default-authentication-plugin=mysql_native_password

然后将该文件作为卷绑定包含在您的“docker run”语句中:

$ docker run --restart always --name mysql8.0 - 
v/usr/local/opt/mysql/8.0:/var/lib/mysql -v 
/usr/local/opt/mysql/config:/etc/mysql/conf.d -p 3306:3306 -d -e 
MYSQL_ROOT_PASSWORD=your_password mysql:8.0

您可以在此处阅读有关这些步骤的更多详细信息:

https://medium.com/@crmcmullen/how-to-run-mysql-in-a-docker-container-on-macos-with-persistent-local-data-58b89aec496a

https://medium.com/@crmcmullen/how-to-run-mysql-8-0-with-native-password-authentication-502de5bac661

【讨论】:

Octavian,感谢您的精彩评论。它被频道监督者否决了,因为我引用了我自己的博客文章,这被认为没有帮助。显然,如果您在其他地方有其他有用的内容,则应将其粘贴到您的回复中,否则将被视为自助服务。【参考方案8】:

这可能被认为已解决,但我想记录下我是如何克服这个问题的。我遇到了类似的问题,恢复到旧的密码标准不是解决方案。我需要使用caching_sha2_password,所以上述方法都不适合我,我不得不使用这个命令:

docker run -it --rm mysql mysql -h 172.31.116.20 -p -P6603

其中 172.31.116.20 是运行容器的本地 IP 地址,-P6603 是运行容器的端口。

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
5092251b3dbf        mysql               "docker-entrypoint..."   16 minutes ago      Up 16 minutes       33060/tcp, 0.0.0.0:6603->3306/tcp   test1-mysql

我在 Docker 站点上为 MySQL 容器找到了这个解决方案:https://hub.docker.com/_/mysql/

它位于“从 MySQL 命令行客户端连接到 MySQL”部分。

【讨论】:

以上是关于无法从本地连接到 mysql docker的主要内容,如果未能解决你的问题,请参考以下文章