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

2021-12-26 00:00:00 docker docker-compose mysql

计划

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

I want my tomcat server to be able to connect to my MySQL server both in separate containers.

问题

Tomcat 无法连接 MySQL

Tomcat cannot connect to MySQL

我使用了 wordpress 教程中关于设置与mysql 容器并创建了到 MySQL 的链接.

I used some of the details from the wordpress tutorial about setting up a link with the mysql container and created the link to the MySQL.

虽然 tomcat 和 mysql 启动得很好,但我似乎无法让 tomcat 连接到 MySQL,但这些设置在我的本地机器上运行得很好.

Although the tomcat and mysql spin up just fine I can't seem to get tomcat to be able to connect to MySQL, the settings work on my local machine perfectly fine.

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

I've attempted to use --net: "host" as well although that does not work with Tomcat as it throws a severe error.

以前的答案

我在这篇文章中注意到了大量可能的错误修复,尽管我不相信其中任何一个会转化为我的问题,因为我相信这是一个 docker 问题而不是主机问题.

I noticed on this post a load of possible fixes for the error although I don't believe any of these would translate to my problem as I believe this is a docker problem not a host one.

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

这是我来自 tomcat 的 Context.xml.

This is my 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)

推荐答案

当您将 db 链接为db"时,您不能使用 localhost 加入您的数据库.你应该db"

As you're linking db as "db", you cannot use localhost to join you database. you should "db"

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

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

In your container, localhost design your tomcat container, not your host. MySQL container has his own network.

另外,如果你不喜欢db"这个名字,你可以用不同的名字来命名链接

Futhermore, if you don't like "db" name, you can name link it with different name

例如:

 links:
   - db:container-mysql

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

In this case, inside you tomcat container, you could use

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

相关文章