Итоги недели в мире бэкенда и обзоры новых сервисов: как развернуть собственный реестр для хостинга Docker-контейнеров

Итоги недели в мире бэкенда и обзоры новых сервисов: как развернуть собственный реестр для хостинга Docker-контейнеров

🐳 Как создать свой реестр для хостинга Docker-контейнеров

Создание собственного реестра контейнеров – оптимальное решение, если:

  • Вы не хотите зависеть от внешних поставщиков услуг.
  • Вам необходимо соблюдать особые требования безопасности или конфиденциальности данных.

Автор этой публикации разобрал по шагам процесс реализации такого реестра.

Что такое образ контейнера

Образ контейнера – это пакет, включающий в себя все необходимые файлы, библиотеки и конфигурации для запуска контейнера. Он состоит из слоев, каждый из которых представляет собой изменения в файловой системе (добавление, удаление или модификацию файлов). Самый распространенный способ создания образа – это использование Dockerfile:

Итоги недели в мире бэкенда и обзоры новых сервисов: как развернуть собственный реестр для хостинга Docker-контейнеров

Что такое реестр контейнеров

Реестр контейнеров – это хранилище, которое позволяет загружать и скачивать образы контейнеров. Реестры бывают публичными (например, Docker Hub) и приватными. Приватные реестры обеспечивают повышенную безопасность и контроль над доступом к образам. URL образа выглядит примерно так:

Итоги недели в мире бэкенда и обзоры новых сервисов: как развернуть собственный реестр для хостинга Docker-контейнеров

Привет!

Мы запустили еженедельную email-рассылку, посвященную последним новостям и тенденциям в мире бэкенда. В еженедельных письмах ты найдешь:

  • Языки программирования и фреймворки для бэкенда.
  • Архитектура и проектирование серверных приложений.
  • Базы данных и управление данными.
  • Безопасность и защита данных.
  • Облачные технологии и DevOps.
  • API и интеграции.
  • Тестирование и отладка.
  • Инструменты и утилиты для бэкенд-разработчиков.
  • Лучшие практики и паттерны проектирования.

Почему стоит создать собственный реестр

Самостоятельный хостинг реестра позволяет полностью контролировать инфраструктуру и избегать зависимости от сторонних поставщиков. Это особенно важно, если вы работаете в условиях строгого регулирования или хотите повысить безопасность.

Как развернуть собственный реестр

Существует несколько опенсорсных решений для создания реестров контейнеров. Наиболее популярное, однако, – это официально поддерживаемый Docker registry. Этот реестр предназначен для хранения и распространения образов контейнеров и артефактов, и он запускается прямо в контейнере.

Основные шаги для создания реестра:

  • Установка Docker и Docker Compose на сервере.
  • Настройка конфигурации и запуск контейнера registry.
  • Запуск nginx для обработки и перенаправления запросов к контейнеру реестра.
  • Настройка SSL-сертификатов и подключение домена.

Установка Docker и Docker Compose

Для начала вам понадобится сервер с установленным Docker. Например, это может быть виртуальная машина с Ubuntu на любой подходящей платформе. Установите Docker и Docker Compose (он упрощает управление приложениями со множеством контейнеров):

Итоги недели в мире бэкенда и обзоры новых сервисов: как развернуть собственный реестр для хостинга Docker-контейнеров

🤖🎓 Подтянуть свои знания по Data Science вы можете на нашем телеграм-канале «Библиотека DS для собеса»

Proglib.io

Конфигурация реестра

Для настройки контейнера реестра нужно создать файл compose.yaml со следующей конфигурацией:

Итоги недели в мире бэкенда и обзоры новых сервисов: как развернуть собственный реестр для хостинга Docker-контейнеров

Будут созданы два тома: один для хранения образов, второй для хранения файла с паролями. Для аутентификации пользователей необходимо создать файл с паролями с помощью команды htpasswd. Например, добавим пользователя busy с паролем bee:

Итоги недели в мире бэкенда и обзоры новых сервисов: как развернуть собственный реестр для хостинга Docker-контейнеров

Теперь можно запустить реестр командой docker-compose up. Если все настроено правильно, вы увидите сообщение о том, что реестр слушает порт 5000:

Итоги недели в мире бэкенда и обзоры новых сервисов: как развернуть собственный реестр для хостинга Docker-контейнеров

Настройка nginx для обработки TLS

Для безопасности реестр должен использовать защищенное SSL-соединение. Для проксирования запросов и обработки TLS можно использовать nginx, а для получения SSL-сертификата – Let’s Encrypt. Сертификат сохраняется в директории ./nginx/certs. В файле compose.yaml добавим секцию для nginx:

Итоги недели в мире бэкенда и обзоры новых сервисов: как развернуть собственный реестр для хостинга Docker-контейнеров

Пример файла конфигурации nginx (nginx.conf):

Итоги недели в мире бэкенда и обзоры новых сервисов: как развернуть собственный реестр для хостинга Docker-контейнеров

Проверка и запуск

После настройки запустите контейнеры с реестром и nginx:

docker-compose up

На стороне клиента необходимо войти в реестр:

Итоги недели в мире бэкенда и обзоры новых сервисов: как развернуть собственный реестр для хостинга Docker-контейнеров

Теперь можно создавать и загружать образы в наш реестр:

Итоги недели в мире бэкенда и обзоры новых сервисов: как развернуть собственный реестр для хостинга Docker-контейнеров

🐘🧩 Интересные задачи по PHP для практики можно найти на нашем телеграм-канале «Библиотека задач по PHP»

Proglib.io

В заключение

Для запуска реестра при желании можно использовать Kubernetes. Если требуется пользовательский интерфейс, пригодится joxit/docker-registry-ui. Полный код проекта есть в репозитории автора, а на YouTube можно посмотреть ролик о создании реестра.

👻 3 основных стратегии отправки сообщений в Kafka

Существуют три основных подхода к отправке сообщений, и каждый представляет собой определенный компромисс между надежностью, производительностью и сложностью реализации:

  • «Отправить и забыть».
  • Синхронная отправка.
  • Асинхронная отправка.

Разберем нюансы, преимущества и недостатки каждого из этих подходов.

🐍🎓 Подтянуть свои знания по Python вы можете на нашем телеграм-канале «Библиотека Python для собеса»

Proglib.io

«Отправить и забыть»

Как работает:

ProducerRecord<String, String> record = new ProducerRecord<>("topic-1", "msg", "kafka trial message"); try { producer.send(record); } catch(Exception e) { e.printStackTrace(); }
Kafka Producer отправляет сообщение в Kafka Broker, но не получает подтверждения от брокера о том, что сообщение было доставлено и записано в соответствующую тему
Kafka Producer отправляет сообщение в Kafka Broker, но не получает подтверждения от брокера о том, что сообщение было доставлено и записано в соответствующую тему

В этой стратегии мы просто отправляем сообщение в Kafka и не ждем подтверждения от брокера о том, что сообщение было доставлено или обработано. Как только сообщение отправлено, программа продолжает свою работу, не проверяя, доставлено ли сообщение. Kafka сам по себе гарантирует определенный уровень надежности за счет своей архитектуры (высокая доступность, несколько реплик сообщений и механизмы автоматической отправки повторных сообщений в случае мелких ошибок).

Однако, если произойдет более серьезный сбой (например, сбой сети или поломка узла брокера), сообщение может быть утеряно, и система об этом не узнает.

Плюсы:

  • Высокая производительность – отправка сообщений не блокирует поток программы, и система может отправлять сообщения с максимальной скоростью.
  • Простота реализации – не требуется обрабатывать ответы или ошибки от брокера.

Минусы:

  • Риск потери сообщений – если что-то пойдет не так, сообщение может не дойти до брокера или быть потеряно, и программа об этом не узнает.
  • Отсутствие контроля – мы не получаем информацию о том, куда было отправлено сообщение и было ли оно доставлено.

Когда использовать:

Когда потеря сообщений не является критичной. Это может быть допустимо для задач, где небольшая потеря данных не приведет к серьезным последствиям. Например:

  • Логи – если несколько логов будут утеряны, это не будет критично.
  • Данные сенсоров – если из тысяч данных с датчиков несколько не будут доставлены, система все равно сможет корректно работать.

🤖🧩 Интересные задачи по Data Science для практики можно найти на нашем телеграм-канале «Библиотека задач по DS»

Proglib.io

Синхронная отправка

Как работает:

ProducerRecord<String, String> record = new ProducerRecord<>("topic-1", "msg", "kafka trial message"); try { producer.send(record).get(); } catch(Exception e) { e.printStackTrace(); }
Каждый вызов блокирует выполнение программы, пока не будет получено подтверждение
Каждый вызов блокирует выполнение программы, пока не будет получено подтверждение

В синхронной отправке после вызова метода send() программа блокируется и ожидает подтверждения от Kafka, что сообщение было доставлено. Как только подтверждение получено, программа продолжает работу. Если подтверждение не получено или произошла ошибка, вызывается исключение.

Плюсы:

  • Надежность – если какие-то действия нужно выполнять только в случае успешной доставки сообщения, и ни в каком другом случае больше, то эта стратегия обеспечит такую меру.
  • Простота реализации – этот подход реализовать гораздо проще, чем асинхронный.

Минусы:

  • Снижение производительности – если брокеры перегружены или сеть работает медленно, это может существенно замедлить работу системы.
  • Отсутствие гибкости – система становится менее эффективной в условиях высоких нагрузок, так как каждая отправка ждет ответа перед продолжением работы.

Когда использовать:

Когда каждое сообщение имеет критическое значение, и вам необходимо быть уверенным, что оно доставлено. Во всех остальных случаях лучше использовать другие подходы.

🐘🎓 Подтянуть свои знания по PHP вы можете на нашем телеграм-канале «Библиотека PHP для собеса»

Proglib.io

Асинхронная отправка

Как работает:

ProducerRecord<String, String> record = new ProducerRecord<>("topic-1", "msg", "new kafka async"); try { producer.send(record, new DemoProducerCallback()); } catch(Exception e) { e.printStackTrace(); }
В коллбэке можно записать подтверждение в лог или попробовать отправить сообщение снова в случае ошибки
В коллбэке можно записать подтверждение в лог или попробовать отправить сообщение снова в случае ошибки

Асинхронная отправка похожа на стратегию «отправить и забыть» с той лишь разницей, что вы используете функцию обратного вызова для обработки подтверждения или ошибок от Kafka. Программа не блокируется, как при синхронной отправке, но при этом есть возможность обработать успешное подтверждение или ошибку в коллбэке.

Плюсы:

  • Хорошая производительность – программа не блокируется для каждой отправки сообщения. Сообщения отправляются быстро, что важно для высоконагруженных систем.
  • Обработка ошибок – есть механизм для обработки возможных проблем, и вы не теряете контроль над процессом отправки.

Минус:

  • Сложнее в реализации – необходимо писать код для обработки callback-функций, что добавляет сложности, особенно если нужно детально обрабатывать всевозможные ошибки или подтверждения.

Когда использовать:

Это наиболее универсальная стратегия, которая подходит для большинства высоконагруженных и распределенных систем, где важно одновременно обеспечивать высокую производительность и надежность. Например:

  • Обработка заказов в системах электронной коммерции, где нужна высокая производительность, но вы также хотите быть уверены, что каждый заказ доставлен.
  • Системы с высокими нагрузками (например, социальные сети или аналитические системы), где нужно быстро обрабатывать большой объем сообщений, но при этом отслеживать возможные ошибки.

🐍🧩 Интересные задачи по Python для практики можно найти на нашем телеграм-канале «Библиотека задач по Python»

Proglib.io

Подведем итоги

В большинстве случаев рекомендуется использовать асинхронную отправку – она обеспечивает оптимальный баланс между производительностью и надежностью. «Отправить и забыть» подходит для систем, где потеря сообщений не критична, а синхронную отправку стоит использовать только в том редком случае, когда нужно абсолютное подтверждение доставки, а производительностью можно пожертвовать.

Автор рассылки: Наталья Кайда

4
1 комментарий