TunnelHunt

Docker и TunnelHunt: Как дать временный доступ к контейнеру без боли и страданий

Автор: Команда TunnelHuntОпубликовано: 5 сентября 2025 г.
Логотипы 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 и создайте туннель. Просто, быстро и безопасно.