无法从本地连接到mysql docker

时间:2018-02-27 23:31:05

标签: mysql docker

我正在尝试从docker镜像连接到mysql数据库。然而,它正在抛出错误。

以下是我正在使用的泊坞窗图片。 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'。

8 个答案:

答案 0 :(得分:22)

我遇到了同样的问题,但是对于使用运行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

答案 1 :(得分:16)

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

其次,您不能直接ping您的容器,而是在其他网络中,但您可以轻松使用其他容器来ping他。

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

如果您遇到问题,可以使用以下内容更改为旧的身份验证插件:

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

答案 2 :(得分:15)

我从docker-compose:

启动时找到了修复here
services:

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

也就是说,在启动MySQL时从新的MySQL密码/ auth机制恢复。

答案 3 :(得分:2)

如果您尝试使用终端本身连接到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

答案 4 :(得分:2)

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配置
  • 构建它:docker-compose.exe构建
  • 运行它:docker-compose.exe up

答案 5 :(得分:0)

这可能被认为已解决,但是我想记录一下克服该问题所花费的时间。我遇到了类似的问题,并且无法恢复到旧的密码标准。我需要使用caching_sha2_password,因此以上内容都不适合我,我不得不使用以下命令:

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

172.11.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”部分中。

答案 6 :(得分:0)

上面的信息很好,但这里有一个额外的想法,可能会对某些人有所帮助。 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 :(得分:-2)

如果您想使用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