При работе с системой контейнеризации 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, используемый по умолчанию, на другой.
В данной статье мы рассмотрим практические способы, как можно изменить стандартный реестр на любой другой.
В период с 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. В таблице ниже приведен список некоторых общедоступных реестров, которые можно использовать.
Адрес реестра |
Компания-владелец |
|
|
Amazon |
|
Timeweb Cloud |
|
Яндекс |
|
GitVerse (СберБанк) |
|
Beget |
|
NooSoft |
|
DpkgSoft |
|
Red Hat |
|
Red Hat |
|
|
Red Hat |
Также на просторах сети интернет можно найти другие общедоступные реестры образов (например, из Китая).
Обратите внимание что использование сторонних реестров может нести в себе потенциальные риски безопасности!
Для того чтобы изменить стандартный реестр Docker Hub на сторонний, необходимо выполнить шаги, перечисленные ниже.
1) При помощи любого текстового редактора открываем на редактирование файл daemon.json
.
/etc/docker
. Если файл daemon.json
отсутствует, эта же команда его создаст. nano /etc/docker/daemon.json
/.config/docker
, расположенной в домашней директории того пользователя, из-под которого производится запуск Docker. Если файл daemon.json
отсутствует, эта команда его создаст. nano ~/.config/docker/daemon.json
Добавляем следующий параметр, где https://dockerhub.timeweb.cloud
— это адрес реестра, который будет использоваться по умолчанию:
{
"registry-mirrors" : [ "https://dockerhub.timeweb.cloud" ]
}
Сохраняем изменения и выходим из файла.
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
Если не указывать тег, то по умолчанию всегда будет скачиваться версия с тегом latest
. Чтобы скачать необходимую версию, необходимо указать тег после имени образа. Например, скачаем образ с Nginx с тегом 1.25.2
:
docker pull dockerhub.timeweb.cloud/nginx:1.25.2
1) При помощи любого текстового редактора открываем на редактирование файл daemon.json
, который находится по пути:
C:\Users\<имя_пользователя>\.docker
Например:
C:\Users\abarkhatov\.docker
2) В открывшемся файле добавляем параметр registry-mirrors
, в значении которого указываем адрес реестра, например:
{ "registry-mirrors" : [ "https://dockerhub.timeweb.cloud" ] }
Где https://dockerhub.timeweb.cloud
— адрес используемого реестра.
Сохраняем изменения и выходим из файла. Чтобы изменения были применены, необходимо перезапустить Docker. Для этого на панели задач справа снизу ищем значок Docker, кликаем по нему правой кнопкой мыши и выбираем пункт «Restart»:
Также добавить реестр можно через графический интерфейс программы Docker Desktop. Для этого запускаем Docker Desktop и в меню слева выбираем раздел Docker Engine. В появившемся окне прописываем следующую конфигурацию:
{ "registry-mirrors" : [ "https://dockerhub.timeweb.cloud" ] }
Где https://dockerhub.timeweb.cloud
— адрес используемого реестра.
Для того чтобы применить внесенные изменения, необходимо нажать на кнопку «Apply & restart». Текущая конфигурация будет сохранена, а Docker перезапущен:
3) После перезапуска Docker можно использовать новый реестр для скачивания образов. Теперь при попытке скачать образ при помощи команды docker pull
демон docker
будет использовать не Docker Hub, а ранее заданный реестр, в нашем случае это реестр от Timeweb Cloud с адресом dockerhub.timeweb.cloud
.
Также можно явно указать адрес добавленного ранее реестра, чтобы демон docker
сразу скачивал образ из заданного реестра. Для этого перед именем образа необходимо указать адрес реестра. Например, скачаем образ curl
из реестра с адресом dockerhub.timeweb.cloud
:
docker pull dockerhub.timeweb.cloud/curlimages/curl
Если не указывать тег, то по умолчанию всегда будет скачиваться версия с тегом latest
. Чтобы скачать нужную версию, необходимо указать тег после имени образа. Например, скачаем образ с node
с тегом 21-alpine
:
docker pull dockerhub.timeweb.cloud/node:21-alpine
Также стоит обратить внимание, что скачанные образы всегда будут иметь префикс в виде адреса репозитория, с которого были скачаны образы:
Также организовать хранение образов можно, используя стороннее программное обеспечение, например Nexus. Процесс установки и настройки Nexus описан в отдельной статье.
cloud
В Nexus присутствует специальный тип репозитория — proxy (прокси-репозиторий), суть которого заключается в том, что при выполнении команды docker pull
, Nexus сначала обращается к удаленному репозиторию, например, к Docker Hub или любому другому, далее скачивает образ на клиентское устройство, параллельно сохраняя его в Nexus-репозитории, тем самым работая как кэширующий репозиторий для хранения Docker-образов. При последующем обращении, т.е. при выполнении команды docker pull, Nexus уже будет обращаться в свое собственное хранилище, а не в удаленный репозиторий при условии, что запрашиваемый образ уже присутствует в хранилище Nexus. Данный тип репозитория идеально подходит для тех случаев, когда внешний удаленный репозиторий недоступен, а скачать образ необходимо.
Для создания прокси-репозитория в Nexus необходимо выполнить следующие шаги:
1) Авторизуйтесь в веб-интерфейсе Nexus при помощи учетной записи администратора или обычной учетной записи у которой есть права на создание репозиториев.
2) После авторизации перейдите в режим «Server administration and configuration».
Далее на панели слева выберите раздел «Repositories».
И в открывшемся окне нажмите на кнопку «Create repository»:
В появившемся разделе выберите тип репозитория docker (proxy)
.
3) Необходимо заполнить следующие поля:
По умолчанию в Nexus все репозитории для Docker идентифицируются по HTTP/HTTPS-портам, а не по их уникальным именам. Если ваш реестр Nexus находится за прокси-сервером (в качестве прокси сервера может выступать Nginx), то использовать порты вам не надо, т.к. в данном случае для аутентификации в репозитории и одновременно его адресом будет выступать доменное имя. Пример конфигурации Nginx для использования с Docker-репозиториями можно найти в официальной документации. Если же прокси-сервер у вас не используется, то вам необходимо задать уникальный (свободный) порт для HTTP или HTTPS.
docker login
) не надо. Если чекбокс не проставлен, то перед выполнением команды docker pull
предварительно необходимо выполнить команду docker login
:
https://registry-1.docker.io
:
Остальные настройки можно оставить по умолчанию.
4) После того как репозиторий создан, необходимо залогиниться в созданный реестр на сервере при условии, что во время создания репозитория был проставлен чекбокс для аутентификации. Для аутентификации используется команда:
docker login <адрес_репозитория>
Также необходимо ввести логин и пароль от учетной записи:
docker login nexus-repo
Если же аутентификация не используется, то можно приступать к использованию прокси-репозитория. Для того чтобы скачать Docker-образ на сервер, необходимо выполнить команду docker pull
, указав адрес реестра и, через символ /
(слеш), имя и тег необходимого образа.
Формат команды следующий:
docker pull <адрес_реестра_nexus>/имя_образа:тег
Например, скачаем образ python
с тегом 3.8.19-alpine
из реестра nexus-repo.com
при помощи команды:
docker pull nexus-repo.com/python:3.8.19-alpine
Тег образа можно не указывать, в этом случае всегда будет скачиваться образ с тегом latest
. Однако в целях безопасности не рекомендуется использовать тег latest
в связи с тем, что образ с данным тегом может содержать различные ошибки в коде (баги), а также уязвимости, которые могут повлиять на ваше контейнеризированное приложение.
Далее возвращаемся в веб-интерфейс Nexus, переходим в раздел «Browse» (значок куба расположенный слева сверху), выбираем созданный репозиторий Docker и видим, что ранее запрашиваемый образ был сохранен в Docker-репозитории с типом proxy
:
Как можно увидеть на скриншоте выше, ранее скачанный образ python
с тегом 3.8.19-alpine
был сохранен в Nexus.
Разверните Nexus на своем облачном сервере
В данной статье мы рассмотрели различные способы для скачивания и хранения Docker-образов. Использование стороннего реестра может быть полезным, когда один из используемых реестров недоступен по каким-либо причинам. Также если вы не доверяете сторонним реестрам, то вы всегда сможете поднять свой собственный реестр который может быть как общедоступным, так и частным.