Docker · 11 min read · Oct 05, 2025

Как настроить частный реестр Docker на Ubuntu 22.04

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

Этот учебник научит вас, как настроить и использовать частный реестр Docker на сервере Ubuntu 22.04, используя Amazon S3 в качестве места хранения.

Предварительные требования

  • Два сервера Linux с Ubuntu 22.04. Один сервер будет выступать в качестве хоста реестра, в то время как другой будет использоваться в качестве клиента для отправки запросов и получения образов от хоста.
  • Зарегистрированное доменное имя, указывающее на сервер хоста. Мы будем использовать registry.example.com для нашего учебника.
  • Непривилегированный пользователь с правами sudo на обоих машинах.
  • Убедитесь, что все обновлено. $ sudo apt update $ sudo apt upgrade
  • Несколько пакетов, которые нужны вашей системе. $ sudo apt install wget curl nano software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release ubuntu-keyring unzip -y Некоторые из этих пакетов могут уже быть установлены на вашей системе.

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

Первый шаг - настроить брандмауэр. Ubuntu по умолчанию поставляется с ufw (Uncomplicated Firewall).

Проверьте, работает ли брандмауэр.

$ sudo ufw status

Вы должны получить следующий вывод.

Статус: неактивен

Разрешите SSH-порт, чтобы брандмауэр не разорвал текущее соединение при его включении.

$ sudo ufw allow OpenSSH

Также разрешите порты HTTP и HTTPS.

$ sudo ufw allow http
$ sudo ufw allow https

Включите брандмауэр

$ sudo ufw enable
Команда может нарушить существующие ssh-соединения. Продолжить операцию (y|n)? y
Брандмауэр активен и включен при запуске системы

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

$ sudo ufw status

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

Статус: активен

Куда                       Действие    Откуда
--                         ------      ----
OpenSSH                    Разрешить   Везде
80/tcp                     Разрешить   Везде
443                        Разрешить   Везде
OpenSSH (v6)               Разрешить   Везде (v6)
80/tcp (v6)                Разрешить   Везде (v6)
443 (v6)                   Разрешить   Везде (v6)

Шаг 2 - Установка Docker и Docker Compose

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

Ubuntu 22.04 поставляется со старой версией Docker. Чтобы установить последнюю версию, сначала импортируйте GPG-ключ Docker.

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Создайте файл репозитория Docker.

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Обновите список репозиториев системы.

$ sudo apt update

Установите последнюю версию Docker.

$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

Проверьте, что он работает.

$ sudo systemctl status docker
? docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2023-04-13 09:37:09 UTC; 3min 47s ago
TriggeredBy: ? docker.socket
       Docs: https://docs.docker.com
   Main PID: 2106 (dockerd)
      Tasks: 7
     Memory: 26.0M
        CPU: 267ms
     CGroup: /system.slice/docker.service
             ??2106 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

По умолчанию Docker требует привилегий root. Если вы хотите избежать использования sudo каждый раз, когда вы выполняете команду docker, добавьте свое имя пользователя в группу docker.

$ sudo usermod -aG docker $(whoami)

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

$ su - ${USER}

Подтвердите, что ваш пользователь добавлен в группу Docker.

$ groups
navjot wheel docker

Шаг 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 должен быть отключен.
  • Публичный доступ к корзине должен быть отключен.
  • Версионирование корзины должно быть отключено.
  • Включите шифрование корзины с использованием управляемых ключей Amazon S3. (SSE-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

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

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=AKIA3FIG4NVFNXKQXMSJ
      - 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, когда будет предложено.

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

  1. Первый шаг - получить последний образ версии 2 реестра Docker из хранилища. Мы не используем тег latest, потому что это может вызвать проблемы в случае обновления до новой основной версии. Установка его на 2 позволяет вам получать все обновления 2.x, предотвращая автоматическое обновление до следующей основной версии, что может привести к поломкам.
  2. Контейнер реестра настроен на автоматический перезапуск в случае сбоя или неожиданного завершения работы.
  3. Мы установили различные переменные окружения для хранения Amazon S3. Давайте быстро пройдемся по ним. - REGISTRY_STORAGE устанавливает тип хранения. Мы выбрали s3, так как используем Amazon S3.
  • REGISTRY_STORAGE_S3_REGION устанавливает регион вашей корзины S3.
  • REGISTRY_STORAGE_S3_BUCKET устанавливает имя вашей корзины S3.
  • REGISTRY_STORAGE_S3_ENCRYPT - установите в true, если вы включили шифрование корзины.
  • 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, если вы используете v4 аутентификации AWS. Если вы получаете ошибки, связанные с входом в S3, установите его в false.
  • REGISTRY_STORAGE_S3_ROOTDIRECTORY - устанавливает корневую директорию в вашей корзине, под которой будут храниться данные вашего реестра.
  • REGISTRY_STORAGE_CACHE_BLOBDESCRIPTOR - устанавливает местоположение для кеша. В нашем случае мы храним его в памяти. Вы также можете установить его для использования Redis.
  • REGISTRY_HEALTH_STORAGEDRIVER_ENABLED - установите в false, чтобы отключить службу проверки состояния хранилища реестра. В реестре есть ошибка, которая может вызвать проблемы, если вы не установите ее в false.
  1. Реестр Docker общается через порт 5000, который мы открыли на нашем сервере для Docker.
  2. ./auth:/etc/nginx/conf.d обеспечивает доступ ко всем настройкам Nginx в контейнере.
  3. ./auth/nginx.conf:/etc/nginx/nginx.conf:ro сопоставляет файл настроек Nginx из системы с файлом в контейнере в режиме только для чтения.
  4. ./logs:/var/log/nginx позволяет получить доступ к логам Nginx на системе, сопоставляя с директорией логов Nginx в контейнере.
  5. Настройки реестра Docker хранятся в файле /etc/docker/registry/config.yml в контейнере, и мы сопоставили его с файлом config.yml в текущей директории, который мы создадим на следующем шаге.

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

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

$ sudo apt install apache2-utils -y

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

$ htpasswd -Bc ~/docker-registry/auth/nginx.htpasswd user1
Новый пароль:
Повторите новый пароль:
Добавление пароля для пользователя user1

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

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

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

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

Шаг 4 - Установка SSL

Нам нужно установить Certbot для генерации SSL-сертификата. Вы можете либо установить Certbot с помощью репозитория Ubuntu, либо получить последнюю версию с помощью инструмента Snapd. Мы будем использовать версию Snapd.

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

$ sudo snap install core && sudo snap refresh core

Установите Certbot.

$ sudo snap install --classic certbot

Используйте следующую команду, чтобы убедиться, что команда Certbot может быть выполнена, создав символическую ссылку на директорию /usr/bin.

$ sudo ln -s /snap/bin/certbot /usr/bin/certbot

Выполните следующую команду для генерации SSL-сертификата.

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

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

Сгенерируйте сертификат Diffie-Hellman group.

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

Проверьте службу планировщика обновления Certbot.

$ sudo systemctl list-timers

Вы найдете snap.certbot.renew.service как одну из служб, запланированных для выполнения.

NEXT                        LEFT          LAST                        PASSED        UNIT                      ACTIVATES
.....
Sun 2023-04-14 00:00:00 UTC 19min left    Sat 2023-02-25 18:04:05 UTC n/a          snap.certbot.renew.timer  snap.certbot.renew.service
Sun 2023-04-14 00:00:20 UTC 19min left    Sat 2023-02-25 10:49:23 UTC 14h ago      apt-daily-upgrade.timer   apt-daily-upgrade.service
Sun 2023-04-14 00:44:06 UTC 3h 22min left Sat 2023-02-25 20:58:06 UTC 7h ago       apt-daily.timer           apt-daily.service

Выполните пробный запуск процесса, чтобы проверить, работает ли обновление SSL.

$ sudo certbot renew --dry-run

Если вы не видите ошибок, вы готовы. Ваш сертификат будет автоматически обновляться.

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

Скопируйте сертификат Diffie-Hellman group в директорию ~/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;
  }

  ## Установите переменную, чтобы помочь нам решить, нужно ли добавлять
  ## заголовок 'Docker-Distribution-Api-Version'.
  ## Реестр всегда устанавливает этот заголовок.
  ## В случае, если nginx выполняет аутентификацию, заголовок не установлен
  ## поскольку nginx выполняет аутентификацию перед проксированием.
  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;

    # Рекомендации с 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/conf.d/dhparam.pem;
    resolver 8.8.8.8;

    # отключите любые ограничения, чтобы избежать HTTP 413 для больших загрузок изображений
    client_max_body_size 0;

    # необходимо, чтобы избежать HTTP 411: см. Проблема #1486 (https://github.com/moby/moby/issues/1486)
    chunked_transfer_encoding on;

    location /v2/ {
      # Не позволяйте соединениям от docker 1.5 и ранее
      # docker pre-1.6.0 не устанавливал должным образом user agent на ping, поймайте "Go *" user agents
      if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) {
        return 404;
      }

      # Чтобы добавить базовую аутентификацию к v2, используйте настройку auth_basic.
      auth_basic "Registry realm";
      auth_basic_user_file /etc/nginx/conf.d/nginx.htpasswd;

      ## Если $docker_distribution_api_version пуст, заголовок не добавляется.
      ## См. директиву map выше, где эта переменная определена.
      add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always;

      proxy_pass                          http://docker-registry;
      proxy_set_header  Host              $http_host;   # требуется для клиента docker
      proxy_set_header  X-Real-IP         $remote_addr; # передать реальный 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, когда будет предложено.

Шаг 6 - Запуск реестра Docker

Перейдите в директорию реестра Docker.

$ cd ~/docker-registry

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

$ docker compose up -d

Проверьте статус контейнеров.

$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS                                      NAMES
3328b7e36bb2   nginx:alpine   "/docker-entrypoint.…"   About a minute ago   Up 3 seconds        80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   docker-registry-nginx-1
bf7cdfc0e013   registry:2     "/entrypoint.sh /etc…"   About a minute ago   Up About a minute   5000/tcp                                 docker-registry-registry-1

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

$ docker login -u=user1 -p=password https://registry.example.com

Вы получите следующий вывод.

WARNING! Использование --password через CLI небезопасно. Используйте --password-stdin.
WARNING! Ваш пароль будет храниться в нешифрованном виде в /home/username/.docker/config.json.
Настройте помощник по учетным данным, чтобы убрать это предупреждение. См.
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

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

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

$ curl -u user1 -X GET https://registry.example.com/v2/
Введите пароль хоста для пользователя 'user1':
{}

Скачайте последний образ Ubuntu docker.

$ docker pull ubuntu:latest

Тегируйте этот образ для частного реестра.

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

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

$ docker push registry.example.com/ubuntu2204

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

$ curl -u user1 -X GET https://registry.example.com/v2/_catalog
Введите пароль хоста для пользователя 'user1':
{"repositories":["ubuntu2204"]}

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

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

$ docker logout https://registry.example.com
Удаление учетных данных для входа для registry.example.com

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

$ docker images
REPOSITORY                            TAG       IMAGE ID       CREATED       SIZE
registry                             2         8db46f9d7550   2 weeks ago   24.2MB
nginx                                alpine    8e75cbc5b25c   2 weeks ago   41MB
ubuntu                               latest    08d22c0ceb15   5 weeks ago   77.8MB
registry.example.com/ubuntu2204      latest    08d22c0ceb15   5 weeks ago   77.8MB

Шаг 7 - Доступ и использование реестра Docker с клиентской машины

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

Войдите в частный реестр Docker с клиентской машины.

$ docker login -u=user1 -p=password https://registry.example.com

Скачайте образ Ubuntu из реестра.

$ docker pull registry.example.com/ubuntu2204

Список всех образов на вашей клиентской машине.

$ docker images
REPOSITORY                        TAG        IMAGE ID       CREATED         SIZE
registry.example.com/ubuntu2204   latest     08d22c0ceb15   5 weeks ago   77.8MB

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

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

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

root@647899f255db:

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

root@a2da49fdbea9$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
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"
UBUNTU_CODENAME=jammy

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

Заключение

Это завершает наш учебник по настройке частного реестра Docker на сервере Ubuntu 22.04, который использует Amazon S3 в качестве хранилища. Если у вас есть какие-либо вопросы, оставьте их в комментариях ниже.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.