Как настроить частный реестр Docker в Rocky Linux 8
На этой странице
- Предпосылки
- Шаг 1. Настройка брандмауэра
- Шаг 2. Установите Docker и Docker Compose
- Шаг 3. Настройка реестра Docker
- Создание каталогов пользователей
- Создание корзины Amazon S3
- Создать файл Docker Compose
- Настройка аутентификации
- Скопируйте файл 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 при появлении запроса.
Давайте пройдемся по тому, что мы настроили в нашем файле компоновки.
<старт>
- Первый шаг — получить последний образ версии 2 реестра Docker из хаба. Мы не используем последний тег, потому что это может вызвать проблемы в случае обновления основной версии. Установка его на 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, если вы включили шифрование 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.
- Реестр Docker взаимодействует через порт 5000, который мы предоставили на нашем сервере докеру.
- Сопоставление
./auth:/etc/nginx/conf.d
гарантирует, что все настройки Nginxs доступны в контейнере. -
./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 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 в качестве хранилища. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.