Java 与docker上的mysql服务器通信?

Java 与docker上的mysql服务器通信?,java,mysql,hibernate,docker,Java,Mysql,Hibernate,Docker,我正在docker容器上运行测试mysql数据库,如下所示: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag 我已检索到正在运行的容器的IP地址: docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' hibernate-mysql 结果得到172.17.0.2 我运行hibernate

我正在docker容器上运行测试mysql数据库,如下所示:

docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
我已检索到正在运行的容器的IP地址:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' hibernate-mysql
结果得到
172.17.0.2

我运行hibernate连接到数据库:

<hibernate-configuration>
    <session-factory>
        <property name="connection.url">jdbc:mysql://172.17.0.2:3306/justHibernate</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.username">root</property>
        <property name="connection.password">12345</property>
   </session-factory>
</hibernate-configuration>

jdbc:mysql://172.17.0.2:3306/justHibernate
com.mysql.jdbc.Driver
根
12345
我得到一个例外:

org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init>
INFO: HHH000397: Using ASTQueryTranslatorFactory
org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
WARN: SQL Error: 0, SQLState: 08S01
org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions
ERROR: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
Exception in thread "main" org.hibernate.exception.JDBCConnectionException: Could not open connection
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:132)
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:221)
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:157)
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67)
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
    at org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1426)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352)
    at com.sun.proxy.$Proxy2.beginTransaction(Unknown Source)
    at com.mycompany.app.MovieManager.persistMovie(MovieManager.java:33)
    at com.mycompany.app.App.main(App.java:29)
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:344)
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2332)
    at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2369)
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2153)
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:792)
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
    at org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.getConnection(DriverManagerConnectionProviderImpl.java:204)
    at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:292)
    at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:214)
    ... 12 more
Caused by: java.net.ConnectException: Operation timed out (Connection timed out)
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at java.net.Socket.connect(Socket.java:538)
    at java.net.Socket.<init>(Socket.java:434)
    at java.net.Socket.<init>(Socket.java:244)
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257)
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:294)
    ... 27 more
org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory
信息:HH000397:使用ASTQueryTranslatorFactory
org.hibernate.engine.jdbc.spi.SqlExceptionHelper日志异常
警告:SQL错误:0,SQLState:08S01
org.hibernate.engine.jdbc.spi.SqlExceptionHelper日志异常
错误:通信链路故障
成功发送到服务器的最后一个数据包是0毫秒前的。驱动程序尚未从服务器收到任何数据包。
线程“main”org.hibernate.Exception.jdbconnectionexception中出现异常:无法打开连接
位于org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:132)
位于org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
位于org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
位于org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
位于org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.ActainConnection(LogicalConnectionImpl.java:221)
位于org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:157)
位于org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.doBegin(JdbcTransaction.java:67)
位于org.hibernate.engine.transaction.spi.AbstractTransactionImpl.begin(AbstractTransactionImpl.java:160)
位于org.hibernate.internal.SessionImpl.beginTransaction(SessionImpl.java:1426)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
位于org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352)
位于com.sun.proxy.$Proxy2.beginTransaction(未知来源)
在com.mycompany.app.MovieManager.persistMovie(MovieManager.java:33)
位于com.mycompany.app.app.main(app.java:29)
原因:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:通信链路故障
成功发送到服务器的最后一个数据包是0毫秒前的。驱动程序尚未从服务器收到任何数据包。
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于com.mysql.jdbc.Util.HandleneInstance(Util.java:411)
位于com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
位于com.mysql.jdbc.MysqlIO(MysqlIO.java:344)
位于com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2332)
位于com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2369)
位于com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2153)
位于com.mysql.jdbc.ConnectionImpl(ConnectionImpl.java:792)
位于com.mysql.jdbc.JDBC4Connection(JDBC4Connection.java:47)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于com.mysql.jdbc.Util.HandleneInstance(Util.java:411)
位于com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:381)
位于com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:305)
位于org.hibernate.service.jdbc.connections.internal.DriverManager连接ProviderImpl.getConnection(DriverManager连接ProviderImpl.java:204)
位于org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.ActainConnection(AbstractSessionImpl.java:292)
位于org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.ActainConnection(LogicalConnectionImpl.java:214)
... 还有12个
原因:java.net.ConnectException:操作超时(连接超时)
位于java.net.PlainSocketImpl.socketConnect(本机方法)
位于java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
位于java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
位于java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
位于java.net.socksocketimpl.connect(socksocketimpl.java:392)
位于java.net.Socket.connect(Socket.java:589)
位于java.net.Socket.connect(Socket.java:538)
位于java.net.Socket。(Socket.java:434)
位于java.net.Socket(Socket.java:244)
位于com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257)
在com.mysql.jdbc.MysqlIO上(MysqlIO.java:294)
... 还有27个

在run命令中,必须将MySQL端口3306发布到主机的网络接口,因为只有这样才能从主机访问它。你可以用这个


此外,如果您使用的是在虚拟机中运行的Docker Toolbox,则必须通过
Docker machine IP default
生成的IP地址进行连接。如果您正在使用Docker for Mac,则要连接到的IP地址是
127.0.0.1
,或localhost

你从哪里打外呼?你是怎么开始实际的数据的
docker run -e MYSQL_ROOT_PASSWORD=my-secret-pw -p 3306:3306 -d mysql:latest