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 и создайте туннель. Просто, быстро и безопасно.