【问题标题】:Docker connect app to mysql hostDocker将应用程序连接到mysql主机
【发布时间】:2018-01-25 17:37:04
【问题描述】:

我在 vm 中安装了 Ubuntu 16.04,我正在尝试在 docker 容器中运行应用程序并将其连接到主机上的 MySQL 数据库

我有这样的东西......在我有 MySQL 的主机上:

当我尝试将我的应用程序连接到 MySQL 时,我得到了这个:

java.sql.exception: 无法创建 poolableConnectionFactory(无法创建与数据库服务器的连接。尝试重新连接 3 次

我使用 docker-compose 执行我的应用程序:

version: '2'
services:
  exo:
    image: exoplatform/exo-community:5.0
    environment:
      EXO_DB_TYPE: mysql
      EXO_DB_NAME: user
      EXO_DB_USER: root
      EXO_DB_PASSWORD: "my-pass"
      EXO_DB_HOST: "127.0.0.1"
      EXO_ADDONS_LIST: exo-jdbc-driver-mysql
    expose:
      - "8080"
      - "3306"
    ports:
      - "8080:8080"
    volumes:
      - exo_data:/srv/exo
      - exo_logs:/var/log/exo
volumes:
  exo_data:
    external:
      name: exo_data
  exo_logs:
    external:
      name: exo_logs
networks:
  default:
      driver: bridge

如您所见,我尝试连接到 MySQL 默认端口...而且我刚刚看到 3306 端口正在侦听主机。

我还尝试添加以下行(在另一篇文章中看到)

在 my.cnf 我有绑定地址 0.0.0.0。

MySQL 正在运行:

root@xxx/# mysqladmin -u root -p status

Uptime: 4784  Threads: 4  Questions: 17  Slow queries: 0  Opens: 114  Flush tables: 1  Open tables: 33  Queries per second avg: 0.003

我在桥上使用 docker,所以我想我只需要在 docker composer 上添加端口即可连接 docker 和主机。但似乎没有任何效果。有人能指出我正确的方向吗?

【问题讨论】:

  • 我认为您需要指定 IP 地址并为您的 DB GRANT ALL ON fooDatabase 授予权限。* TO fooUser@'1.2.3.4' IDENTIFIED BY 'my_password';
  • mysql 没有在容器中运行对吧?

标签: mysql docker ubuntu-16.04


【解决方案1】:

问题是您尝试使用localhost 从容器连接到主机。这不起作用,因为容器有自己的 ip,并且 localhost 将访问容器而不是主机。

从容器连接到主机是 stackoverflow 上一个非常常见的问题,您可以在 From inside of a Docker container, how do I connect to the localhost of the machine? 找到很多答案

最简单的方法(虽然不推荐)是在 docker-compose 文件中使用network_mode: host。在这种情况下,容器将与主机共享网络,并且 localhost 也将访问主机。

【讨论】:

  • 我只是将 network_mode 行添加到作曲家文件中,一切都开始工作了。这仅用于测试,在生产环境中我们将使用桥接器。所以谢谢,你解决了我的问题!
【解决方案2】:

我认为你需要指定 IP 地址:

mysql -u root -p -h 44.55.66.77

并为您提供特权:

DB GRANT ALL ON yourDatabase.* TO root@’1.2.3.4’ IDENTIFIED BY ‘my-pass’;

要获取容器内的 IP 地址,您可以运行以下命令:

awk 'END{print $1}' /etc/hosts

【讨论】:

  • 我只使用了授予权限的命令.. 我忘记在帖子中提及了,对不起。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-23
  • 2017-11-02
  • 1970-01-01
  • 2018-01-31
相关资源
最近更新 更多