Ускорьте отладку тяжелых Docker-образов, запускаемых в удаленной среде
Это небольшой туториал о том, как ускорить pull и push тяжелых Docker образов, которые вы собираете локально, но их запуск возможен только в удаленной среде. Например, потому что контейнер использует специфическое окружение, приложения или ресурсы, которые трудно или невозможно воспроизвести локально.
Решение «в лоб» состоит в том, чтобы запушить собранный образ в Dockerhub. А там, где вы будете его использовать, просто указать ссылку на образ. Очевидно, что у этого простого способа есть недостатки:
Весьма низкая скорость загрузки на Dockerhub. Умножьте это на количество пушей, которые потребуется сделать за время отладки.
Использование публичного Dockerhub не всегда приемлемо из соображений безопасности, особенно если образ содержит чувствительные данные.
Использование корпоративного Docker Registry (вместо Dockerhub) тоже не всегда возможно, например, из-за политик безопасности, когда отправка образов в реестр допускается только через конвейер CI/CD, а прямой пуш из консоли запрещен.
Найденное решение оказалось без этих недостатков, простым, работающим и весьма изящным. Вот 3 шага, которые нужно сделать:
Разверните локальный Docker Registry, куда пуш происходит молниеносно
Пробросьте доступ к этому реестру наружу
Удаленный ресурс просто стянет образ с вашей локальной машины напрямую
1. Поднимите локальный Docker Registry
Воспользуйтесь этим официальным образом и выполните:
docker run -d -p 5000:5000 --name registry registry:latest
2. Пробросьте доступ к Registry наружу
Зарегистрируйте бесплатный аккаунт на ngrok.
Зайдите в аккаунт и получите временный домен: Universal Gateway > Domains > Create Domain. Ngrok создаст домен вида something-random.ngrok-free.app
и предложит ввести команду для запуска туннеля.
Если у вас еще не установлена консольная утилита ngrok, нажмите там же «Need to install ngrok first?» и установите программу для вашей ОС. Затем введите следующую команду и укажите свой персональный токен:
ngrok config add-authtoken
Откройте новое окно терминала и вставьте туда команду запуска туннеля с вашим доменом. Исправьте порт на 5000, поскольку локальный Docker Registry вы развернули именно на этом порту:
ngrok http --url=something-random.ngrok-free.app 5000
Не закрывайте окно терминала, чтобы туннель продолжал работать.
Теперь присвойте вашему Docker-образу тег с именем нового домена и отправьте его в локальный реестр:
docker tag myimage:latest something-random.ngrok-free.app/myimage:latest
docker push something-random.ngrok-free.app/myimage:latest
Надеюсь, вас приятно удивила скорость, с которой выполняется пуш в реестр.
3. Стяните образ на удаленном ресурсе
Просто используйте ссылку вида something-random.ngrok-free.app/myimage:latest
в том месте, где вы обычно указываете ссылку на образ в Dockerhub.
Это работает, пока поднят ngrok туннель. Теперь можно не тратить время на бесполезные ожидания и сэкономить прилично времени на отладке тяжелой Docker-сборки.