Как связать контейнер docker с базой данных localhost mysql хост-машины? - PullRequest
0 голосов
/ 17 апреля 2020

У меня есть файл war, который использует базу данных MySQL в бэкэнде. Я развернул свой военный файл в docker контейнере, и я могу пропинговать его из своего браузера. Я хочу подключить свое приложение к базе данных MySQL. Эта база данных существует на localhost:3306

моего хост-компьютера. Поскольку я не могу подключиться к нему из локального узла контейнера, я попытался выполнить команду docker inspect --format '{{ .NetworkSettings.IPAddress }}' 213be777a837 Эта команда дала мне IP-адрес 172.17.0.2 . Я пошел к MySQL опции сервера и поместил этот IP-адрес в поле привязки и перезапустил сервер. После этого я обновил строку подключения к базе данных моих проектов с 172.17.0.2:3306

, но она не работает. Может ли кто-нибудь сказать, что мне не хватает? Я также попытался добавить нового пользователя БД с root @%, а затем запустить команду разрешить все разрешения для «root @%», но ничего не получалось.

Ответы [ 3 ]

0 голосов
/ 17 апреля 2020

Ваша настройка в порядке. Вам просто нужно сделать это одно изменение.

При запуске контейнера приложения (того, в котором вы развертываете свой военный файл), вам необходимо добавить следующий аргумент в его команду docker run.

--net=host

Пример:

docker run -itd -p 8082:8080 --net=host --name myapp myimage

С этим изменением вам нужно , а не , чтобы также изменить строку подключения. localhost:3306 будет работать нормально. И вы сможете установить соединение с MySQL.

0 голосов
/ 17 апреля 2020

Выполните следующие действия: -

docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 dockernet
docker run -p 8082:8080 --network dockernet -d 6ab907c973d2
in your project set connection string : jdbc:mysql://host.docker.internal:3306/....

И затем разверните.

0 голосов
/ 17 апреля 2020

tl; др : используйте 172.17.0.1:3306, если вы используете Linux.

Более подробное описание:

Как я понимаю что вам нужно сделать, это подключиться из вашего Docker контейнера к хост-порту. Но вы попытались привязать хост-процесс (MySQL) к сетевому интерфейсу контейнера. Не уверен, что означает, что хост-процесс пытается привязаться к сетевому пространству имен другого хост-процесса, но IIU C ваш MySQL процесс не должен иметь возможность связываться с этим адресом.

При запуске MySQL с настройками по умолчанию, связывающими его с 0.0.0.0, он доступен для Docker контейнеров через Docker виртуальный мост. Поэтому вам следует направить ваши запросы от процесса WAR к процессу хоста через этот виртуальный мост (если вы используете этот сетевой режим. Если вы не изменили сетевые настройки Docker, это должно быть ). Это делается путем указания адреса шлюза моста в качестве адреса MySQL и порта, с которого он запущен.

Вы можете получить IP-адрес моста, проверив сетевые интерфейсы. Когда установлен Docker, он настраивает виртуальный мост по умолчанию, и он должен отображаться как docker0, если вы используете Linux. IP-адрес для этого, скорее всего, будет 172.17.0.1. Таким образом, ваш MySQL адрес с точки зрения контейнера - jdbc:mysql://172.17.0.1:3306/....

enter image description here

1 - https://docs.docker.com/network/

2 - https://docs.docker.com/network/bridge/

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