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, когда будет предложено.
Давайте рассмотрим, что мы настроили в нашем файле компоновки.
- Первый шаг - получить последний образ версии 2 реестра Docker из хранилища. Мы не используем тег latest, потому что это может вызвать проблемы в случае обновления до новой основной версии. Установка его на 2 позволяет вам получать все обновления 2.x, предотвращая автоматическое обновление до следующей основной версии, что может привести к поломкам.
- Контейнер реестра настроен на автоматический перезапуск в случае сбоя или неожиданного завершения работы.
- Мы установили различные переменные окружения для хранения 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.
- Реестр Docker общается через порт 5000, который мы открыли на нашем сервере для Docker.
./auth:/etc/nginx/conf.dобеспечивает доступ ко всем настройкам Nginx в контейнере../auth/nginx.conf:/etc/nginx/nginx.conf:roсопоставляет файл настроек Nginx из системы с файлом в контейнере в режиме только для чтения../logs:/var/log/nginxпозволяет получить доступ к логам Nginx на системе, сопоставляя с директорией логов Nginx в контейнере.- Настройки реестра 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 в качестве хранилища. Если у вас есть какие-либо вопросы, оставьте их в комментариях ниже.
Get new posts in your inbox
No spam. Unsubscribe anytime.