2015-01-21 119 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

相關問題