Docker Registry или «Registry» – это серверное приложение с открытым исходным кодом и хорошо масштабируемое приложение, которое можно использовать для хранения и распространения образов Docker.
Это было приложение на стороне сервера за Docker Hub.
В большинстве случаев использование Docker Registry – отличное решение, если вы хотите внедрить систему CI / CD в разработку приложений.
Private Docker Registry предоставляет больше возможностей для цикла разработки и производства, объединяя все ваши собственные образы приложений Docker в одном месте.
В этом руководстве мы покажем вам, как установить и настроить системный реестр Docker на сервере Ubuntu 18.04.
Мы будем использовать веб-сервер Nginx и защищать реестр с помощью имени пользователя и пароля (базовая аутентификация).
Предпосылки
- Сервер Ubuntu 18.04
- root привилегии
Что мы будем делать?
- Установим зависимости
- Установим Docker и Docker-compose
- Настройка личного реестра Docker
- Тестирование
Шаг 1 – Установите зависимости пакета
Прежде всего, мы собираемся установить зависимости некоторых пакетов для развертывания Private Docker Registry.
sudo apt install -y gnupg2 pass apache2-utils httpie
Шаг 2 – Установите Docker и Docker-compose
Теперь мы собираемся установить docker и docker-compose из официального репозитория Ubuntu.
Установите Docker и Docker-compose, выполнив следующую команду.
sudo apt install -y docker.io docker-compose -y
После завершения установки запустите службу Docker и добавьте ее во время загрузки.
sudo systemctl start docker
sudo systemctl enable docker
Docker запущен и работает, и Docker-compose был установлен.
Проверьте с помощью команды ниже.
docker version
docker-compose version
И вам будет показана версия Docker и Docker-compose, установленных в вашей системе.
Шаг 3 – Настройка приватного реестра Docker
На этом этапе мы собираемся настроить среду реестра Docker, создав некоторую среду каталогов, и создать некоторую конфигурацию, включая docker-compose.yml, виртуальный хост nginx, дополнительную конфигурацию и т. д.
– Создание каталогов проектов
Создайте новый каталог для проекта с именем «registry» и создайте каталоги «nginx» и «auth» внутри.
mkdir -p registry/{nginx,auth}
После этого перейдите в каталог ‘registry’ и снова создайте новые каталоги внутри ‘nginx’.
cd registry/
mkdir -p nginx/{conf.d/,ssl}
И в результате каталоги проекта выглядят следующим образом.
tree
– Создание Docker-соmpose скрипта
Теперь мы должны создать новый скрипт docker-compose.yml для развертывания реестра Docker.
Перейдите в каталог ‘registry’ и создайте новый файл конфигурации ‘docker-compose.yml’.
cd registry/
vim docker-compose.yml
Во-первых, определите составную версию, которую вы хотите использовать, и службу.
version: '3'
services:
После этого добавьте первый сервис с именем ‘registry’.
Служба реестра Docker будет использовать образ Docker, предоставленный реестром команды Docker: 2.
Он подключит том докера «registrydata» и локальный каталог с именем «auth», содержащий базовый файл аутентификации «registry.passwd».
И, наконец, он будет запущен в пользовательском образе докера с именем «mynet» и предоставит порт 5000 как для контейнера, так и для хоста.
#Registry registry: image: registry:2 restart: always ports: - "5000:5000" environment: REGISTRY_AUTH: htpasswd REGISTRY_AUTH_HTPASSWD_REALM: Registry-Realm REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data volumes: - registrydata:/data - ./auth:/auth networks: - mynet
Затем, настройка службы ‘nginx’, которая будет запускать порты HTTP и HTTPS и монтировать локальный каталог ‘conf.d’ для конфигурации виртуального хоста, и ‘ssl’ для сертификатов ssl.
#Nginx Service nginx: image: nginx:alpine container_name: nginx restart: unless-stopped tty: true ports: - "80:80" - "443:443" volumes: - ./nginx/conf.d/:/etc/nginx/conf.d/ - ./nginx/ssl/:/etc/nginx/ssl/ networks: - mynet
И последнее, определите пользовательскую сеть «mynet» с драйвером моста и «registrydata» с локальным драйвером.
#Docker Networks networks: mynet: driver: bridge #Volumes volumes: registrydata: driver: local
Сохраните и закройте конфигурацию.
Ниже приведена полная конфигурация:
version: '3' services: #Registry registry: image: registry:2 restart: always ports: - "5000:5000" environment: REGISTRY_AUTH: htpasswd REGISTRY_AUTH_HTPASSWD_REALM: Registry-Realm REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data volumes: - registrydata:/data - ./auth:/auth networks: - mynet #Nginx Service nginx: image: nginx:alpine container_name: nginx restart: unless-stopped tty: true ports: - "80:80" - "443:443" volumes: - ./nginx/conf.d/:/etc/nginx/conf.d/ - ./nginx/ssl/:/etc/nginx/ssl/ networks: - mynet #Docker Networks networks: mynet: driver: bridge #Volumes volumes: registrydata: driver: local
– Настроить виртуальный хост Nginx
После создания скрипта docker-compose мы создадим виртуальный хост и дополнительную конфигурацию для службы nginx.
Перейдите в каталог ‘nginx/conf.d/’ и создайте новый файл виртуального хоста с именем ‘registry.conf’.
cd nginx/conf.d/
vim registry.conf
Вставьте в него содержимое:
upstream docker-registry { server registry:5000; } server { listen 80; server_name registry.hakase-labs.io; return 301 https://registry.hakase-labs.io$request_uri; } server { listen 443 ssl http2; server_name registry.hakase-labs.io; ssl_certificate /etc/nginx/ssl/fullchain.pem; ssl_certificate_key /etc/nginx/ssl/privkey.pem; # Log files for Debug error_log /var/log/nginx/error.log; access_log /var/log/nginx/access.log; location / { # 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; } proxy_pass http://docker-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; } }
Сохраните и закройте.
Затем создайте дополнительную конфигурацию для увеличения max_body_size в nginx.
Это позволит вам загружать образы докер с максимальным размером 2 ГБ.
vim additional.conf
Вставьте конфигурацию ниже.
client_max_body_size 2G;
Сохраните и закройте.
– Настройка SSL-сертификата и базовой аутентификации.
Скопируйте файлы сертификатов SSL вашего домена в каталог ‘ssl’.
cp /path/to/ssl/fullchain.pem ssl/
cp /path/to/ssl/privkey.pem ssl/
Теперь перейдите в каталог ‘auth’ и сгенерируйте новый файл паролей ‘registry.passwd’.
cd auth/
Сгенерируйте новый пароль для пользователя hakase.
htpasswd -Bc registry.passwd hakase
TYPE THE STRONG PASSWORD
Настройка среды для развертывания Private Docker Registry была завершена.
Ниже приведен скриншот файлов и каталогов нашей среды.
– Запустите Docker Registry
Запустите Реестр Docker, используя команду docker-compose ниже.
docker-compose up -d
После этого убедитесь, что служба реестра и nginx запущена и работает. Проверьте с помощью следующей команды.
docker-compose ps
netstat -plntu
И вам будет показано, что служба ‘Registry’ работает на порту ‘5000’, а служба ‘Nginx’ будет предоставлять порты HTTP и HTTPS, как показано ниже.
Шаг 4 – Тестирование
Прежде чем мы протестируем наш приватный реестр Docker, нам нужно добавить сертификат корневого центра сертификации в сам докер и в систему.
Если вы используете сертификат файла pem, экспортируйте его в файл .crt с помощью команды OpenSSL.
openssl x509 -in rootCA.pem -inform PEM -out rootCA.crt
Теперь создайте новый каталог для сертификата докера и скопируйте в него сертификат корневого центра сертификации.
mkdir -p /etc/docker/certs.d/registry.hakase-labs.io/
cp rootCA.crt /etc/docker/certs.d/registry.hakase-labs.io/
Затем создайте новый каталог «/usr/share/ca-certificate/extra» и скопируйте в него сертификат корневого центра сертификации.
mkdir -p /usr/share/ca-certificates/extra/
cp rootCA.crt /usr/share/ca-certificates/extra/
После этого переконфигурируйте пакет ca-Certificate и перезапустите сервис Docker.
dpkg-reconfigure ca-certificates
systemctl restart docker
– Загрузите образ Docker
Загрузите новый образ Docker с помощью следующей команды.
docker pull ubuntu:16.04
Когда она будет завершена, пометьте образ для частного реестра с помощью команды ниже.
docker image tag ubuntu:16.04 registry.hakase-labs.io/ubuntu16
Проверьте еще раз список образов Docker в системе, и вы получите новые изображения, как показано ниже.