Поиск по сайту:

Как настроить частный реестр Docker в Rocky Linux 8


На этой странице

  1. Предпосылки
  2. Шаг 1. Настройка брандмауэра
  3. Шаг 2. Установите Docker и Docker Compose
  4. Шаг 3. Настройка реестра Docker
    1. Создание каталогов пользователей
    2. Создание корзины Amazon S3
    3. Создать файл Docker Compose
    4. Настройка аутентификации

    1. Скопируйте файл Dhparam в контейнер

    Если вы работаете в организации и хотите хранить свои образы докеров внутри для быстрого развертывания, то вам идеально подойдет частный репозиторий Docker. Наличие частного реестра Docker позволяет вам владеть конвейером распространения образов и иметь более строгий контроль над хранением и распространением образов. Вы можете интегрировать реестр с системой CI/CD, улучшив рабочий процесс.

    В этом руководстве вы узнаете, как настроить и использовать частный реестр Docker на сервере под управлением Rocky Linux 8, используя Amazon S3 в качестве места хранения.

    Предпосылки

    • Два сервера Linux с Rocky Linux 8. Один сервер будет выступать в качестве хоста реестра, а другой будет использоваться в качестве клиента для отправки запросов и получения изображений с хоста.
    • Зарегистрированное доменное имя, указывающее на хост-сервер. В нашем руководстве мы будем использовать registry.example.com.
    • Пользователь без полномочий root с правами sudo на обоих компьютерах.

    Шаг 1. Настройте брандмауэр

    Первым шагом является настройка брандмауэра. Rocky Linux использует Firewalld Firewall. Проверьте состояние брандмауэров.

    $ sudo firewall-cmd --state
    running
    

    Брандмауэр работает с разными зонами, и мы будем использовать публичную зону по умолчанию. Перечислите все службы и порты, активные на брандмауэре.

    $ sudo firewall-cmd --permanent --list-services
    

    Он должен показать следующий вывод.

    cockpit dhcpv6-client ssh
    

    Разрешить порты HTTP и HTTPS.

    $ sudo firewall-cmd --permanent --add-service=http
    $ sudo firewall-cmd --permanent --add-service=https
    

    Перепроверьте состояние брандмауэра.

    $ sudo firewall-cmd --permanent --list-services
    

    Вы должны увидеть аналогичный вывод.

    cockpit dhcpv6-client http https ssh
    

    Перезагрузите брандмауэр, чтобы изменения вступили в силу.

    $ sudo firewall-cmd --reload
    

    Шаг 2. Установите Docker и Docker Compose

    Этот шаг требуется как на сервере, так и на клиентских компьютерах.

    Установите официальный репозиторий Docker.

    $ sudo dnf install yum-utils
    $ sudo yum-config-manager \
        --add-repo \
        https://download.docker.com/linux/centos/docker-ce.repo
    

    Установите Докер.

    $ sudo dnf install docker-ce docker-ce-cli containerd.io
    

    Включите и запустите демон Docker.

    $ sudo systemctl enable docker --now
    

    Добавьте системного пользователя в группу Docker, чтобы не использовать sudo для запуска команд Docker.

    $ sudo usermod -aG docker $(whoami)
    

    Войдите снова на свой сервер после выхода из системы, чтобы активировать изменение.

    Загрузите и установите последнюю стабильную версию Docker Compose.

    $ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    

    Примените исполняемые разрешения к загруженному двоичному файлу.

    $ sudo chmod +x /usr/local/bin/docker-compose
    

    Установите скрипт завершения Bash для создания Docker.

    $ sudo curl \
        -L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \
        -o /etc/bash_completion.d/docker-compose
    

    Перезагрузите настройки своего профиля, чтобы заработало завершение bash.

    $ source ~/.bashrc
    

    Шаг 3 — Настройте реестр Docker

    Создание каталогов пользователей

    Создайте каталог для конфигурации реестра.

    $ mkdir ~/docker-registry
    

    Перейдите в каталог docker-registry.

    $ cd ~/docker-registry
    

    Создайте каталог для хранения пароля аутентификации HTTP, файлов конфигурации Nginx и сертификатов SSL.

    $ mkdir auth
    

    Создайте еще один каталог для хранения журналов Nginx.

    $ mkdir logs
    

    Создание корзины Amazon S3

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

    Следующим шагом является настройка файла конфигурации с несколькими важными настройками. Эти параметры также можно определить в файле docker-compose.yml, но лучше иметь отдельный файл.

    Создайте корзину со следующими настройками.

    • ACL должен быть отключен.
    • Общий доступ к сегменту должен быть отключен.
    • Управление версиями сегментов должно быть отключено.
    • Включите шифрование Bucket с помощью управляемых ключей Amazon S3. (ССЕ-S3)
    • Блокировка объекта должна быть отключена.

    Создайте пользователя IAM со следующей политикой.

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Action": [
            "s3:ListBucket",
            "s3:GetBucketLocation",
            "s3:ListBucketMultipartUploads"
          ],
          "Resource": "arn:aws:s3:::S3_BUCKET_NAME"
        },
        {
          "Effect": "Allow",
          "Action": [
            "s3:PutObject",
            "s3:GetObject",
            "s3:DeleteObject",
            "s3:ListMultipartUploadParts",
            "s3:AbortMultipartUpload"
          ],
          "Resource": "arn:aws:s3:::S3_BUCKET_NAME/*"
        }
      ]
    }
    

    Замените S3_BUCKET_NAME на имя вашей корзины S3.

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

    Создать файл Docker Compose

    Создайте файл docker-compose.yml и откройте его для редактирования.

    $ nano docker-compose.yml
    

    Вставьте в него следующий код.

    version: '3.3'
    services:
      registry:
        image: registry:2 
        restart: always
        environment:
          - REGISTRY_STORAGE=s3
          - REGISTRY_STORAGE_S3_REGION=us-west-2
          - REGISTRY_STORAGE_S3_BUCKET=hf-docker-registry
          - REGISTRY_STORAGE_S3_ENCRYPT=true
          - REGISTRY_STORAGE_S3_CHUNKSIZE=5242880
          - REGISTRY_STORAGE_S3_SECURE=true
          - REGISTRY_STORAGE_S3_ACCESSKEY=AKIA3FIG4NVFCJ6STMUA
          - REGISTRY_STORAGE_S3_SECRETKEY=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
          - REGISTRY_STORAGE_S3_V4AUTH=true
          - REGISTRY_STORAGE_S3_ROOTDIRECTORY=/image-registry
          - REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR=inmemory
          - REGISTRY_HEALTH_STORAGEDRIVER_ENABLED=false
      nginx:  
        image: "nginx:alpine"
        ports:
          - 443:443
        links:
          - registry:registry
        volumes:
          - ./auth:/etc/nginx/conf.d
          - ./auth/nginx.conf:/etc/nginx/nginx.conf:ro
          - ./logs:/var/log/nginx
          - /etc/letsencrypt:/etc/letsencrypt
    

    Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.

    Давайте пройдемся по тому, что мы настроили в нашем файле компоновки.

    <старт>

  5. Первый шаг — получить последний образ версии 2 реестра Docker из хаба. Мы не используем последний тег, потому что это может вызвать проблемы в случае обновления основной версии. Установка его на 2 позволяет вам получать все обновления 2.x, предотвращая автоматическое обновление до следующей основной версии, которая может привести к критическим изменениям.
  6. Контейнер реестра всегда перезагружается в случае сбоя или неожиданного завершения работы.
  7. Мы установили различные переменные среды для хранилища Amazon S3. Давайте быстро пройдемся по ним.
    • REGISTRY_STORAGE задает тип хранилища. Мы выбрали s3, так как используем Amazon S3.
    • REGISTRY_STORAGE_S3_REGION задает регион корзины S3.
    • REGISTRY_STORAGE_S3_BUCKET задает имя вашей корзины S3.
    • REGISTRY_STORAGE_S3_ENCRYPT – установите значение true, если вы включили шифрование Bucket.
    • REGISTRY_STORAGE_S3_CHUNKSIZE устанавливает размер загружаемых фрагментов. Он должен быть больше 5 МБ (5 * 1024 * 1024).
    • REGISTRY_STORAGE_S3_SECURE – установите значение true, если вы собираетесь использовать HTTPS.
    • REGISTRY_STORAGE_S3_ACCESSKEY и REGISTRY_STORAGE_S3_SECRETKEY — учетные данные пользователя, которые вы получили после создания пользователя IAM.
    • REGISTRY_STORAGE_S3_V4AUTH — установите значение true, если вы используете аутентификацию AWS v4. Если вы получаете ошибки, связанные с входом в S3, установите для него значение false.
    • REGISTRY_STORAGE_S3_ROOTDIRECTORY — устанавливает корневой каталог в вашей корзине, в котором будут храниться данные вашего реестра.
    • REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR — устанавливает расположение кэша. В нашем случае мы храним его в памяти. Вы также можете настроить его на использование Redis.
    • REGISTRY_HEALTH_STORAGEDRIVER_ENABLED — установите значение false, чтобы отключить службу проверки работоспособности хранилища реестра. В реестре есть ошибка, которая может вызвать проблемы, если вы не установите для нее значение false.
  8. Реестр Docker взаимодействует через порт 5000, который мы предоставили на нашем сервере докеру.
  9. Сопоставление ./auth:/etc/nginx/conf.d гарантирует, что все настройки Nginxs доступны в контейнере.
  10. ./auth/nginx.conf:/etc/nginx/nginx.conf:ro сопоставляет файл настроек Nginx из системы с файлом в контейнере в режиме только для чтения.
  11. ./logs:/var/log/nginx разрешает доступ к журналам Nginx в системе путем сопоставления с каталогом журналов Nginx в контейнере.
  12. Настройки реестра Docker хранятся в файле /etc/docker/registry/config.yml в контейнере, и мы сопоставили его с config.yml в текущем каталоге, который мы создадим на следующем шаге.

Настроить аутентификацию

Чтобы настроить аутентификацию HTTP, вам необходимо установить пакет httpd-tools.

$ sudo dnf install httpd-tools

Создайте файл паролей в каталоге ~/docker-registry/auth.

$ htpasswd -Bc ~/docker-registry/auth/nginx.htpasswd user1
New password:
Re-type new password:
Adding password for user user1

Флаг -c указывает команде создать новый файл, а флаг -B указывает использовать алгоритм bcrypt, поддерживаемый Docker. Замените user1 именем пользователя по вашему выбору.

Если вы хотите добавить больше пользователей, запустите команду еще раз, но без флага -c.

$ htpasswd -B ~/docker-registry/auth/registry.password user2

Теперь файл будет сопоставлен с контейнером реестра для аутентификации.

Шаг 4 — Установите SSL

Чтобы установить SSL-сертификат с помощью Lets Encrypt, нам нужно загрузить инструмент Certbot, который доступен в репозитории Epel.

Установите репозиторий EPEL и Certbot.

$ sudo dnf install epel-release 
$ sudo dnf install certbot

Создайте SSL-сертификат.

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m  -d registry.example.com

Приведенная выше команда загрузит сертификат в каталог /etc/letsencrypt/live/registry.example.com на вашем сервере.

Создайте групповой сертификат Диффи-Хеллмана.

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

Протестируйте обновление сертификата.

$ sudo certbot renew --dry-run

Если пробный прогон пройдет успешно, это означает, что ваши сертификаты будут автоматически обновлены.

Скопируйте файл Dhparam в контейнер

Скопируйте сертификат группы Диффи-Хеллмана в каталог ~/docker-registry/auth, который будет сопоставлен с контейнером.

$ sudo cp /etc/ssl/certs/dhparam.pem ~/docker-registry/auth

Шаг 5 — Настройте Nginx

Следующий шаг включает настройку сервера Nginx в качестве внешнего прокси-сервера для сервера реестра Docker. Реестр Docker поставляется со встроенным сервером, работающим на порту 5000. Мы поместим его за Nginx.

Создайте и откройте файл ~/docker-registry/auth/nginx.conf для редактирования.

$ sudo nano ~/docker-registry/auth/nginx.conf

Вставьте в него следующий код.

events {
    worker_connections  1024;
}

http {

  upstream docker-registry {
    server registry:5000;
  }

  ## Set a variable to help us decide if we need to add the
  ## 'Docker-Distribution-Api-Version' header.
  ## The registry always sets this header.
  ## In the case of nginx performing auth, the header is unset
  ## since nginx is auth-ing before proxying.
  map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
    '' 'registry/2.0';
  }

  server {
    listen 443 ssl http2;
    server_name registry.example.com;

    # SSL
    ssl_certificate /etc/letsencrypt/live/registry.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/registry.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/registry.example.com/chain.pem;

    access_log  /var/log/nginx/registry.access.log;
    error_log   /var/log/nginx/registry.error.log;

    # Recommendations from https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_prefer_server_ciphers on;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_session_cache shared:SSL:10m;
    ssl_dhparam /etc/nginx.d/conf.d/dhparam.pem;
    resolver 8.8.8.8;

    # disable any limits to avoid HTTP 413 for large image uploads
    client_max_body_size 0;

    # required to avoid HTTP 411: see Issue #1486 (https://github.com/moby/moby/issues/1486)
    chunked_transfer_encoding on;

    location /v2/ {
      # Do not allow connections from docker 1.5 and earlier
      # docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents
      if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
        return 404;
      }

      # To add basic authentication to v2 use auth_basic setting.
      auth_basic "Registry realm";
      auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd;

      ## If $docker_distribution_api_version is empty, the header is not added.
      ## See the map directive above where this variable is defined.
      add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;

      proxy_pass                          http://docker-registry;
      proxy_set_header  Host              $http_host;   # required for docker client's sake
      proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP
      proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
      proxy_set_header  X-Forwarded-Proto $scheme;
      proxy_read_timeout                  900;
    }
  }
}

Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса после завершения.

Настройте SELinux, чтобы разрешить сетевые подключения для частного реестра Docker.

$ sudo setsebool -P httpd_can_network_connect on

Шаг 6 — Запустите реестр Docker

Перейдите в каталог Docker Registrys.

$ cd ~/docker-registry

Запустите докер-контейнер.

$ docker-compose up -d

Проверьте состояние контейнеров.

$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                           NAMES
88d6addc1687   nginx:alpine   "/docker-entrypoint.…"   5 minutes ago   Up 5 minutes   80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   docker-registry_nginx_1
2b112edc1c72   registry:2     "/entrypoint.sh /etc…"   5 minutes ago   Up 5 minutes   5000/tcp                                        docker-registry_registry_1

Войдите в реестр Docker.

$ docker login -u=testuser -p=testpassword https://registry.example.com

Вы также можете открыть URL-адрес https://registry.example.com/v2/ в своем браузере, и он запросит имя пользователя и пароль. Вы должны увидеть пустую страницу с {} на ней.

Вы можете проверить URL-адрес на терминале, используя curl.

$ curl -u testuser -X GET https://registry.nspeaks.xyz/v2/
Enter host password for user 'testuser':
{}

Загрузите последний образ докера Ubuntu.

$ docker pull ubuntu:latest

Отметьте это изображение для частного реестра.

$ docker tag ubuntu:latest registry.example.com/ubunt4

Отправьте образ в реестр.

$ docker push registry.example.com/ubunt4

Проверьте, был ли толчок успешным.

$ curl -u testuser -X GET https://registry.nspeaks.xyz/v2/_catalog
Enter host password for user 'testuser':
{"repositories":["ubunt4"]}

При появлении запроса введите свой пароль аутентификации Nginx, и вы увидите список репозиториев, доступных через реестр.

Проверьте список образов Docker, доступных в настоящее время для использования.

$ docker images
REPOSITORY                            TAG       IMAGE ID       CREATED       SIZE
registry                              2         d3241e050fc9   5 days ago    24.2MB
nginx                                 alpine    53722defe627   5 days ago    23.4MB
httpd                                 2         118b6abfbf55   5 days ago    144MB
ubuntu                                latest    ff0fea8310f3   2 weeks ago   72.8MB
registry.nspeaks.xyz/ubunt4       latest    ff0fea8310f3   2 weeks ago   72.8MB

Шаг 7. Доступ и использование реестра Docker с клиентского компьютера

Войдите в свой клиент-сервер. На шаге 1 мы установили Docker на клиентскую машину.

Войдите в частный реестр Docker с клиентского компьютера.

$ docker login -u=testuser -p=testpassword https://registry.example.com

Извлеките образ Ubuntu из реестра.

$ docker pull registry.example.com/ubunt4

Перечислите все изображения на вашем клиентском компьютере.

$ docker images
REPOSITORY                        TAG        IMAGE ID       CREATED         SIZE
registry.nspeaks.xyz/ubunt4   latest     ff0fea8310f3   2 weeks ago     72.8MB

Создайте и запустите контейнер, используя загруженный образ.

$ docker run -it registry.example.com/ubunt4 /bin/bash

Вы войдете в оболочку внутри контейнера Ubuntu.

:

Выполните следующую команду, чтобы проверить версию Linux.

$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.4 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04.4 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal

Теперь вы можете начать использовать реестр Docker со своих клиентских компьютеров.

Заключение

На этом мы завершаем наше руководство по настройке частного реестра Docker на сервере Rocky Linux 8, который использует Amazon S3 в качестве хранилища. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.