Docker и TunnelHunt: Как дать временный доступ к контейнеру без боли и страданий
Разработка в Docker — это удобно, быстро и изолированно. Но рано или поздно возникает задача: как показать сервис, запущенный в контейнере, коллеге или внешнему приложению? Например, дать бэкенд-разработчику временный доступ к базе данных, запущенной у вас на машине, или протестировать вебхук, который должен достучаться до вашего локального API в контейнере.
Конечно, можно пробрасывать порты на роутере, настраивать VPN или разворачивать всё на общем staging-сервере. Но это долго, сложно и часто небезопасно.
Сегодня мы покажем, как с помощью одной команды и TunnelHunt предоставить временный и безопасный доступ к любому сервису внутри Docker-контейнера.
Проблема: localhost
в мире Docker
Когда вы запускаете контейнер и пробрасываете порт командой docker run -p 5432:5432 postgres
, порт 5432
становится доступен на вашем localhost
. Это отлично работает для локальной разработки.
Но если вы создадите туннель для localhost:5432
, он не всегда сработает так, как ожидается, особенно в сложных сетевых конфигурациях Docker. Более надежный способ — создать туннель напрямую к внутреннему IP-адресу контейнера.
Давайте разберем на конкретном примере.
Сценарий: Даем коллеге доступ к базе данных PostgreSQL
Представим, что вы frontend-разработчик и подняли у себя в Docker контейнер с PostgreSQL, чтобы наполнить его тестовыми данными. Бэкенд-разработчику из вашей команды нужно подключиться к этой базе, чтобы проверить запросы.
Шаг 1: Запускаем контейнер PostgreSQL
Если у вас еще нет запущенного контейнера, выполните команду:
docker run --name my-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
Эта команда скачает образ PostgreSQL (если его нет) и запустит контейнер с именем my-postgres
в фоновом режиме.
Шаг 2: Узнаем внутренний IP-адрес контейнера
Каждый контейнер в Docker имеет свой собственный IP-адрес во внутренней сети. Чтобы его узнать, выполните команду docker inspect
:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-postgres
В ответ вы получите что-то вроде 172.17.0.2
. Это и есть адрес, который нам нужен.
Шаг 3: Создаем туннель с помощью TunnelHunt
Теперь самое интересное. Мы создадим туннель, который будет вести не на localhost
, а прямо на внутренний IP-адрес нашего контейнера и порт 5432
(стандартный порт PostgreSQL).
Откройте терминал и выполните:
ssh -R 80:172.17.0.2:5432 -p 2222 nokey@tunnelhunt.ru
172.17.0.2:5432
— это адрес и порт нашего контейнера.80
— это порт, который будет “слушать” сервер TunnelHunt.
После выполнения команды вы получите публичный адрес, например, https://lorem-ipsum-123.tunnelhunt.ru
. Но поскольку мы туннелируем не HTTP-трафик, а TCP-соединение для базы данных, нам нужен хост и порт для подключения.
- Хост:
tunnelhunt.ru
- Порт: TunnelHunt сообщит вам его в ответном сообщении (например,
Port 33123 is open
).
Шаг 4: Коллега подключается к базе данных
Теперь ваш коллега может использовать полученные данные для подключения к вашей базе данных через любой SQL-клиент (например, DBeaver или DataGrip):
- Хост:
tunnelhunt.ru
- Порт:
33123
(порт, который выдал TunnelHunt) - База данных:
postgres
- Пользователь:
postgres
- Пароль:
mysecretpassword
(тот, что мы указали при запуске контейнера)
Готово! Ваш коллега подключен к базе данных в вашем Docker-контейнере, а вам не пришлось ничего настраивать, кроме одной команды в терминале. Как только вы закроете SSH-соединение (нажав Ctrl+C
), туннель закроется, и доступ к базе данных прекратится.
Заключение
Комбинация Docker и TunnelHunt — это мощный инструмент для быстрой и безопасной командной работы. Этот подход работает не только для баз данных, но и для любого другого сервиса, запущенного в контейнере:
- API-сервисы
- Админки (например, phpMyAdmin)
- Брокеры сообщений (RabbitMQ, Kafka)
- Любые другие TCP-сервисы
Вам больше не нужно тратить время на сложные сетевые настройки. Просто запустите контейнер, узнайте его IP и создайте туннель. Просто, быстро и безопасно.