docker.io - Docker应用程序和数据库容器之间的链接

4
我将尝试使用Scala-Akka应用程序与两个独立的Docker容器中的MySQL数据库进行交互。我发现Docker允许开发人员使用名为--link的标志将他们的应用程序链接到数据库。在我的Dockerfiles中,我已经添加了EXPOSE 3306 8080以创建映像。以下是我运行容器的方式:
docker run -d -p 3306:3306 --name mysql centos6mysql
docker run -d -p 8080:8080 --name scalaapp --link mysql:db centos6scala

在运行容器后,我使用了docker ps命令,并能够看到活动的容器。然而,似乎应用程序容器没有使用来自MySQL容器的数据库。有人知道问题出在哪里吗?


2
你可能需要更明确地说明你所说的“应用容器似乎没有使用MySQL容器中的数据库”。 - Mykola Gurov
我创建了一个RestCore脚本,用于启动我的Scala-Akka应用程序。当我运行应用程序容器时,基本上会启动该脚本。 - Hans
我的脚本将允许我将端口8080绑定到容器。在运行应用程序和数据库容器之后,我转到浏览器并输入http://<主机IP地址>:8080/v1/<某个组织>/1。期望:它将返回ID为1的DB记录。现实情况是:它只是显示内部服务器错误。 - Hans
1个回答

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应用程序容器以连接到您的DB容器。但是,您必须手动配置应用程序容器才能这样做。Docker不会自动为您建立连接。
因此,在您的应用程序中的某个地方,您需要将这些值传递给启动脚本,类似于以下内容:
./restcore --Ddb.default.db="jdbc:mysql//${DB_PORT_3306_TCP_ADDR}:${DB_PORT_3306_TCP_PORT"

我已经相应地编辑了我的MySQL连接器jar文件,使用的是${DB_PORT_3306_TCP_ADDR}:${DB_PORT_3306_TCP_PORT}/mydb。我使用环境变量-e "DB_PORT_3306_TCP_ADDR=<MySQL容器IP>" -e "DB_PORT_3306_TCP_PORT=3306"运行应用程序容器。我不知道为什么Docker链接没有自动设置我的环境变量。之后,我在端口8080上通过浏览器检查结果,它仍然没有显示我想要的数据库记录... - Hans
我发现即使使用了我的应用程序和数据库容器之间的链接,它甚至没有设置我的环境变量。虽然我已经在我的MySQL Dockerfile中暴露了3306端口... - Hans
我已经解决了这个问题。现在它可以工作了,数据库记录也可以看到了。我的做法是进入我的应用程序容器并使用 env 检查环境。它显示了 MySQL 的环境变量!由于某种原因,检查容器时没有列出这些变量,但是进入容器并从中检查就可以了。感谢您的帮助! :) - Hans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接