无法从本地主机连接到mysql容器

12

我正在尝试设置一个用于开发的MySQL容器。

所以我使用了docker-compose来设置它。

容器和MySQL看起来都没问题。问题是我想从DBeaver客户端连接到它,但我找不到如何操作。

这是我的docker-compose.yml文件:

version: '2'
services:
  db:
    image: 'mysql:5.7'
    volumes:
       - '~/dev/dbs-data/mysql:/var/lib/mysql'
    restart: 'always'
    expose: 
      - '3306'
    ports:
      - '3306:3306'
    environment:
       MYSQL_ROOT_PASSWORD: 'pass'
       MYSQL_DATABASE: 'db'
       MYSQL_USER: 'user'
       MYSQL_PASSWORD: 'pass'

当我尝试从DBeaver连接它时,我收到以下信息:

java.sql.SQLException: null,  message from server: 
"Host '172.18.0.1' is not allowed to connect to this MySQL server"

更新

我并非尝试使用IP 172.18.0.1 进行连接。我已经尝试使用 localhost:3306127.0.0.1:3306,以及docker分配的子IP 0.0.0.0:3306 进行连接。

更新

在我的Mac上成功连接后,我又尝试在我的Linux上用DBeaver连接,但是还是出现了以下错误: 图片描述

我还尝试使用其他工具mysql workbench进行连接: 图片描述


1
它在这里可以工作。你能否在shell中连接到你的MySQL服务器? - Zoyd
@Zoyd 我没有。我从来没有在终端上使用过它。我需要下载mysql才能在终端上使用吗? - Giovane
你是在Linux主机上运行这个程序,还是在Windows或macOS上使用Docker Machine?如果你正在使用Docker Machine,你必须连接到Docker Machine虚拟机的IP地址,而不是localhost。此外,在端口映射条目中只需更改为3306:3306,并且去掉其中的localhost部分... - nwinkler
我正在使用Linux,Ubuntu。 - Giovane
@nwinkler 我在我的 Linux 上尝试了相同的配置,这个配置我已经在我的 Mac 上测试过了。但是 DBeaver 给我的回应是:java.sql.SQLException: null, message from server: "Host '172.18.0.1' is not allowed to connect to this MySQL server" - Giovane
显示剩余2条评论
3个回答

11

如您在官方的图像文档中所见:

MYSQL_ROOT_HOST:默认情况下,MySQL会创建'root'@'localhost'帐户。该帐户只能从容器内部连接,需要使用docker exec命令,如在“从MySQL命令行客户端连接到MySQL”中所述。要允许来自其他主机的连接,请设置此环境变量。例如,“172.17.0.1”这个值是默认的Docker网关IP地址,将允许来自Docker主机的连接。

因此,您需要使用错误消息中所示的地址 172.18.0.1 设置 MYSQL_ROOT_HOST 变量。


2
谢谢!这应该被接受为这个问题的正确答案。 - Felipe Mosso

4
在Docker上运行以下命令创建一个MySQL容器,并将端口暴露给Docker外部世界。 docker run --name <mysql-container-name> -p 3306:3306 -e MYSQL_ROOT_PASSWORD=<root-password> -e MYSQL_USER=root -e MYSQL_PASSWORD=<user-password> -d mysql:latest 需要注意的几点: 在使用 DBeaver 连接时可能会出现以下错误: Public Key Retrieval is not allowed 解决方法:在 DBeaver 上创建新的连接,进入 Driver Properties 找到 allowPublicKeyRetrievel 并设置为 TRUE。如果需要,还可以将 useSSL 设置为 FALSE
从 DBeaver 或任何其他客户端测试您的连接,应该能够正常工作。

我通过添加选项“-p 3306:3306”进行了修复。 - duyetpt

0

我对Docker还很陌生,在Linux上遇到了相同的问题,因为允许接受连接的地址有问题,以下是解决方法:

  1. 找到名为mysqld.cnf的MySQL配置文件
    它可能在: /etc/mysql/mysql.conf.d/mysqld.cnf
    或者如果您有自己的配置文件。
  2. 编辑其中的bind-address键。将其设置为:
    bind-address=0.0.0.0
  3. 这将允许从任何IP地址接受连接。
    通过以下命令重启docker-compose:
    $ docker-compose down
    $ docker-compose up
  4. 等待MySQL启动,现在应该可以正常工作了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接