Больше не нужно искать работу мечты — присоединяйтесь к команде Клауда

Настраиваем Docker на использование стороннего реестра

Александр Бархатов
Александр Бархатов
Технический писатель
27 июня 2024 г.
176
10 минут чтения
Средний рейтинг статьи: 5

При работе с системой контейнеризации Docker пользователи работают с образами — исполняемыми файлами, в которых присутствует все самое необходимое для запуска и работы вашего приложения, включая исходный код приложения, библиотеки и т.д. Готовые образы хранятся в специальных хранилищах, которые называются реестрами. Реестры могут быть как частными, так и общедоступными.

Самым известным публичным реестром является официальный реестр от компании Docker под названием Docker Hub. В Docker Hub можно найти много официальных образов, например, для Nginx, PostgreSQL, Alpine, Ubuntu, Node, MongoDB и множества других. Любой пользователь может зарегистрироваться на Docker Hub и хранить свои образы. Также каждому пользователю доступно создание трех частных (приватных) репозиториев и одного публичного. Docker Hub используется как реестр по умолчанию для Docker с целью загрузки необходимых образов.

30 мая 2024 года компания Docker заблокировала возможность использовать реестр Docker Hub для пользователей с российскими IP-адресами. Хотя 3 июня 2024 года блокировка была снята, в инструкции мы рассмотрим способы, как сохранить доступ до Docker-образов, чтобы в будущем не сталкиваться с такими проблемами. Также компания Timeweb Cloud оперативно подготовила инструкцию, в которой указано, как можно поменять стандартный реестр Docker Hub, используемый по умолчанию, на другой. 

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

Блокировка Docker Hub для пользователей из России

В период с 30 мая 2024 года по 3 июня 2024 при попытке выполнить команды docker pull/docker push для пользователей с российскими IP-адресами отображалась следующая ошибка:

Error response from daemon: pull access denied for nginx, repository does not exist or may require 'docker login': denied: 

403 Forbidden

Since Docker is a US company, we must comply with US export control regulations. In an effort to comply with these, we now block all IP addresses that are located in Cuba, Iran, North Korea, Republic of Crimea, Sudan, and Syria. If you are not in one of these cities, countries, or regions and are blocked, please reach out to https://hub.docker.com/support/contact/

Несмотря на то, что в перечисленном списке стран Россия отсутствует, получить доступ до Docker Hub, используя российский IP-адрес, было невозможно.

Использование сторонних реестров

Одним из самых простых способов является использование сторонних реестров. У многих крупных компаний, например, таких как Google, Amazon, Яндекс присутствуют свои собственные реестры для хранения образов Docker. Также свой реестр присутствует у Timeweb Cloud. В таблице ниже приведен список некоторых общедоступных реестров, которые можно использовать.

Адрес реестра

Компания-владелец

https://mirror.gcr.io

 

Google

https://public.ecr.aws

Amazon

https://dockerhub.timeweb.cloud

Timeweb Cloud

https://cr.yandex/mirror

Яндекс

https://dh-mirror.gitverse.ru

GitVerse (СберБанк)

https://dockerhub1.beget.com

Beget

https://noohub.ru

NooSoft

https://jockerhub.com

DpkgSoft

https://quay.io

Red Hat

https://registry.access.redhat.com

Red Hat

https://registry.redhat.io

 

Red Hat

Также на просторах сети интернет можно найти другие общедоступные реестры образов (например, из Китая).

Обратите внимание что использование сторонних реестров может нести в себе потенциальные риски безопасности!

Для того чтобы изменить стандартный реестр Docker Hub на сторонний, необходимо выполнить шаги, перечисленные ниже.

Настройка для Linux

1) При помощи любого текстового редактора открываем на редактирование файл daemon.json.

  • Если Docker установлен в обычном режиме (не rootless-версия), файл находится в директории /etc/docker. Если файл daemon.json отсутствует, эта же команда его создаст. 
nano /etc/docker/daemon.json
  • Если Docker установлен в режиме rootless, файл находится в директории /.config/docker, расположенной в домашней директории того пользователя, из-под которого производится запуск Docker. Если файл daemon.json отсутствует, эта команда его создаст. 
nano ~/.config/docker/daemon.json

Добавляем следующий параметр, где https://dockerhub.timeweb.cloud — это адрес реестра, который будет использоваться по умолчанию:

{ 
"registry-mirrors" : [ "https://dockerhub.timeweb.cloud" ]
}

Image13

Сохраняем изменения и выходим из файла.

2) Для того чтобы Docker мог использовать новый реестр, необходимо перезапустить демон docker при помощи команды:

systemctl reload docker

3) Теперь при попытке скачать образ при помощи команды docker pull, демон docker будет использовать не Docker Hub, а ранее заданный реестр, в нашем случае это реестр от Timeweb Cloud с адресом dockerhub.timeweb.cloud.

Также можно явно указать адрес добавленного ранее реестра, чтобы демон docker сразу скачивал образ из заданного реестра. Для этого перед именем образа необходимо указать адрес реестра. Например, скачаем образ alpine из реестра с адресом dockerhub.timeweb.cloud

docker pull dockerhub.timeweb.cloud/alpine

Image2

Если не указывать тег, то по умолчанию всегда будет скачиваться версия с тегом latest. Чтобы скачать необходимую версию, необходимо указать тег после имени образа. Например, скачаем образ с Nginx с тегом 1.25.2:

docker pull dockerhub.timeweb.cloud/nginx:1.25.2

Image6

Настройка для Windows (Docker Desktop)

1) При помощи любого текстового редактора открываем на редактирование файл daemon.json, который находится по пути:

C:\Users\<имя_пользователя>\.docker

Например:

C:\Users\abarkhatov\.docker

Image9

2) В открывшемся файле добавляем параметр registry-mirrors, в значении которого указываем адрес реестра, например:

{ "registry-mirrors" : [ "https://dockerhub.timeweb.cloud" ] }

Image19

Где https://dockerhub.timeweb.cloud — адрес используемого реестра.

Сохраняем изменения и выходим из файла. Чтобы изменения были применены, необходимо перезапустить Docker. Для этого на панели задач справа снизу ищем значок Docker, кликаем по нему правой кнопкой мыши и выбираем пункт «Restart»:

Image3

Также добавить реестр можно через графический интерфейс программы Docker Desktop. Для этого запускаем Docker Desktop и в меню слева выбираем раздел Docker Engine. В появившемся окне прописываем следующую конфигурацию:

{ "registry-mirrors" : [ "https://dockerhub.timeweb.cloud" ] }

Image11

Где https://dockerhub.timeweb.cloud — адрес используемого реестра.

Для того чтобы применить внесенные изменения, необходимо нажать на кнопку «Apply & restart». Текущая конфигурация будет сохранена, а Docker перезапущен:

Image14

3) После перезапуска Docker можно использовать новый реестр для скачивания образов. Теперь при попытке скачать образ при помощи команды docker pull демон docker будет использовать не Docker Hub, а ранее заданный реестр, в нашем случае это реестр от Timeweb Cloud с адресом dockerhub.timeweb.cloud.

Также можно явно указать адрес добавленного ранее реестра, чтобы демон docker сразу скачивал образ из заданного реестра. Для этого перед именем образа необходимо указать адрес реестра. Например, скачаем образ curl из реестра с адресом dockerhub.timeweb.cloud

docker pull dockerhub.timeweb.cloud/curlimages/curl

Image12

Если не указывать тег, то по умолчанию всегда будет скачиваться версия с тегом latest. Чтобы скачать нужную версию, необходимо указать тег после имени образа. Например, скачаем образ с node с тегом 21-alpine:

docker pull dockerhub.timeweb.cloud/node:21-alpine

Image7

Также стоит обратить внимание, что скачанные образы всегда будут иметь префикс в виде адреса репозитория, с которого были скачаны образы:

Image4

Использование Nexus в качестве реестра образов

Также организовать хранение образов можно, используя стороннее программное обеспечение, например Nexus. Процесс установки и настройки Nexus описан в отдельной статье

cloud

В Nexus присутствует специальный тип репозитория — proxy (прокси-репозиторий), суть которого заключается в том, что при выполнении команды docker pull, Nexus сначала обращается к удаленному репозиторию, например, к Docker Hub или любому другому, далее скачивает образ на клиентское устройство, параллельно сохраняя его в Nexus-репозитории, тем самым работая как кэширующий репозиторий для хранения Docker-образов. При последующем обращении, т.е. при выполнении команды docker pull, Nexus уже будет обращаться в свое собственное хранилище, а не в удаленный репозиторий при условии, что запрашиваемый образ уже присутствует в хранилище Nexus. Данный тип репозитория идеально подходит для тех случаев, когда внешний удаленный репозиторий недоступен, а скачать образ необходимо.

Для создания прокси-репозитория в Nexus необходимо выполнить следующие шаги:

1) Авторизуйтесь в веб-интерфейсе Nexus при помощи учетной записи администратора или обычной учетной записи у которой есть права на создание репозиториев.

2) После авторизации перейдите в режим «Server administration and configuration».

Image21

Далее на панели слева выберите раздел «Repositories».

Image5

И в открывшемся окне нажмите на кнопку «Create repository»:

Image17

В появившемся разделе выберите тип репозитория docker (proxy).

Image20

3) Необходимо заполнить следующие поля:

  • Name — задайте уникальное имя для репозитория.
  • Online — убедитесь, что напротив этого параметра стоит чекбокс. Если чекбокса нет, то репозиторий не сможет принимать входящие запросы, соответственно скачивать образы не получится.

Image15

По умолчанию в Nexus все репозитории для Docker идентифицируются по HTTP/HTTPS-портам, а не по их уникальным именам. Если ваш реестр Nexus находится за прокси-сервером (в качестве прокси сервера может выступать Nginx), то использовать порты вам не надо, т.к. в данном случае для аутентификации в репозитории и одновременно его адресом будет выступать доменное имя. Пример конфигурации Nginx для использования с Docker-репозиториями можно найти в официальной документации. Если же прокси-сервер у вас не используется, то вам необходимо задать уникальный (свободный) порт для HTTP или HTTPS. 

  • Allow anonymous docker pull — если проставлен чекбокс, то проходить аутентификацию (выполнять команду docker login) не надо. Если чекбокс не проставлен, то перед выполнением команды docker pull предварительно необходимо выполнить команду docker login:

 Image10

  • Remote storage — необходимо указать адрес до удаленного репозитория, который находится за прокси-сервером. Это может быть адрес реестра от Google, Amazon или любой другой. Можно использовать предложенный вариант, а именно адрес от реестра Docker Hub — https://registry-1.docker.io:

Image18 

  • Docker index — необходимо выбрать один из трех предложенных вариантов индексации для Docker-репозитория:

Image22

Остальные настройки можно оставить по умолчанию.

4) После того как репозиторий создан, необходимо залогиниться в созданный реестр на сервере при условии, что во время создания репозитория был проставлен чекбокс для аутентификации. Для аутентификации используется команда:

docker login <адрес_репозитория>

Также необходимо ввести логин и пароль от учетной записи:

docker login nexus-repo

Image16

Если же аутентификация не используется, то можно приступать к использованию прокси-репозитория. Для того чтобы скачать Docker-образ на сервер, необходимо выполнить команду docker pull, указав адрес реестра и, через символ / (слеш), имя и тег необходимого образа. 

Формат команды следующий:

docker pull <адрес_реестра_nexus>/имя_образа:тег

Например, скачаем образ python с тегом 3.8.19-alpine из реестра nexus-repo.com при помощи команды:

docker pull nexus-repo.com/python:3.8.19-alpine

Image1

Тег образа можно не указывать, в этом случае всегда будет скачиваться образ с тегом latest. Однако в целях безопасности не рекомендуется использовать тег latest в связи с тем, что образ с данным тегом может содержать различные ошибки в коде (баги), а также уязвимости, которые могут повлиять на ваше контейнеризированное приложение.

Далее возвращаемся в веб-интерфейс Nexus, переходим в раздел «Browse» (значок куба расположенный слева сверху), выбираем созданный репозиторий Docker и видим, что ранее запрашиваемый образ был сохранен в Docker-репозитории с типом proxy:

Image8

Как можно увидеть на скриншоте выше, ранее скачанный образ python с тегом 3.8.19-alpine был сохранен в Nexus. 

Разверните Nexus на своем облачном сервере

Заключение

В данной статье мы рассмотрели различные способы для скачивания и хранения Docker-образов. Использование стороннего реестра может быть полезным, когда один из используемых реестров недоступен по каким-либо причинам. Также если вы не доверяете сторонним реестрам, то вы всегда сможете поднять свой собственный реестр который может быть как общедоступным, так и частным.

27 июня 2024 г.
176
10 минут чтения
Средний рейтинг статьи: 5
Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
Комментарии 0