2015-01-21 107 views
4

我想在两个独立的Docker容器上使用我的Scala-Akka应用程序和我的MySQL数据库。我发现Docker允许开发人员使用名为--link的标志将他们的应用程序链接到他们的数据库。在我用来创建图像的Dockerfiles中,我添加了EXPOSE 3306 8080。docker.io - 应用程序和数据库容器之间的Docker链接

这就是我如何运行容器:

docker run -d -p 3306:3306 --name mysql centos6mysql 
docker run -d -p 8080:8080 --name scalaapp --link mysql:db centos6scala 

运行容器后,我用码头工人PS和我能看到积极的容器。但是,看起来应用程序容器并未使用MySQL容器中的数据库。任何人都知道什么是错的?

+2

你可能想更明确的了解你的意思是由>看来就像应用程序容器没有使用MySQL容器中的数据库一样。 – 2015-01-21 08:28:25

+0

我创建了一个restcore脚本,启动我的scala-akka应用程序。当我运行它时,我的应用程序容器将基本启动脚本。 – Hans 2015-01-21 09:09:22

+0

我的脚本将允许我将一个8080的端口绑定到容器。在运行app和db容器之后,我继续浏览器并输入http:// :8080/v1//1。期望值:它将向我返回ID为1的数据库记录。现实:它只是表示内部服务器错误 – Hans 2015-01-21 09:11:08

回答

6

Docker中的链接允许在容器之间建立网络连接。 Docker会为链接的容器定义URL,IP,端口和协议的环境变量。这些名称将基于您的容器名称。例如:

DB_NAME=/web2/db 
DB_PORT=tcp://172.17.0.5:5432 
DB_PORT_5432_TCP=tcp://172.17.0.5:5432 
DB_PORT_5432_TCP_PROTO=tcp 
DB_PORT_5432_TCP_PORT=5432 
DB_PORT_5432_TCP_ADDR=172.17.0.5 

您可以使用这些环境变量来设置您的Akka应用容器以连接到您的数据库容器。但是,您必须手动配置应用程序容器才能这样做。 Docker不会自动为您建立连接。

因此,地方在你的应用程序,则需要将这些值传递给你的启动脚本,一些可能看起来像:

./restcore --Ddb.default.db="jdbc:mysql//${DB_PORT_3306_TCP_ADDR}:${DB_PORT_3306_TCP_PORT" 
+0

我已在我的MySQL连接器jar文件中使用$ {DB_PORT_3306_TCP_ADDR}:$ {DB_PORT_3306_TCP_PORT}/mydb对其进行了相应编辑在restcore脚本文件中。我使用环境变量运行应用程序容器-e“DB_PORT_3306_TCP_ADDR = ”-e“DB_PORT_3306_TCP_PORT = 3306”。我不知道为什么Docker链接不会自动设置我的环境变量。之后,我使用8080端口在浏览器上查看结果,但它仍然不显示我想要的数据库中的记录... – Hans 2015-01-22 02:37:12

+0

我发现的是,即使在使用我的应用程序和db容器之间的链接之后,它甚至不设置我的环境变量。我已经在我的MySQL Dockerfile上公开了3306 ... – Hans 2015-01-22 04:02:49

+0

我已经解决了这个问题。它现在可以工作,可以看到数据库记录。我所做的是我执行到我的应用程序容器中,并使用env检查环境。它显示了MySQL环境变量!出于某种原因,检查容器不会列出变量,而是进入容器并从中检查。谢谢你的帮助! :) – Hans 2015-01-22 05:09:43

相关问题