【问题标题】:Connecting to MySQL Server on localhost through Docker通过 Docker 连接到本地主机上的 MySQL 服务器
【发布时间】:2014-12-23 09:18:54
【问题描述】:

所以,我通常可以通过 Docker 联系我的本地主机,方法是运行一个带有 --add-host=localbox:192.168.59.3 的容器。 ping localbox 工作得很好。问题是,我似乎无法从 MySQL 服务器获得响应。 mysql -h localbox,它在 docker 容器外部运行良好,只是让我从内部得到ERROR 2003 (HY000): Can't connect to MySQL server on 'localbox' (111)

我已经完成GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;

我已将bind-address = 0.0.0.0 添加到/etc/my.cnf 中。这些都没有帮助。什么给了?

上下文:我在 OS X Yosemite 上通过 boot2docker 运行所有这些。

【问题讨论】:

  • 似乎 localbox 没有被识别为有效的主机名。如果您在容器内使用 IP 地址而不是 localbox,会发生什么情况?
  • localbox 是一个有效的主机名。就像我说的,ping localbox 工作正常。
  • 你的意思是从容器内ping它吗?
  • 是的。除了运行容器和修改 mysql 服务器配置之外,我提到的所有内容都是在容器内进行的。
  • 你在运行netstat 得到了什么? MySQL 在监听吗?

标签: mysql docker boot2docker


【解决方案1】:

因此,事实证明这是自制软件的错误,其设计决策非常可疑。您可以通过运行推荐的launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist 在自制软件中启动 mysql-server。但是,当检查这个文件时,你会发现绑定地址是硬编码的!

  <array>
    <string>/usr/local/opt/mysql/bin/mysqld_safe</string>
    <string>--bind-address=127.0.0.1</string>
    <string>--datadir=/usr/local/var/mysql</string>
  </array>

因此,无论您在任何 my.cnf 文件中做什么,它都将始终绑定到 127.0.0.1,并且您将永远无法从容器中查询。我的解决方法是直接编辑这个文件而不提供绑定地址,这样我们就可以让 /etc/my.cnf 为我们做这件事。或者,虽然我不建议这样做,但您可以直接在此文件中更改绑定地址。

【讨论】:

    【解决方案2】:

    您可以使用

    将 mac 主机的网络添加到您的 docker 容器(在 boot2docker 中运行)
    --add-host=dh:10.0.2.2
    

    作为 docker run 命令的一部分或使用

    extra_hosts:
      - "dh:10.0.2.2"
    

    在您的 docker-compose.yml 文件中。

    在此之后,从安装了客户端的容器连接到 mysql 就像(例如)一样简单:

    $ mysql -h dh -uroot -p1234
    

    此解决方案不需要修改 mariadb/mysql 安装的设置,即使它绑定到 127.0.0.0。

    猜你喜欢
    • 1970-01-01
    • 2019-07-03
    • 2017-06-13
    • 1970-01-01
    • 2020-11-14
    • 2017-10-07
    • 2022-12-14
    • 2019-08-08
    • 2018-08-07
    相关资源
    最近更新 更多