Перейти к содержимому
Главная страница » Свой docker-registry

Свой docker-registry

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

Прежде чем говорить о реестрах контейнеров, давайте сначала разберёмся, что такое образ контейнера. В двух словах, образ контейнера — это пакет, который включает в себя все файлы, библиотеки и конфигурации для запуска контейнера. Он состоит из слоёв, где каждый слой представляет собой набор изменений в файловой системе, которые добавляют, удаляют или изменяют файлы.

Самый распространенный способ создания образа контейнера — использование Dockerfile.

# build an image
docker build -t pliutau/hello-world:v0 .

# check the images locally
docker images
# REPOSITORY    TAG       IMAGE ID       CREATED          SIZE
# hello-world   latest    9facd12bbcdd   22 seconds ago   11MB

Это создаёт образ контейнера, который хранится на вашем локальном компьютере. Но что, если вы хотите поделиться этим образом с другими или использовать его на другом компьютере? В этом случае на помощь приходят реестры контейнеров.Подписка

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

Реестр контейнеров — это каталог хранилища, из которого можно загружать и извлекать образы контейнеров. Образы группируются в репозитории, которые представляют собой наборы связанных образов с одинаковыми именами. Например, в реестре Docker Hub nginx — это название репозитория, содержащего различные версии образов nginx.

Некоторые реестры являются общедоступными, то есть размещённые в них образы доступны всем в Интернете. Общедоступные реестры, такие как Docker Hub, являются хорошим вариантом для размещения проектов с открытым исходным кодом.

С другой стороны, частные реестры позволяют обеспечить безопасность и конфиденциальность при хранении корпоративных образов контейнеров в облаке или локально. Эти частные реестры часто оснащены расширенными функциями безопасности и технической поддержкой. Список доступных частных реестров постоянно растет, например, Amazon ECRGCP Artifact RegistryGitHub Container Registry, а также Docker Hub предлагает функцию частного репозитория.

Как разработчик, вы взаимодействуете с реестром контейнеров при использовании команд docker push и docker pull.

docker push docker.io/pliutau/hello-world:v0

# In case of Docker Hub we could also skip the registry part
docker push pliutau/hello-world:v0

Давайте посмотрим на анатомию URL-адреса изображения контейнера.

docker pull docker.io/pliutau/hello-world:v0@sha256:dc11b2...
                |            |            |          |
                ↓            ↓            ↓          ↓
             registry    repository      tag       digest

Зачем свой Docker Registry?

Иногда вместо того, чтобы полагаться на поставщика услуг, например AWS или GCP, вы можете разместить свои изображения самостоятельно. Это позволит вам управлять инфраструктурой самостоятельно и снизит вашу зависимость от внешних поставщиков. В некоторых строго регулируемых отраслях это даже является обязательным требованием.

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

Как самостоятельно разместить реестр контейнеров?

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

Вот основные шаги по запуску реестра на сервере:

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

Сервер

Вы можете использовать любой сервер, поддерживающий Docker. Например, вы можете использовать DigitalOcean Droplet с Ubuntu. Для этой демонстрации я использовал Google Cloud Compute для создания виртуальной машины с Ubuntu.

neofetch

# OS: Ubuntu 20.04.6 LTS x86_64
# CPU: Intel Xeon (2) @ 2.200GHz
# Memory: 3908MiB

Как только мы окажемся внутри виртуальной машины, нам нужно будет установить Docker и Docker Compose. Docker Compose не является обязательным, но он упрощает управление приложениями с несколькими контейнерами.

# install docker engine and docker-compose
sudo snap install docker

# verify the installation
docker --version
docker-compose --version

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

Далее нам нужно настроить наш контейнер реестра. Следующий файл compose.yaml создаст контейнер реестра с томом для хранения образов и томом для хранения файла с паролем.

services:
  registry:
    image: registry:latest
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.password
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    volumes:
      # Mount the password file
      - ./registry/registry.password:/auth/registry.password
      # Mount the data directory
      - ./registry/data:/data
    ports:
      - 5000

Файл паролей, определенный в REGISTRY_AUTH_HTPASSWD_PATH, используется для аутентификации пользователей при отправке или получении изображений из реестра. Мы должны создать файл паролей с помощью команды htpasswd. Мы также должны создать папку для хранения изображений.

mkdir -p ./registry/data

# install htpasswd
sudo apt install apache2-utils

# create a password file. username: busy, password: bee
htpasswd -Bbn busy bee > ./registry/registry.password

Теперь мы можем запустить контейнер реестра. Если вы видите это сообщение, значит, всё работает как надо.

docker-compose up

# successfull run should output something like this:
# registry | level=info msg="listening on [::]:5000"

SSL — сертификаты и Nginx

Как упоминалось ранее, мы можем использовать Nginx для обработки TLS и переадресации запросов в контейнер реестра. Для работы Docker Registry требуется действительный доверенный SSL-сертификат. Вы можете использовать что-то вроде Let’s Encrypt или получить его вручную. Убедитесь, что у вас есть доменное имя, указывающее на ваш сервер (registry.pliutau.com в моем случае). Для этой демонстрации я уже получил сертификаты с помощью certbot и поместил их в каталог ./nginx/certs.

Поскольку мы запускаем наш Docker Registry в контейнере, мы можем запустить Nginx в контейнере, добавив следующую службу в файл compose.yaml.

services:
  registry:
    # ...
  nginx:
    image: nginx:latest
    depends_on:
      - registry
    volumes:
      # mount the nginx configuration
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      # mount the certificates obtained from Let's Encrypt
      - ./nginx/certs:/etc/nginx/certs
    ports:
      - "443:443"

Наш файл nginx.conf может выглядеть следующим образом:

worker_processes auto;

events {
    worker_connections 1024;
}

http {
    upstream registry {
        server registry:5000;
    }

    server {
        server_name registry.pliutau.com;
        listen 443 ssl;

        ssl_certificate /etc/nginx/certs/fullchain.pem;
        ssl_certificate_key /etc/nginx/certs/privkey.pem;

        location / {
            # important setting for large images
            client_max_body_size                1000m;

            proxy_pass                          http://registry;
            proxy_set_header  Host              $http_host;
            proxy_set_header  X-Real-IP         $remote_addr;
            proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
            proxy_set_header  X-Forwarded-Proto $scheme;
            proxy_read_timeout                  900;
        }
    }
}

Готовы к работе!

После этих шагов мы можем запустить наш реестр и контейнеры Nginx.

docker-compose up

Теперь на стороне клиента вы можете отправлять и получать изображения из своего реестра. Но сначала нам нужно войти в реестр.

docker login registry.pliutau.com

# Username: busy
# Password: bee
# Login Succeeded

Пришло время создать и отправить наше изображение в наш автономный реестр!

docker build -t registry.pliutau.com/pliutau/hello-world:v0 .

docker push registry.pliutau.com/pliutau/hello-world:v0
# v0: digest: sha256:a56ea4... size: 738

На вашем сервере вы можете проверить загруженные изображения в папке data.

ls -la ./registry/data/docker/registry/v2/repositories/

Другие варианты

Следуя приведенному выше примеру, вы также можете запустить реестр в Kubernetes. Или вы можете использовать управляемый сервис реестра, такой как Harbor, который представляет собой реестр с открытым исходным кодом, предоставляющий расширенные функции безопасности и совместимый с Docker и Kubernetes.

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

Заключение

Самостоятельные реестры контейнеров позволяют полностью контролировать свой реестр и способ его развёртывания. В то же время это требует затрат на обслуживание и защиту реестра.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *