Dockerized Web应用程序连接到主机

时间:2015-06-17 08:48:42

标签: mysql jdbc docker

我想迁移我的应用程序部署以使用docker / docker hub。当前的生产设置是在两台Linux服务器之间平衡流量,运行Apache,Tomcat和MySQL。 Java Web应用程序通过JDBC连接到主+从MySQL数据库。

为了最大限度地减少此更改的影响,作为第一步,我正在考虑将tomcat和Web应用程序容纳在容器中。让Apache和MySQL像现在一样在主机上运行。

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

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

我已经玩了一段时间了,我无法相信没有比我上面提出的更好的解决方案。

有人做过这样的事吗?任何人都对如何最好地解决这个问题有任何建议。

修改 有人建议" From inside of a Docker container, how do I connect to the localhost of the machine?"与此重复 - 但潜在的问题仍然存在。每次我从图像创建Docker容器时,我都可能获得需要被授予访问DB的容器的新IP地址。我想尽量避免这样做。

非常感谢

2 个答案:

答案 0 :(得分:4)

你应该使用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

现在您可以从环境变量中获取数据库的地址和端口:

docker exec -it some-app printenv

寻找类似:MYSQL_PORT_3306_TCP_PORT的内容。现在,您只需在应用中使用这些变量。

有关Docker MySQL RepoDocker docs的更多信息。

答案 1 :(得分:3)

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

要找到它:

ifconfig | grep -A 1 docker0

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

这将允许所有容器来自docker接口。