2016-02-19 79 views
6

该计划无法MySQL的容器连接到Tomcat的集装箱在码头工人

我希望我的Tomcat服务器能够连接到我的MySQL服务器都在单独的容器。

的问题

的Tomcat无法连接到MySQL

我用一些细节从wordpress tutorial有关设置与MySQL容器中的链接,创建链接到MySQL。

虽然tomcat和mysql旋转起来很好,但我似乎无法让tomcat能够连接到MySQL,这些设置在我的本地机器上工作得非常好。

我试图使用--net: "host"以及虽然这不适用于Tomcat,因为它会引发严重错误。

以前的答案

我可以修复的错误,虽然我不相信任何一个会翻译成我的问题,因为我相信这是一个码头工人的问题不是主机之一noticed on this post a load

泊坞窗,compose.yml

web: 
    image: tomcat:7.0 
    container_name: tomcat-container 
    ports: 
    - "80:8080" 
    hostname: docker-tomcat 
    volumes: 
    - /home/webapps:/usr/local/tomcat/webapps 
    links: 
    - db 
db: 
    image: mysql 
    container_name: mysql-container 
    environment: 
    MYSQL_ROOT_PASSWORD: Mysqlpassword1 
    MYSQL_DATABASE: tracker 
    volumes: 
    - /home/mysqlDB:/var/lib/mysql 

这是我Context.xml from tomcat.

<Context> 
    <Resource 
     name="jdbc/tracker" type="javax.sql.DataSource" 
     maxActive="100" maxIdle="30" maxWait="10000" 
     url="jdbc:mysql://localhost:3306/tracker?useSSL=false" 
     driverClassName="com.mysql.jdbc.Driver" 
     username="root" password="mysqladmin1" 
    /> 
    <Resource 
     name="jdbc/jenkins" type="javax.sql.DataSource" 
     maxActive="100" maxIdle="30" maxWait="10000" 
     url="jdbc:mysql://localhost:3306/jenkins?useSSL=false" 
     driverClassName="com.mysql.jdbc.Driver" 
     username="root" password="mysqladmin1" 
    /> 
</Context> 

的错误代码。

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.) 
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549) 
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388) 
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) 
at databaseConnections.SQLDatabaseConnection.tableExists(SQLDatabaseConnection.java:131) 
at databaseConnections.JiraSQLDatabaseConnection.<init>(JiraSQLDatabaseConnection.java:50) 

回答

5

当您将db连接为“db”时,无法使用localhost加入您的数据库。你应该“db”

jdbc:mysql://db:3306/tracker?useSSL=false 

在你的容器中,localhost设计你的tomcat容器,而不是你的主机。 MySQL容器有他自己的网络。

Futhermore,如果你不喜欢“DB”的名字,你能说出不同的名称

链接它为例:

links: 
    - db:container-mysql 

在这种情况下,你内心的Tomcat容器,你可以使用

jdbc:mysql://container-mysql:3306/tracker?useSSL=false 
+0

添加以下网络配置是否有可能做''db:localhost'之类的东西,这样我就不需要将它从开发设置改为部署设置了? 非常感谢你,我会尽快尝试。 – jackdh

+0

我从不尝试使用本地主机。我认为localhost是一个关键字。你可以试试,可能是localhost会工作,但我认为你不应该这样做。 – Thibaut

+0

事实上,我认为你仍然应该在你的docker和你的计算机上使用“my-mysql-server”,然后在你的计算机上修改这个条目到你的本地dns(/ etc/hosts) – Thibaut

1

如果使用已经运行或者使用单独的DockerFile运行的容器,那么你可能要考虑使用

external_links: 
    - mysql-container:db 

请注意,名称mysql-container是您的容器的名称。如果你不知道名字,或者没有指定一个在docker-compose.yml,你还可以通过运行

docker ps 

发现它与NAMES列是你需要的外部链接的一个。 :之后的db只是一个别名,它可以是任何你想要的。这将是你的主机名。例如,如果在dockerizing数据库之前,您的主机是localhost,您现在必须将其更改为db

最后,您还必须确保两个容器在同一个网络中运行。你可以通过创建一个新的网络:

docker network create --driver=bridge my-network 

内。然后两个集装箱的docker-compose.yml,在相同的缩进级别为的service

networks: 
    default: 
    external: 
     name: my-network