Как изменить реестр Docker по умолчанию с docker.io на мой личный реестр?

По умолчанию, если я выдаю команду:

sudo docker pull ruby:2.2.1

по умолчанию он будет извлекаться с официального сайта docker.io.

Pulling repository docker.io/library/ruby

Как я могу изменить его в свой личный реестр. Это означает, что если я выпущу

sudo docker pull ruby:2.2.1

он будет извлекать из моего личного реестра, что-то вроде:

Pulling repository my_private.registry:port/library/ruby

13 ответов

ОБНОВЛЕНИЕ: После вашего комментария в настоящее время невозможно изменить реестр по умолчанию, см. Эту проблему для получения дополнительной информации.

Вы должны быть в состоянии сделать это, заменив хост и порт своим собственным:

docker pull localhost:5000/registry-demo

Если сервер удаленный / имеет авторизацию, вам может потребоваться войти на сервер с помощью:

docker login https://<YOUR-DOMAIN>:8080

Затем работает:

docker pull <YOUR-DOMAIN>:8080/test-image

Существует вариант использования зеркала Docker Hub (например, Artifactory или другое), о котором я здесь не упоминал. Это один из наиболее вероятных случаев, когда необходимо изменить реестр по умолчанию.

К счастью, Docker (как минимум версия 19.03.3) позволяет установить зеркало (проверено в Docker CE). Я не знаю, будет ли это работать с дополнительными изображениями, отправленными на это зеркало, которых нет в Docker Hub, но я знаю, что вместо этого оно будет использовать зеркало. Документация Docker: https://docs.docker.com/registry/recipes/mirror/#configure-the-docker-daemon.

По сути, вам нужно добавить "registry-mirrors": [] к /etc/docker/daemon.jsonконфигурационный файл. Итак, если у вас есть зеркало, размещенное в https://my-docker-repo.my.company.com, твой /etc/docker/daemon.json должен содержать:

{
  "registry-mirrors": ["https://my-docker-repo-mirror.my.company.com"]
}

После этого перезапустите демон Docker. Теперь, если вы сделаете docker pull postgres:12, Docker должен получать образ с зеркала, а не напрямую из Docker Hub. Это намного лучше, чем добавлять ко всем изображениям my-docker-repo.my.company.com

Оказывается, это действительно возможно, но без использования подлинной версии Docker CE или EE.

Вы можете использовать форк докера Red Hat с флагом '--add-registry' или вы можете создать докер из исходного кода самостоятельно с помощью реестра /config.go, модифицированного для использования вашего собственного жестко запрограммированного пространства имен / индекса реестра по умолчанию.

Короткий ответ на этот вопрос - нет или, по крайней мере, не следует.

Да, существуют среды выполнения контейнеров, которые позволяют изменять пространство имен по умолчанию, в частности, из RedHat. Однако теперь RedHat сожалеет об этой функции и отговаривает клиентов от ее использования. Докер также отказался поддержать это.

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

Злоумышленник может использовать известные имена образов в реестрах, отличных от Docker Hub, в надежде, что пользователь может изменить свою конфигурацию по умолчанию и случайно запустить свой образ вместо образа из Hub. Было бы тривиально создать форк такого инструмента, как Jenkins, отправить изображение в другие реестры, но с некоторым кодом, который отправляет все учетные данные, загруженные в Jenkins, на сервер злоумышленника. В этом году мы даже видели, как это вызывает отчеты об уязвимостях безопасности для других менеджеров пакетов, таких как PyPI, NPM и RubyGems.

Вместо этого время выполнения контейнеров, таких как containerd, направлено на то, чтобы сделать все имена образов полностью определенными, удалив автоматическое расширение Docker Hub (инструменты поверх containerd, такие как Docker, все еще применяют расширение по умолчанию, поэтому я сомневаюсь, что это исчезнет в ближайшее время, если Когда-либо).

Docker позволяет вам определять зеркала реестра для Docker Hub, которые он будет запрашивать сначала перед запросом Hub, однако это предполагает, что все по-прежнему находится в том же пространстве имен, а зеркало является просто копией восходящих образов, а не другим пространством имен образов. TL;DR о том, как это настроить, приведен ниже в /etc/docker/daemon.json а потом systemctl reload docker:

      {
  "registry-mirrors": ["https://<my-docker-mirror-host>"]
}

Для большинства это не проблема (для меня эта проблема заключается в том, что движок докеров не имеет возможности зеркалировать реестры, не относящиеся к концентратору). Имя изображения определяется в файле конфигурации или сценарии, поэтому ввести его один раз в этом файле достаточно просто. А с помощью таких инструментов, как создание файлов и шаблоны Helm, реестр можно превратить в переменную, чтобы позволить организациям явно извлекать образы для развертывания из настраиваемого имени реестра.

Если вы используете дистрибутив fedora, вы можете изменить файл

/etc/containers/registries.conf

Добавление домена docker.io

Официальная позиция Docker изложена в выпуске №11815:

Проблема 11815: разрешено указывать реестры по умолчанию, используемые в команде pull

Разрешение:

Как указывалось ранее (#11815), это приведет к фрагментации пространства имен и очень сильно повредит сообществу, сделав файлы докеров не переносимыми.

[Сопровождающий] закроет это по этой причине.

У Red Hat была конкретная реализация, которая позволяла это (см. Anwser, но проект Docker upstream отказался от нее). Он полагался на--add-registry аргумент, который был установлен в /etc/containers/registries.conf на RHEL/CentOS 7.

Кажется, что это не будет поддерживаться из-за фрагментации, которую это создаст в сообществе (то есть два пользователя будут получать разные изображения ubuntu:latest). Вы просто должны добавить хост перед именем изображения. Смотрите этот вопрос GitHub, чтобы присоединиться к обсуждению.

(Обратите внимание, что это не намеренный комментарий, а просто очень краткое резюме обсуждения, которое можно использовать в упомянутом выпуске github.)

Я попытался добавить следующие параметры в /etc/docker/daemon.json. (Я использовал CentOS7)

"add-registry": ["192.168.100.100:5001"],
"block-registry": ["docker.io"],

после этого перезапустил демон докера. И он работает без docker.io. Я надеюсь, что это кому-то будет полезно.

Ранее это могло быть достигнуто с помощью DOCKER_OPTS в /etc/default/docker Конфигурационный файл, который работал в Ubuntu 14:04 и имел некоторые проблемы в Ubuntu 15:04. Не уверен, что это было исправлено.

Следующая строка должна идти в файл /etc/default/docker на хосте, который запускает демон докера. Пункты изменения для частного реестра установлены в вашей локальной сети. Примечание: вам потребуется перезапустить службу Docker, после чего вы внесете это изменение.

DOCKER_OPTS="--insecure-registry <priv registry hostname/ip>:<port>"

В Docker Business есть функция под названием «Управление доступом к реестру».

  • Войдите в свою учетную запись Docker Hub как владелец организации.
  • Выберите организацию, затем перейдите на вкладку «Настройки» на странице «Организации» и выберите «Доступ к реестру».
  • Включите «Управление доступом к реестру», чтобы начать устанавливать разрешения для вашего частного реестра.
  • Чтобы добавить свой реестр в список, выберите «Добавить» и введите данные своего реестра в соответствующие поля, затем выберите «Создать».
  • Убедитесь, что ваш реестр появился в вашем списке, и выберите «Сохранить и применить».
  • Вы можете убедиться, что ваши изменения сохранены на вкладке «Активность». Обратите внимание, что вы можете добавлять неограниченное количество реестров.

Не видел ответа для MacOS, поэтому хочу добавить сюда: 2 метода, как показано ниже:

Вариант 1 (через графический интерфейс Docker Desktop): Предпочтение -> Docker Engine -> Редактировать файл -> Применить и перезапустить

Вариант 2: напрямую отредактируйте файл ~ / .docker / daemon.json

Я добавляю исходный ответ, данный Гаем, который все еще актуален сегодня (скоро 2020 г.).

Переопределение реестра докеров по умолчанию, как если бы вы сделали с maven, на самом деле не лучшая практика.

Когда используешь maven, вы извлекаете артефакты из центрального репозитория Maven через систему управления локальным репозиторием, которая будет действовать как прокси. Эти артефакты представляют собой простые необработанные библиотеки (jar-файлы), и маловероятно, что вы будете отправлять jar-файлы с тем же именем.

С другой стороны, образы докеров являются полностью работоспособными, запускаемыми средами, и вполне разумно извлечь образ из Docker Hub, изменить его и отправить этот образ в локальную систему управления реестром с тем же именем, потому что это точно как указано в названии, только в контексте вашего предприятия. В этом случае единственным различием между двумя изображениями будет именно его путь!!

Поэтому необходимо установить следующее правило: префикс изображения указывает его происхождение; по умолчанию, если изображение не имеет префикса, оно извлекается из Docker Hub.

Не пробовал, но, возможно, перехватил процесс разрешения DNS, добавив строку в /etc/hosts за hub.docker.com или что-то подобное (docker.io?) может сработать?

Другие вопросы по тегам