
Введение
Реестр Docker это мощный инструмент, который помогает управлять хранением и распространением образов контейнеров Docker. Хотя Docker Hub предоставляет бесплатный публичный реестр для размещения пользовательских образов Docker, существуют сценарии, в которых необходимо иметь частный реестр для обеспечения безопасности конфиденциальных или проприетарных образов. Создав частный реестр Docker, разработчики могут получить полный контроль над своими образами контейнеров и ограничить доступ к ним для авторизованных пользователей.
В этом руководстве мы рассмотрим процесс настройки и обеспечения безопасности частного реестра Docker на платформе Ubuntu 22.04 / 20.04 / 18.04. Вы узнаете, как настроить Docker Compose для определения параметров реестра и использовать Nginx для перенаправления трафика из интернета на запущенный Docker-контейнер. К концу этого урока вы сможете безопасно загружать и извлекать образы Docker из своего личного реестра.
Предварительные условия
Чтобы следовать этому руководству, вам понадобится следующее:
- Два сервера Ubuntu / Debian: один будет выступать в качестве хост сервер для вашего частного реестра Docker, а другой будет служить в качестве клиент сервер.
- На обоих серверах установлен Docker. Вы можете обратиться к руководству “Как установить и использовать Docker на Ubuntu 18.04/20.04/22.04 LTS” для получения подробных инструкций по настройке Docker.
- Docker Compose установлен на сервере хосте сервер.
- Nginx установлен на хосте сервер.
- Nginx, защищенный с помощью Let’s Encrypt на хост сервер.
- Зарегистрированное доменное имя, которое разрешается в сервер, на котором размещен ваш частный реестр Docker. Вы настроите его в рамках предварительного условия Let’s Encrypt. Для целей данного руководства мы будем называть этот домен
your_domain
.
Шаг 1: Установка и настройка реестра Docker
Для начала нам нужно настроить реестр Docker с помощью Docker Compose. Docker Compose позволяет легко определять и управлять конфигурацией контейнеров Docker.
- Подключитесь к вашему хост сервера через SSH.
- Создайте каталог под названием
docker-registry
для хранения файлов конфигурации, выполнив следующую команду:
$ mkdir ~/docker-registry
- Перейдите в только что созданный каталог:
cd ~/docker-registry
- Создайте подкаталог под названием
data
для хранения образов реестра Docker:
$ mkdir data
- Создайте
docker-compose.yml
файл и откройте его для редактирования:
$ nano docker-compose.yml
- Добавьте следующее содержимое в файл
docker-compose.yml
для определения базового экземпляра реестра Docker:
version: '3'
services:
registry:
image: registry:latest
ports:
- "5000:5000"
environment:
REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
volumes:
- ./data:/data
Эта конфигурация устанавливает службу реестра Docker под названием registry
, используя registry:latest
изображение. Он отображает порт 5000
на хосте в порт 5000
в контейнере. Сайт REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY
переменная окружения указывает каталог, в котором будут храниться изображения в контейнере. Наконец, монтируется ./data
каталог на хосте в каталог /data
каталог в контейнере, чтобы сохранить данные образа.
- Сохраните и закройте файл, нажав кнопку
Ctrl + X
, затемY
, а затемEnter
. - Запустите службу реестра Docker, выполнив следующую команду:
$ docker-compose up -d
[-d
флаг запускает контейнеры в фоновом режиме.
На этом этапе ваш частный реестр Docker запущен и работает на вашем хост-сервере. Доступ к реестру осуществляется через доменное имя или IP-адрес вашего сервера по порту 5000.
Шаг 2: Настройка Nginx в качестве обратного прокси-сервера
Чтобы обеспечить безопасный доступ к реестру Docker по HTTPS и направить трафик из интернета в контейнер реестра, мы будем использовать Nginx в качестве обратного прокси. Обратный прокси будет обрабатывать завершение SSL и перенаправлять запросы к службе реестра Docker.
- Подключитесь к вашему хост сервера через SSH.
- Откройте файл конфигурации Nginx для вашего домена с помощью следующей команды (замените
your_domain
на имя зарегистрированного домена):
$ sudo nano /etc/nginx/sites-available/your_domain
- Удалите существующее содержимое и добавьте следующую конфигурацию:
server {
listen 80;
listen [::]:80;
server_name your_domain;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name your_domain;
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
location / {
proxy_pass http://localhost:5000;
proxy_set_header Host $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;
}
}
Заменить your_domain
на зарегистрированное доменное имя. Эта конфигурация настраивает Nginx на перенаправление HTTP-запросов на HTTPS и прослушивает входящие HTTPS-запросы. В ней указывается SSL-сертификат и расположение ключей, предоставляемых Let’s Encrypt. Адрес location /
блок проксирует запросы к http://localhost:5000
, который соответствует службе Docker Registry, запущенной на хосте.
- Сохраните и закройте файл, нажав кнопку
Ctrl + X
, затемY
, а затемEnter
. - Включите конфигурацию Nginx, создав символическую ссылку:
$ sudo ln -s /etc/nginx/sites-available/your_domain /etc/nginx/sites-enabled/
- Проверьте конфигурацию Nginx на наличие синтаксических ошибок:
$ sudo nginx -t
Если в конфигурационном файле нет синтаксических ошибок, вы увидите syntax is ok
и test is successful
сообщения.
- Перезапустите Nginx, чтобы применить изменения:
$ sudo systemctl restart nginx
Теперь Nginx настроен как обратный прокси для вашего реестра Docker, обрабатывает завершение SSL и перенаправляет запросы к службе реестра.
Шаг 3: Выталкивание и извлечение образов из частного реестра Docker
Теперь, когда ваш частный реестр Docker настроен и доступен через ваше доменное имя по HTTPS, вы можете отправлять и извлекать образы Docker в реестр и из него.
Чтобы отправить образ в реестр, выполните следующую команду:
$ docker push your_domain/image_name:tag
Заменить your_domain
на зарегистрированное доменное имя, image_name
с именем вашего изображения, и tag
с указанием конкретной версии или тега для изображения.
Чтобы извлечь образ из реестра, выполните следующую команду:
$ docker pull your_domain/image_name:tag
Опять же, замените your_domain
, image_name
, и tag
с соответствующими значениями.
Шаг 4: Включите аутентификацию
По умолчанию реестр Docker, который мы настроили, не требует аутентификации для отправки и извлечения образов. Однако включение аутентификации добавляет дополнительный уровень безопасности вашему частному реестру Docker. При включенной аутентификации только авторизованные пользователи смогут получить доступ к реестру и взаимодействовать с ним.
Чтобы включить аутентификацию, вы можете выбрать один из нескольких методов аутентификации в зависимости от ваших требований. Одним из распространенных методов является использование системы аутентификации на основе имени пользователя и пароля. Реестр Docker поддерживает базовый механизм аутентификации с помощью файла htpasswd. Вот как можно включить аутентификацию:
Создайте файл htpasswd:
- Установите
apache2-utils
пакет, если он еще не установлен:
$ sudo apt-get install apache2-utils
- Создайте файл htpasswd с именем пользователя и паролем:
$ sudo htpasswd -Bc /path/to/htpasswd <username>
- Вам будет предложено ввести и подтвердить пароль для указанного имени пользователя. Повторите этот шаг для каждого пользователя, которого вы хотите добавить.
Настройте реестр Docker на использование аутентификации:
- Откройте свой
docker-compose.yml
файл. - Добавьте следующую переменную окружения в файл
registry
службу:
environment:
- REGISTRY_AUTH=htpasswd
- REGISTRY_AUTH_HTPASSWD_PATH=/path/to/htpasswd
- REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm
- Заменить
/path/to/htpasswd
на фактический путь к вашему файлу htpasswd.
Сохраните изменения и перезапустите реестр Docker:
$ docker-compose down
$ docker-compose up -d
После включения аутентификации пользователям необходимо будет предоставить действительные учетные данные (имя пользователя и пароль) для отправки и извлечения образов из реестра.
Не забывайте о безопасном управлении учетными записями и паролями пользователей. Регулярно проверяйте и при необходимости обновляйте доступ пользователей. Вы также можете изучить другие методы аутентификации, например аутентификацию на основе маркеров или интеграцию с внешними провайдерами аутентификации, такими как LDAP или OAuth.
Вот и все! Теперь у вас есть собственный частный реестр Docker, настроенный с использованием SSL-шифрования и доступный через доменное имя. Вы можете использовать этот реестр для безопасного хранения и управления образами Docker.
Заключение:
В этой статье мы рассмотрели процесс настройки частного реестра Docker. Мы рассмотрели установку Docker, создание файла Docker Compose, включение шифрования SSL/TLS и включение аутентификации для авторизованного доступа. Выполнив эти шаги, вы сможете создать безопасный реестр Docker для управления и распространения контейнерных приложений в вашей организации. Не забывайте следить за лучшими практиками безопасности и регулярно пересматривать конфигурацию реестра. Воспользуйтесь преимуществами хорошо защищенного реестра Docker для упрощенного развертывания приложений.