2015-04-01 198 views
3

我試圖將運行在Apache Tomcat容器中的Web服務器連接到運行其他容器的MySQL數據庫。爲了做到這一點,我使用了Docker的鏈接機制。Docker - 將Apache Tomcat Web服務器連接到MySQL服務器

docker run -it --name ${CONTAINER_NAME} --link db:db -p 8080:8080 -d tomcat 

運行容器後,我可以看到容器已鏈接並且環境變量已正確顯示。

爲了連接是在Tomcat容器到數據庫中運行Web應用程序中,我使用下面的配置文件:

<Context> 
    <Resource 
    name="jdbc/MYDB" 
    type="javax.sql.DataSource" 
    auth="Container" 
    username="user" 
    password="password" 
    driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://${DB_PORT_3306_TCP_ADDR}:${DB_PORT_3306_TCP_PORT}/epcis?autoReconnect=true"> 
    </Resource> 
</Context> 

現在的問題是,我無法建立連接因爲Docker公開的環境變量在Tomcat環境中無法識別。

有一種方法可以讓Docker公開的這些環境變量對Apache Tomcat環境可見嗎?

+0

檢查mysql容器是否暴露3306端口。然後您可以輸入容器並使用例如telnet查看容器是否可以相互通話。 – wsl 2015-04-01 11:11:57

+0

他們可以互相交談,我確認使用telnet。問題是JDBC驅動程序不知道$ {DB_PORT_3306_TCP_ADDR}和其他env變量的值。該錯誤在我的web應用程序的tomcat日誌中報告。 – 2015-04-01 11:23:27

+1

你可以使用env屬性傳遞環境變量:https://docs.docker.com/reference/run/#env-environment-variables – wsl 2015-04-01 11:25:27

回答

4

你可以使用dns聲明的數據庫和硬編碼的參考?我認爲/ etc/hosts文件是用db更新的,當你鏈接它的時候它是ip地址。所以,你可以:

<Context> 
    <Resource 
    name="jdbc/MYDB" 
    type="javax.sql.DataSource" 
    auth="Container" 
    username="user" 
    password="password" 
    driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql:db:3306/epcis?autoReconnect=true"> 
    </Resource> 
</Context> 

我使用的另一個技巧是skydns和registrator,那麼你得到的DNS SRV記錄的IP地址和端口。

我不記得Tomcat,但它應該有權訪問變量。你確定Tomcat在使用之前評估url定義嗎?

+0

謝謝格雷格,你是對的。/etc/hosts包含來自db容器的IP,這解決了我的問題。 – 2015-04-01 14:12:24

+0

我在我的META-INF/context中嘗試過使用這個方法。xml,但我在「mysql:db:3306」周圍的tomcat啓動時收到錯誤,因爲它沒有將「db」解析爲IP。 – 2016-02-26 06:56:11

+0

看看你的/ etc/hosts文件。它將包含錯誤的IP地址。如果您嘗試連接另一個容器,則需要使用您定義的碼頭機IP地址和外部端口。 – occasl 2016-04-13 21:17:10

0

的確,那些env vars並沒有暴露在tomcat正在運行的競爭中。該解決方案是基於tomcat的一個(即「從Tomcat」),您通過相關ENV瓦爾成/etc/tomcat/tomcat.conf創建自己的Dockerfile並創建自己的啓動腳本:

echo DB_PORT_3306_TCP_ADDR=${DB_PORT_3306_TCP_ADDR} >> /etc/tomcat/tomcat.conf 

對於全面運行的tomcat6/postgres示例,請參閱this Dockerfilethis startup script