簡體   English   中英

如何使用從主機到 docker mysql 服務器的 JDBC 連接

[英]How to use JDBC connection from host to a docker mysql server

我是 docker 新手,我嘗試從本地機器(主機)連接到 mysql 容器。

我使用以下命令提取了最新版本的 mysql:

docker pull mysql/mysql-server:latest

並啟動它(以及具有以下內容的 myadmin 容器:

docker run --name mysql1 -e MYSQL_ROOT_PASSWORD=root -d mysql --default-authentication-plugin=mysql_native_password -P 3306 -h localhost
docker run --name myadmin -d --link mysql1:db -p 8081:80 phpmyadmin/phpmyadmin

我可以在本地瀏覽器上訪問 phpmyadmin(使用 localhost:8081),並創建了一個名為“userDB”的數據庫。

在這里您可以看到 docker 檢查:

docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                            NAMES
03126272c0e3        phpmyadmin/phpmyadmin   "/run.sh supervisord…"   7 minutes ago       Up 7 minutes        9000/tcp, 0.0.0.0:8081->80/tcp   myadmin
c8d032921d7c        mysql                   "docker-entrypoint.s…"   8 minutes ago       Up 8 minutes        3306/tcp, 33060/tcp              mysql1

在我的本地 JavaEE 應用程序(在 GlassFish Web 服務器上運行)上,我嘗試使用以下命令連接這個 mysql 數據庫:

    try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection(
                "jdbc:mysql://localhost:3306/userDB", "root", "root");
        return con;
    } catch (Exception ex) {
        System.out.println("Database.getConnection() Error -->"
                + ex.getMessage());
        return null;
    }

並得到以下異常: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.

我犯了什么錯誤? 如何將我的 Java 應用程序與 mysql docker 容器連接?

您需要為這些東西設置 Docker 網絡才能協同工作。 我不在這里回顧docker-compose ,你可以自己做,但如果使用通用的docker CLI,它將如下所示:

首先創建用戶定義的橋接網絡

docker network create foo

然后你啟動你的容器連接到這個網絡

docker run --network=foo --name mysql1 -e MYSQL_ROOT_PASSWORD=root -d mysql --default-authentication-plugin=mysql_native_password -P 3306 -h "0.0.0.0"
docker run --network=foo --name myadmin -p 8081:80 phpmyadmin/phpmyadmin

注意:我將localhost更改為0.0.0.0以允許遠程連接並刪除了link參數 - 它已過時。

現在要在服務之間進行連接您可以使用它們的名稱和通用端口,例如mysql1:3306myadmin:80

要從主機連接到服務您可以適當地使用localhost公開端口localhost:1234localhost:8081

第一個問題是端口映射必須是docker的run語句中的第一個參數之一。 這是最后的運行語句:

docker run -p 3306:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=root -d mysql --default-authentication-plugin=mysql_native_password -h 127.0.0.1

下一個問題是更新 maven 中的 JDBC 驅動程序(到最新的)。

最后但並非最不重要的是:useSSL 參數設置為 false(在本地機器上不需要)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM