【问题标题】:Can't connect to mysql container from localhost无法从 localhost 连接到 mysql 容器
【发布时间】:2017-03-18 22:10:02
【问题描述】:

我正在尝试设置一个 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 进行连接,并使用子 IP docker 给了它0.0.0.0:3306

更新

在我的 Mac 上成功连接后,我在我的 linux 上再次尝试使用 DBeaver 并再次尝试:

尝试连接其他工具,mysql workbench:

【问题讨论】:

  • 它在这里工作。你可以在 shell 中连接到你的 MySQL 服务器吗?
  • @Zoyd 我没有。我从来没有在终端上使用过它。我需要下载mysql才能在终端上使用吗?
  • 您是在 Linux 主机上运行它,还是在 Windows 或 macOS 上使用 Docker Machine 之类的东西?如果您使用的是 Docker Machine,则必须连接到 Docker Machine VM 的 IP 地址,而不是 localhost。另外,将端口映射条目更改为 3306:3306,去掉其中的 localhost 部分...
  • 我使用的是 Linux,Ubuntu。
  • 然后将端口定义更改为3306:3306 并尝试使用您的 MySQL 客户端连接到 localhost:3306。

标签: mysql docker docker-compose


【解决方案1】:

正如您在官方图片文档中看到的那样:

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

因此,您必须将MYSQL_ROOT_HOST 变量设置为地址172.18.0.1,您可以在错误消息中看到。

【讨论】:

  • 谢谢!这应该被接受为这个问题的正确答案。
【解决方案2】:

在 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 修复了
【解决方案3】:

我是 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 down
    $ docker-compose up重新启动 docker-compose br>
  4. 等待 MySQL 启动,它现在应该可以正常工作了。

【讨论】:

    猜你喜欢
    • 2019-04-01
    • 1970-01-01
    • 2020-02-25
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 2020-07-14
    • 1970-01-01
    相关资源
    最近更新 更多