Docker化的Web应用程序连接到主机上的MySQL数据库

我想迁移我的应用程序部署以使用docker / docker集线器。 目前的生产设置是负载平衡两台Linux服务器,运行Apache,Tomcat和MySQL的stream量。 Java Web应用程序通过JDBC连接到主+从MySQL DB。

为了尽量减less这种变化的影响,作为第一步,我正在寻找容器化tomcat和web应用程序。 像现在一样,让Apache和MySQL在主机上运行。

我遇到的问题是将在Docker容器中运行的应用程序连接到在主机上运行的MySQL DB。

我现在可以做的最好的事情是连接到docker容器,获取它的IP地址,然后使用SQL GRANT来允许IP地址访问数据库。 这样做的麻烦在于,每次运行一个容器时都可能会得到一个新的IP地址,因此每次都需要运行一个授权。

我一直在玩这个东西一段时间,我不相信没有比我上面提出的更好的解决scheme。

任何人都做了这样的事情? 任何人都有如何最好地解决这个问题的任何build议。

编辑已经有人build议“ 从Docker容器内部,如何连接到本机的本地主机? ”是一个重复的 – 但是底层的问题依然存在。 每次我从图像中创build一个Docker容器时,我都可能获得需要被授权访问数据库的容器的新IP地址。 我想尽量避免这样做。

非常感谢

你应该使用dockerized MySQL服务器和连接两个容器的Docker的link命令。

首先运行你的MySQL:

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql

然后运行你的应用程序的link

docker run --name some-app --link some-mysql:mysql -d app-that-uses-mysql

现在你可以从环境variables中获得数据库的地址和端口:

docker exec -it some-app printenv

寻找类似于: MYSQL_PORT_3306_TCP_PORT 。 现在你只需要在你的应用程序中使用这些variables。

有关Docker MySQL Repo和Docker文档的更多信息。

SQL GRANT应该使用来自docker0接口的IP而不是容器中的特定IP。

要find它使用:

 ifconfig | grep -A 1 docker0 

inet addr:之后的IP inet addr:最可能是172.17.42.1

这将允许来自docker界面的所有容器。