Задать вопрос
Qwentor
@Qwentor
Веб-программист

Как пробросить порт с хоста внутрь docker контейнера?

Нужно изнутри докер контейнера подключаться к базе MySQL на другом сервере. При этом на хосте проброшен ssh туннель и база доступна на порту 3307.
Внутри контейнера MySQL сервер, содержащий базу с Federated таблицами, ссылающимися на удаленный сервер, но не работает, т.к. в контейнере свой 127.0.0.1 и к нему порт не проброшен. SSH в контейнере нет, поэтому просто взять и пробросить не выйдет. Нужно как-то 127.0.0.1:3307 с хоста пробросить в контейнер. Причем тоже на 127.0.0.1, т.к. на удаленном сервере bind-address=127.0.0.1 и менять нельзя.
Что можете подсказать? Весь инет излазил.

Опишу подробнее:

Есть 2 сервера. К примеру, 1.1.1.1 и 2.2.2.2

на 1.1.1.1 продакшн сервер, в нем 2 базы, условно fastdata и userdata.
В первой данные, необходимые всем пользователям, обновляются чуть ли не ежесекундно. Во второй пользовательские данные - тоже часто обновляются, но не так.

На 2.2.2.2 тестовый сервер. Там куча всего. В т.ч. аж 2 MySQL сервера. Один на хосте, другой в контейнере. Итого:

1) Сервер на хосте, на стандартном порту 3306

2) Также проброшен порт с 1.1.1.1 - забиндено на 3307

3) База в контейнере (MariaDB 10.1.23 - как на проде), на хост выведено на порт 3308

Вот этот третий сервер должен быть копией базы на продакшене, но с другими пользователями (тестовыми). Т.е. база userdata там своя, а вот fastdata д.б. абсолютно идентична базе с прода в любой момент времени. Предположил решение через Federated таблицы, т.е. выглядит так:

ENGINE=FEDERATED DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci CONNECTION='mysql://root:password@127.0.0.1:3307/fastdata/table1';


Но не работает. Т.к. 127.0.0.1 в контейнере естественно свой и никакая продакшн база туда не забиндена. Подключиться к 172.17.0.3 внутри контейнера, на котором доступ к хосту нельзя, т.к. в базе на проде bind-address=127.0.0.1 и тупо откажет в подключении. Думал запускать контейнер с --net='host' - тогда он будет в одной сети с хостом, но тогда база контейнера будет на порту 3306, а он уже занят локальной базой, а как поменять порт внутри контейнера тоже не понял. Вот такая заковыка.
  • Вопрос задан
  • 2764 просмотра
Подписаться 2 Средний 2 комментария
Решения вопроса 1
Qwentor
@Qwentor Автор вопроса
Веб-программист
В общем решение оказалось простым:
docker run --name 10.1.23-mariadb --net=host -v /opt/test/mariadb:/var/lib/mysql -v /opt/test/mariacnf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=password -d mariadb:10.1.23


Т.е. как я и предполагал через --net=host - таким образом контейнер работает в сети хоста и нет нужды что-то редиректить. /etc/mysql действительно не пробрвсывается для изменения my.cnf, зато спокойно пробрасывается /etc/mysql/conf.d, а в нем файл mariadb.cnf, в котором и прописывается изменение порта на 3308.

Проблема решена.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
А что если указать ip адрес сетевушки в который проброшен ssh туннель?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы