无法将 MySQL 容器连接到 docker 中的 Tomcat 容器

Unable to Connect MySQL container to Tomcat Container in docker

计划

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

问题

Tomcat 无法连接到 MySQL

我使用了 wordpress tutorial 中关于使用 mysql 容器设置 link 的一些细节,并创建了 link 到 MySQL .

虽然 tomcat 和 mysql 旋转起来很好我似乎无法让 tomcat 能够连接到 MySQL,设置工作我的本地机器完全没问题。

我也尝试过使用 --net: "host",尽管它不适用于 Tomcat,因为它会引发严重错误。

以前的答案

noticed on this post a load 可能修复该错误,但我不认为这些会转化为我的问题,因为我认为这是 docker 问题而不是主机问题。

docker-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)

当您link将数据库作为"db" 时,您不能使用localhost 加入您的数据库。你应该"db"

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

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

此外,如果你不喜欢"db"名字,你可以给link起一个不同的名字

例如:

 links:
   - db:container-mysql

在这种情况下,在您的 tomcat 容器中,您可以使用

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

如果您已经通过使用单独的 DockerFile 运行ning 或 运行 使用容器,那么您可能需要考虑使用

external_links:
  -  mysql-container:db

请注意,名称 mysql-container 是容器的名称。如果您不知道名称或未在 docker-compose.yml 中指定名称,您也可以通过 运行ning

找到它
docker ps

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

最后,您还必须确保两个容器 运行ning 在同一个网络中。您可以通过创建一个新网络来做到这一点:

docker network create --driver=bridge my-network

然后在两个容器的docker-compose.yml里面,在service

相同的缩进级别添加如下网络配置
networks:
  default:
    external:
      name: my-network