Docker将应用程序连接到mysql主机

时间:2018-01-25 17:37:05

标签: mysql docker ubuntu-16.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和host。但似乎没有任何作用。有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:3)

问题是您尝试使用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也将与主机共享。

答案 1 :(得分:0)

我认为您需要指定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