okinawa

IT勉強メモ

【Java】 WSL上のDocker内のMySQLにホストマシンから接続する方法

接続イメージ

ポイント

WSLがIPアドレスを持っているので、HostNameをWSLのIPアドレスにする必要がある。

ホストPCでMySQLのjarファイルを準備

※ホストPCでのJavaの環境構築は終わっている前提

下記サイトで、JDBC Driver for MySQL (Connector/J)をダウンロード。(Platform Independent)
MySQL :: MySQL コネクタ

Javaプロジェクトのlibフォルダにjarファイルを格納。クラスパスを通す。

MySQLのDockerコンテナ作成

docker run --name mysql000ex11 -dit -p 3305:3306 -e MYSQL_ROOT_PASSWORD=myrootpass -e MYSQL_DATABASE=wordpress000db -e MYSQL_USER=wordpress000kun -e MYSQL_PASSWORD=wkunpass mysql --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password

・-p 3305:3306の説明
-p ホスト側ポート番号:コンテナ側ポート番号

ホスト側ポート番号は未使用のものなら何でもOK。

コンテナ側ポート番号は3306。MySQLは3306を使用しているので。

ホストマシンの3305に接続があったらDockerコンテナの3306に接続しますよ、ということ。

ホスト側のWorkBenchから接続確認

上記だと接続できないのでWSLのIPアドレスを調べる。(HostnameをWSLのIPアドレスに変更する必要あり)

WSLのIPアドレスを調べる

WSLはホストPCとは別のIPアドレスを持つため、ホストからWSL上のDockerコンテナ内のMySQLにアクセスするためには、WSLのIPアドレスが必要。

コマンドプロンプトで下記コマンドを打つ。

> wsl #wsl起動
> ip a #ipアドレス表示

eth0の inetの部分がWSLのIPアドレス

改めて、WorkBenchで接続確認。Test Connectionで成功したらOK。

JavaからMySQLに接続テスト

package main;

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

public class Main {

    public static void main(String[] args) throws SQLException {
        // TODO 自動生成されたメソッド・スタブ
        // データベースに接続
        Connection con = DriverManager.getConnection(
          "jdbc:mysql://WSLのIPアドレス:3305/DB名?useSSL=false",
          "root",
          "rootパスワード"
        );
        // SQL文の実行
        PreparedStatement pstmt = con.prepareStatement("SELECT * FROM sys.sys_config;");
        ResultSet rs = pstmt.executeQuery();
        // 検索結果を表示
        while (rs.next()) {
          System.out.println(rs.getString("variable"));
        }
        // 後処理(リソースのクローズ)
        rs.close();
        pstmt.close();
        con.close();
    }

}

・結果
SELECT結果が返ってきた!成功!

diagnostics.allow_i_s_tables
diagnostics.include_raw
ps_thread_trx_info.max_length
statement_performance_analyzer.limit
statement_performance_analyzer.view
statement_truncate_len