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