Больше не могу подключиться к моему контейнеру sql docker - PullRequest
0 голосов
/ 24 января 2019

У меня есть инфраструктура селена, которая использует докерский контейнер sql для получения тестовых данных. Я использовал базовый образ с 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;
}

}

Для сборки контейнера я использовал файл docker ниже:

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 голосов
/ 24 января 2019

Как вы начинаете свой контейнер?

Чтобы ваш код работал, у вас есть 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 фактически не публикует порт. Это функционирует как тип документации между человеком, который создает изображение и человек, который запускает контейнер, о том, какие порты предназначен для публикации. На самом деле опубликовать порт при запуске контейнера, используйте флаг -p на панели запуска, чтобы опубликовать и отобразить один или больше портов или флаг -P, чтобы опубликовать все открытые порты и отобразить их на порты высокого порядка.

Вы можете легко открывать порты, даже если они не указаны в директиве EXPOSE. Кстати, когда вы выставляете порты, вы часто отображаете их на разные, например, -p 10000:3306. А внутри Dockerfile как вы предполагаете узнать будущее значение порта host's, который будет использоваться при экспонировании.

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