Как использовать соединение JDBC от хоста до сервера MySQL Docker - PullRequest
0 голосов
/ 23 января 2019

Я новичок в докере и пытаюсь подключиться к контейнеру 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 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) я пытаюсь подключить эту базу данных 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: сбой канала связи

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

Какую ошибку я могу сделать? Как я могу подключить свое Java-приложение к контейнеру Docker mysql?

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Первая проблема заключалась в том, что сопоставление портов должно быть одним из первых параметров в операторе run docker.Это последний оператор выполнения:

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

Следующая проблема состояла в обновлении драйвера JDBC в maven (до самого нового).

И последнее, но не менее важное: для параметра useSSL было установлено значение false (не обязательно на локальном компьютере).

0 голосов
/ 23 января 2019

Вам нужно настроить сеть 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:3306 и myadmin:80.

Для подключения к службам с хоста вы используете localhost и открытые порты : localhost:1234 и localhost:8081 соответственно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...