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

无法将MySQL容器连接到docker中的Tomcat容器,mysql,docker,docker-compose,Mysql,Docker,Docker Compose,计划 我希望我的tomcat服务器能够在单独的容器中连接到MySQL服务器 问题 Tomcat无法连接到MySQL 我使用了《关于设置与mysql容器的链接》中的一些细节,并创建了到mysql的链接 虽然tomcat和mysql运行得很好,但我似乎无法让tomcat连接到mysql,设置在我的本地机器上运行得非常好 我也尝试过使用--net:“host”,尽管这对Tomcat不起作用,因为它会抛出一个严重的错误 以前的答案 虽然我不相信这些都会转化为我的问题,因为我相信这是一个码头工人的问题,而

计划

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

问题

Tomcat无法连接到MySQL

我使用了《关于设置与mysql容器的链接》中的一些细节,并创建了到mysql的链接

虽然tomcat和mysql运行得很好,但我似乎无法让tomcat连接到mysql,设置在我的本地机器上运行得非常好

我也尝试过使用
--net:“host”
,尽管这对Tomcat不起作用,因为它会抛出一个严重的错误

以前的答案

虽然我不相信这些都会转化为我的问题,因为我相信这是一个码头工人的问题,而不是一个主机的问题,但我仍然没有找到可能的错误修复方法

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。

<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)
成功发送到服务器的最后一个数据包是0毫秒前的。驱动程序尚未从服务器收到任何数据包。)
位于org.apache.tomcat.dbcp.dbcp.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:1549)
位于org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1388)
位于org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
位于databaseConnections.SQLDatabaseConnection.tableExists(SQLDatabaseConnection.java:131)
在databaseConnections.JiraSQLDatabaseConnection.(JiraSQLDatabaseConnection.java:50)
当您将db链接为“db”时,您不能使用localhost加入您的数据库。你应该说“db”

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

此外,如果您不喜欢“db”名称,可以使用不同的名称对其进行命名链接

例如:

 links:
   - db:container-mysql
在这种情况下,在tomcat容器中,可以使用

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

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

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

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

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

docker network create --driver=bridge my-network
然后在两个容器的
docker compose.yml
中,在与
服务的缩进级别相同的缩进级别添加以下网络配置

networks:
  default:
    external:
      name: my-network

是否可以执行类似于
-db:localhost
的操作,这样我就不需要将其从开发设置更改为部署设置?否则,非常感谢,我很快就会尝试。我从不尝试使用localhost。我认为localhost是一个关键词。你可以试试,也许localhost可以工作,但我认为你不应该。事实上,我认为你仍然应该在你的docker和你的计算机上使用“我的mysql服务器”,并在你的计算机上更改以将此条目添加到你的本地dns(/etc/hosts)谢谢你的回复。尽管现在我遇到了另一个问题
[注意]用户'root'@'172.17.0.3'(使用密码:YES)的访问被拒绝
,尽管我已授予所有权限
使用GRANT选项将**上的所有权限授予“root”@“%”知道为什么吗?@gbenroscience恐怕我真的记不起来了。我想我只是做了两个单独的文件。一个用于本地开发人员,一个用于远程开发人员。
networks:
  default:
    external:
      name: my-network