Подключайтесь к контейнеру MariaDB Docker в собственной сети Docker удаленно - PullRequest
0 голосов
/ 19 апреля 2020

Привет, что я на самом деле пытаюсь - это установить удаленное соединение с MySQL Клиента в Windows Подсистеме для Linux mysql -h 172.18.0.2 -P 3306 -u root -p, а до этого я запустил Docker Контейнер следующим образом: docker container run --name testdb --network testnetwork -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mysqlRootPassword -e MYSQL_DATABASE=localtestdb -d mariadb/server.

Цель, по которой я помещаю контейнер в собственную сеть, заключается в том, что у меня также есть докризованное Spring Boot Application (GraphQL-Server), которое должно взаимодействовать с этой базой данных. Но всегда, когда я пытаюсь подключиться из моего встроенного mysql клиента, в моей Windows Подсистеме для Linux, с помощью показанной выше команды. Я получил сообщение об ошибке: ERROR 2002 (HY000): Can't connect to MySQL server on '172.18.0.2' (115).

То, что я уже пробовал, решить проблему самостоятельно, посмотреть, закомментирована ли строка файла конфигурации (bind-address). Но это не сработает. Интересно, что он уже работал для настройки контейнера docker с MariaDB и подключения извне, но теперь, когда я пытаюсь сделать то же самое, только с той разницей, что я теперь помещаю контейнер в собственную существующую сеть, он не будет работать.

Надеюсь, найдется кто-нибудь, кто сможет помочь мне с этой неприятной проблемой. Спасибо!

Пока что, Даниэль

// edit:

Теперь я попробовал совет по решению от парня из этого топи c: Как настроить контейнеры в одной сети для подключения друг к другу (сервер -> mysql)? . Кроме того, я связал свое приложение Spring Boot (сервер) с параметром «--link databaseContainerName» с контейнером MariaDB.

Теперь я могу запускать оба контейнера без ошибок, но все равно не могу подключиться удаленно к контейнеру MariaDB. Который сейчас работает в виртуальной docker сети со своим собственным su bnet.

1 Ответ

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

Я исследовал это недавно - это специально - изоляция контейнера . Обычно только главный (сервис httpd) хост доступен извне , скрывая внутренние соединения (хосты, с которыми он связывается для доставки ответа).

Контейнер, созданный в собственной сети, недоступен с внешних адресов, даже из контейнеров в том же мосту, но из другой сети (172.19.0.0/16).

Ваш контейнер должен быть доступен по docker адресу хоста (127.0. 0.1, если работает локально) и сопоставленный ("-p 3306: 3306") порт - 3306 . Но, конечно, это не сработает, если многие работающие контейнеры БД имеют одинаковое отображение на один и тот же порт хоста.

Изоляция выполняется с помощью брандмауэра - iptables. Вы можете перечислить правила (iptables -L), чтобы увидеть это с docker уровня хоста.

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

iptables -A DOCKER -d 172.16.0.0/12 -j ACCEPT

После этого ваш MySQL контейнерный движок должен быть доступен по внутреннему адресу 172.18.0.2 и исходному (не отображенному) порту 3306.

Предупреждения

  • отключает всю изоляцию, не используйте ее на производстве;
  • вы должны запускать это после каждые docker запуск - правила, созданные / измененные docker на лету
  • не каждый контейнер docker ответит на ping, проверьте его сначала с хоста docker (в данном случае linux), с windows cmd позже

Я использовал эту опцию (в docker.service), чтобы сделать правило постоянным:

ExecStartPost=/bin/sh -c '/etc/iptables/accept172_16.sh'

Для docker на внешнем (совместно используемом в локальной сети) хосте вы должны использовать route add (или файл hosts на вашем компьютере или маршрутизаторе) для пересылки адресов 172.xxx на хост lan docker.

Подсказка: используйте проект portainer (с политикой перезапуска - всегда) для управления docker контейнерами. Также легче увидеть ошибки конфигурации.

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