无法再连接到我的SQL Docker容器

时间:2019-01-24 14:45:22

标签: java mysql docker jdbc

我有一个硒框架,该框架使用sql docker容器从中获取testdata。我已经在sql版本5.7中使用了基本映像来构建容器。我编写的代码曾经可以使用,但现在不再可用。这是我的代码:

public class SQLconnection {

public static Connection dataBaseConnection() throws SQLException {

    System.out.println("-------- MySQL JDBC Connection Testing ------------");

    try {
        Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
        System.out.println("Where is your MySQL JDBC Driver?");
        e.printStackTrace();
    }

    System.out.println("MySQL JDBC Driver Registered!");
    Connection connection = null;

    try {
        connection = DriverManager
                .getConnection("jdbc:mysql://localhost:3306/users?useSSL=false","martijn","123");

    } catch (SQLException e) {
        System.out.println("Connection Failed! Check output console");
        e.printStackTrace();
    }

    if (connection != null) {
        System.out.println("You made it, take control your database now!");
    } else {
        System.out.println("Failed to make connection!");
    }

    return connection;
}

}

要构建容器,我使用了以下dockerfile:

FROM mysql:5.7
ENV MYSQL_ROOT_PASSWORD 123
ENV MYSQL_DATABASE Users
ENV MYSQL_USER martijn
ENV MYSQL_PASSWORD 123
ADD script.sql /docker-entrypoint-initdb.d
EXPOSE 3306

执行代码时出现的错误如下:

  

连接失败!检查输出控制台   com.mysql.cj.jdbc.exceptions.CommunicationsException:通讯   链接失败

成功发送到服务器的最后一个数据包是0毫秒前。驱动程序尚未收到来自服务器的任何数据包。

我对此很陌生,因此我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

如何启动容器?

为了使代码正常工作,您有2个主要选择:

  1. 使用network=host启动容器以禁用创建的其他网络,并使容器加入主机的网络:

    docker run -d --network=host your-sql-image
    

    这里您不需要公开端口。

  2. 暴露容器中的端口

    docker run -d -p 3306:3306 your-sql-image
    

UPD

人们可能会与EXPOSE中的Dockerfile命令混淆。它实际上没有公开任何内容(哈哈!),但更多用于通知用户您的容器将要公开的端口:

  

EXPOSE指令实际上并未发布端口。它   充当构建者之间的一种文档类型   图片和运行容器的人,关于哪些端口是   打算出版。在运行时实际发布端口   容器,使用docker run上的-p标志发布并映射一个或   更多端口,或使用-P标志发布所有公开的端口并映射它们   到高阶端口。

即使EXPOSE指令中未列出端口,也可以轻松公开它们。顺便说一下,在公开端口时,通常会将它们映射到不同的端口,例如-p 10000:3306。在Dockerfile内部,您怎么想知道暴露时将使用的host's端口的将来值。