无法从本地连接到 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
如果我尝试使用localhost
和127.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 数据库服务器