无法从本地连接到 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的主要内容,如果未能解决你的问题,请参考以下文章

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

无法在本地环境中使用 docker 连接到 cakephp 中的 mysql 数据库

我无法使用 DataGrip 数据库客户端从本地主机连接到 docker 中的 mysql

无法从 Spring Boot Docker 容器连接到本地 MySQL 数据库服务器

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

docker-compose 中的“无法连接到本地 MySQL 服务器”