无法从localhost

时间:2017-03-18 22:10:02

标签: mysql docker docker-compose

我正在尝试设置一个用于开发的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: enter image description here

尝试连接其他工具,mysql workbench: enter image description here

3 个答案:

答案 0 :(得分:1)

正如你在官方图片文件中看到的那样:

  

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

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

答案 1 :(得分:1)

在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或任何其他客户端的连接,它应该可以正常工作。

答案 2 :(得分:0)

我是docker的新手,在Linux中也遇到了同样的问题,这是地址被允许接受连接的问题;这是为我解决的问题:

  1. 找到名为 mysqld.cnf 的MySql配置文件
    或者是/etc/mysql/mysql.conf.d/mysqld.cnf
    ,或者如果您有自己的配置文件。
  2. 在其中编辑绑定地址键。
    将其设置为:
    bind-address = 0.0.0.0
  3. 这将允许接受来自任何IP地址的连接

    $ docker-compose down
    $ docker-compose up
  4. 等待MySQL启动,现在应该可以正常工作。