Итоги недели в мире бэкенда и обзоры новых сервисов: как развернуть собственный реестр для хостинга Docker-контейнеров
🐳 Как создать свой реестр для хостинга Docker-контейнеров
Создание собственного реестра контейнеров – оптимальное решение, если:
- Вы не хотите зависеть от внешних поставщиков услуг.
- Вам необходимо соблюдать особые требования безопасности или конфиденциальности данных.
Автор этой публикации разобрал по шагам процесс реализации такого реестра.
Что такое образ контейнера
Образ контейнера – это пакет, включающий в себя все необходимые файлы, библиотеки и конфигурации для запуска контейнера. Он состоит из слоев, каждый из которых представляет собой изменения в файловой системе (добавление, удаление или модификацию файлов). Самый распространенный способ создания образа – это использование Dockerfile:
Что такое реестр контейнеров
Реестр контейнеров – это хранилище, которое позволяет загружать и скачивать образы контейнеров. Реестры бывают публичными (например, Docker Hub) и приватными. Приватные реестры обеспечивают повышенную безопасность и контроль над доступом к образам. URL образа выглядит примерно так:
Привет!
Мы запустили еженедельную email-рассылку, посвященную последним новостям и тенденциям в мире бэкенда. В еженедельных письмах ты найдешь:
- Языки программирования и фреймворки для бэкенда.
- Архитектура и проектирование серверных приложений.
- Базы данных и управление данными.
- Безопасность и защита данных.
- Облачные технологии и DevOps.
- API и интеграции.
- Тестирование и отладка.
- Инструменты и утилиты для бэкенд-разработчиков.
- Лучшие практики и паттерны проектирования.
Почему стоит создать собственный реестр
Самостоятельный хостинг реестра позволяет полностью контролировать инфраструктуру и избегать зависимости от сторонних поставщиков. Это особенно важно, если вы работаете в условиях строгого регулирования или хотите повысить безопасность.
Как развернуть собственный реестр
Существует несколько опенсорсных решений для создания реестров контейнеров. Наиболее популярное, однако, – это официально поддерживаемый Docker registry. Этот реестр предназначен для хранения и распространения образов контейнеров и артефактов, и он запускается прямо в контейнере.
Основные шаги для создания реестра:
- Установка Docker и Docker Compose на сервере.
- Настройка конфигурации и запуск контейнера registry.
- Запуск nginx для обработки и перенаправления запросов к контейнеру реестра.
- Настройка SSL-сертификатов и подключение домена.
Установка Docker и Docker Compose
Для начала вам понадобится сервер с установленным Docker. Например, это может быть виртуальная машина с Ubuntu на любой подходящей платформе. Установите Docker и Docker Compose (он упрощает управление приложениями со множеством контейнеров):
🤖🎓 Подтянуть свои знания по Data Science вы можете на нашем телеграм-канале «Библиотека DS для собеса»
Конфигурация реестра
Для настройки контейнера реестра нужно создать файл compose.yaml со следующей конфигурацией:
Будут созданы два тома: один для хранения образов, второй для хранения файла с паролями. Для аутентификации пользователей необходимо создать файл с паролями с помощью команды htpasswd. Например, добавим пользователя busy с паролем bee:
Теперь можно запустить реестр командой docker-compose up. Если все настроено правильно, вы увидите сообщение о том, что реестр слушает порт 5000:
Настройка nginx для обработки TLS
Для безопасности реестр должен использовать защищенное SSL-соединение. Для проксирования запросов и обработки TLS можно использовать nginx, а для получения SSL-сертификата – Let’s Encrypt. Сертификат сохраняется в директории ./nginx/certs. В файле compose.yaml добавим секцию для nginx:
Пример файла конфигурации nginx (nginx.conf):
Проверка и запуск
После настройки запустите контейнеры с реестром и nginx:
На стороне клиента необходимо войти в реестр:
Теперь можно создавать и загружать образы в наш реестр:
🐘🧩 Интересные задачи по PHP для практики можно найти на нашем телеграм-канале «Библиотека задач по PHP»
В заключение
Для запуска реестра при желании можно использовать Kubernetes. Если требуется пользовательский интерфейс, пригодится joxit/docker-registry-ui. Полный код проекта есть в репозитории автора, а на YouTube можно посмотреть ролик о создании реестра.
👻 3 основных стратегии отправки сообщений в Kafka
Существуют три основных подхода к отправке сообщений, и каждый представляет собой определенный компромисс между надежностью, производительностью и сложностью реализации:
- «Отправить и забыть».
- Синхронная отправка.
- Асинхронная отправка.
Разберем нюансы, преимущества и недостатки каждого из этих подходов.
🐍🎓 Подтянуть свои знания по Python вы можете на нашем телеграм-канале «Библиотека Python для собеса»
«Отправить и забыть»
Как работает:
В этой стратегии мы просто отправляем сообщение в Kafka и не ждем подтверждения от брокера о том, что сообщение было доставлено или обработано. Как только сообщение отправлено, программа продолжает свою работу, не проверяя, доставлено ли сообщение. Kafka сам по себе гарантирует определенный уровень надежности за счет своей архитектуры (высокая доступность, несколько реплик сообщений и механизмы автоматической отправки повторных сообщений в случае мелких ошибок).
Однако, если произойдет более серьезный сбой (например, сбой сети или поломка узла брокера), сообщение может быть утеряно, и система об этом не узнает.
Плюсы:
- Высокая производительность – отправка сообщений не блокирует поток программы, и система может отправлять сообщения с максимальной скоростью.
- Простота реализации – не требуется обрабатывать ответы или ошибки от брокера.
Минусы:
- Риск потери сообщений – если что-то пойдет не так, сообщение может не дойти до брокера или быть потеряно, и программа об этом не узнает.
- Отсутствие контроля – мы не получаем информацию о том, куда было отправлено сообщение и было ли оно доставлено.
Когда использовать:
Когда потеря сообщений не является критичной. Это может быть допустимо для задач, где небольшая потеря данных не приведет к серьезным последствиям. Например:
- Логи – если несколько логов будут утеряны, это не будет критично.
- Данные сенсоров – если из тысяч данных с датчиков несколько не будут доставлены, система все равно сможет корректно работать.
🤖🧩 Интересные задачи по Data Science для практики можно найти на нашем телеграм-канале «Библиотека задач по DS»
Синхронная отправка
Как работает:
В синхронной отправке после вызова метода send() программа блокируется и ожидает подтверждения от Kafka, что сообщение было доставлено. Как только подтверждение получено, программа продолжает работу. Если подтверждение не получено или произошла ошибка, вызывается исключение.
Плюсы:
- Надежность – если какие-то действия нужно выполнять только в случае успешной доставки сообщения, и ни в каком другом случае больше, то эта стратегия обеспечит такую меру.
- Простота реализации – этот подход реализовать гораздо проще, чем асинхронный.
Минусы:
- Снижение производительности – если брокеры перегружены или сеть работает медленно, это может существенно замедлить работу системы.
- Отсутствие гибкости – система становится менее эффективной в условиях высоких нагрузок, так как каждая отправка ждет ответа перед продолжением работы.
Когда использовать:
Когда каждое сообщение имеет критическое значение, и вам необходимо быть уверенным, что оно доставлено. Во всех остальных случаях лучше использовать другие подходы.
🐘🎓 Подтянуть свои знания по PHP вы можете на нашем телеграм-канале «Библиотека PHP для собеса»
Асинхронная отправка
Как работает:
Асинхронная отправка похожа на стратегию «отправить и забыть» с той лишь разницей, что вы используете функцию обратного вызова для обработки подтверждения или ошибок от Kafka. Программа не блокируется, как при синхронной отправке, но при этом есть возможность обработать успешное подтверждение или ошибку в коллбэке.
Плюсы:
- Хорошая производительность – программа не блокируется для каждой отправки сообщения. Сообщения отправляются быстро, что важно для высоконагруженных систем.
- Обработка ошибок – есть механизм для обработки возможных проблем, и вы не теряете контроль над процессом отправки.
Минус:
- Сложнее в реализации – необходимо писать код для обработки callback-функций, что добавляет сложности, особенно если нужно детально обрабатывать всевозможные ошибки или подтверждения.
Когда использовать:
Это наиболее универсальная стратегия, которая подходит для большинства высоконагруженных и распределенных систем, где важно одновременно обеспечивать высокую производительность и надежность. Например:
- Обработка заказов в системах электронной коммерции, где нужна высокая производительность, но вы также хотите быть уверены, что каждый заказ доставлен.
- Системы с высокими нагрузками (например, социальные сети или аналитические системы), где нужно быстро обрабатывать большой объем сообщений, но при этом отслеживать возможные ошибки.
🐍🧩 Интересные задачи по Python для практики можно найти на нашем телеграм-канале «Библиотека задач по Python»
Подведем итоги
В большинстве случаев рекомендуется использовать асинхронную отправку – она обеспечивает оптимальный баланс между производительностью и надежностью. «Отправить и забыть» подходит для систем, где потеря сообщений не критична, а синхронную отправку стоит использовать только в том редком случае, когда нужно абсолютное подтверждение доставки, а производительностью можно пожертвовать.
Автор рассылки: Наталья Кайда