繁体   English   中英

如何:运行 java jar 的 Docker 容器连接到主机 mysql 服务器?

[英]How to: Docker container running java jar connecting to host mysql server?

我编写了一个简单的 java 程序,它应该连接到运行 MYSQL 服务器的主机并插入一条记录。 java 程序在一个 docker 容器内运行,其中包含一个 ubuntu 基础镜像。 在这一点上,我有 jar 工作,但还不能连接到主机 MYSQL 服务器。

我尝试了不同的 mysql 服务器安装并从其他 dockerfiles 复制,希望将一些有效的东西复制/过去,但它变得混乱,我不知道需要哪些部分了。

爪哇代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

class ConnectionTest {

    private Connection conn;

    ConnectionTest() throws IOException, ClassNotFoundException {
        try {
            test();
        } catch (SQLException e) {
            logError(e);
        }
    }

    private void logError(SQLException e) throws IOException {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        e.printStackTrace(pw);
        String sStackTrace = sw.toString();

        File fout = new File("logs.txt");
        FileOutputStream fos = new FileOutputStream(fout);

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos));

        bw.write(sStackTrace);

        bw.close();
    }

    private void test() throws SQLException, ClassNotFoundException { ;
        String hostname = "localhost";
        String dbName = "test";
        String userName = "root";
        String password = "";

        Class.forName("com.mysql.cj.jdbc.Driver");
        conn = DriverManager.getConnection("jdbc:mysql://" + hostname + ":3306/" + dbName + "?useLegacyDatetimeCode=false&serverTimezone=Europe/Paris", userName, password);

        PreparedStatement prep = conn.prepareStatement("INSERT INTO test(Login, Password) values('test', 'test')");
        prep.execute();
    }
}

Dockerfile:


RUN mkdir -p /root/java
COPY jdk-8u221-linux-x64.tar.gz /
RUN tar -zxf jdk-8u221-linux-x64.tar.gz -C /root/java

RUN apt-get update
RUN update-alternatives --install /usr/bin/java java /root/java/jdk1.8.0_221/bin/java 100

ENV JAVA_HOME /root/java/jdk1.8.0_221/bin
RUN export JAVA_HOME

RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server \
 && sed -i "s/127.0.0.1/0.0.0.0/g" /etc/mysql/mysql.conf.d/mysqld.cnf \
 && mkdir /var/run/mysqld \
 && chown -R mysql:mysql /var/run/mysqld

VOLUME ["/var/lib/mysql"]

CMD ["mysqld_safe"]

EXPOSE 3306

COPY lib /root/test/lib
COPY entrypoint.sh /

ENTRYPOINT ["/entrypoint.sh"]

入口点.sh:

chmod -R 777 /root/test

cd /root/test

java -cp "lib/*" -jar lib/DockerTest.jar

tail -f /dev/null

/root/test/lib 包含 mysql-connector-java.jar 和 DockerTest.jar。 如果我在 jar 之前运行 mysqld 服务器启动但 jar 不会启动。

服务器运行时的MYSQL状态:

$ winpty docker exec -it mysql_container service mysql status
 * /usr/bin/mysqladmin  Ver 8.42 Distrib 5.7.27, for Linux on x86_64
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Server version          5.7.27-0ubuntu0.16.04.1
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /var/run/mysqld/mysqld.sock
Uptime:                 3 sec

Threads: 1  Questions: 4  Slow queries: 0  Opens: 105  Flush tables: 1  Open tables: 98  Queries per second avg: 1.333

仅运行 jar 时出错:

com.mysql.cj.jdbc.exceptions.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 com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
        at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
        at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:832)
        at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456)
        at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
        at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:207)
        at java.sql.DriverManager.getConnection(DriverManager.java:664)
        at java.sql.DriverManager.getConnection(DriverManager.java:247)
        at ConnectionTest.test(ConnectionTest.java:42)
        at ConnectionTest.<init>(ConnectionTest.java:13)
        at Main.main(Main.java:5)
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

如果你正在使用Spring,你可以设置spring.datasource.urlapplication.properties到使用host.docker.internal:3306如果MySQL是你的本地/主机上运行。

spring.datasource.url=jdbc:mysql://host.docker.internal:3306/<yourdatabase>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM