【问题标题】:not able to connect to mysql docker from local无法从本地连接到 mysql docker
【发布时间】:2018-11-09 23:31:08
【问题描述】:

我正在尝试从 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”。

【问题讨论】:

    标签: mysql docker


    【解决方案1】:

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

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

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

    mysql 8 使用caching_sha2_password 作为默认身份验证插件,而不是mysql_native_passwordMore 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

    【讨论】:

    • 每次重新启动容器时,我都必须重新执行此操作。您如何配置它使其成为永久性的?
    • 重新启动容器时更改仍然存在。每次生成新容器时都必须重新执行此操作。如果你真的需要,你也许可以使用一个在启动/重启时运行的脚本,看看这个帖子stackoverflow.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”部分。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-22
          • 1970-01-01
          • 2015-05-02
          • 2018-11-04
          • 1970-01-01
          • 1970-01-01
          • 2019-07-03
          相关资源
          最近更新 更多