Yandex Cloud
Поиск
Связаться с намиПодключиться
  • Документация
  • Блог
  • Все сервисы
  • Статус работы сервисов
    • Популярные
    • Инфраструктура и сеть
    • Платформа данных
    • Контейнеры
    • Инструменты разработчика
    • Бессерверные вычисления
    • Безопасность
    • Мониторинг и управление ресурсами
    • Машинное обучение
    • Бизнес-инструменты
  • Все решения
    • По отраслям
    • По типу задач
    • Экономика платформы
    • Безопасность
    • Техническая поддержка
    • Каталог партнёров
    • Обучение и сертификация
    • Облако для стартапов
    • Облако для крупного бизнеса
    • Центр технологий для общества
    • Облако для интеграторов
    • Поддержка IT-бизнеса
    • Облако для фрилансеров
    • Обучение и сертификация
    • Блог
    • Документация
    • Контент-программа
    • Мероприятия и вебинары
    • Контакты, чаты и сообщества
    • Идеи
    • Истории успеха
    • Тарифы Yandex Cloud
    • Промоакции и free tier
    • Правила тарификации
  • Документация
  • Блог
Проект Яндекса
© 2025 ООО «Яндекс.Облако»
Все решения

В этой статье:

  • Описание проблемы
  • Решение
  • DaemonSet для Managed Service for Kubernetes

Workaround для загрузки образов с Docker Hub

Статья создана
Yandex Cloud
Обновлена 16 августа 2024 г.
  • Описание проблемы
  • Решение
  • DaemonSet для Managed Service for Kubernetes

Описание проблемыОписание проблемы

При попытке загрузить образ командой docker pull отображается сообщение об ошибке:

docker: Error response from daemon: 
error parsing HTTP 403 response body: invalid character '<' 
looking for beginning of value: 
"<html><body><h1>403 Forbidden</h1>\nSince 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/\n</body></html>\n".
See 'docker run --help'.

РешениеРешение

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

Добавить зеркала в конфигурацию Docker
GitLab Dependency proxy
Публичное зеркало Container Registry
Приватный реестр Container Registry

Вы можете добавить в конфигурацию Docker альтернативные реестры Docker-образов.
Для этого откройте файл с конфигурацией Docker и укажите в нем список URL-адресов (зеркал внутри блока registry-mirrors) через запятую, например:

"registry-mirrors": ["https://mirror.gcr.io", "https://registry.docker-cn.com", "https://c.163.com/"] 

Путь к конфигурационному файлу Docker зависит от используемой на хосте операционной системы и наличия прав суперпользователя:

Операционная система

Путь к файлу конфиуграции

Linux (с правами root)

/etc/docker/daemon.json

Linux (без прав root)

~/.config/docker/daemon.json

Windows

%ProgramData%\docker\config\daemon.json

Внимание

Использование сторонних зеркал может быть сопряжено с рисками атак на цепочки поставок. Владелец зеркала может контролировать содержимое популярных образов и подменять образы на другие по своему усмотрению.

Yandex Cloud не несет ответственность за содержимое внешних зеркал.

Вы также можете воспользоваться Dependency proxy, предоставляемым сервисом GitLab. Для этого понадобится сначала создать новую группу, затем, внутри это группы выпустить новый ключ API с правами read_registry.

Чтобы после этого скачать нужный вам образ утилитой Docker, воспользуйтесь командой следующего вида:

docker pull gitlab.com/<GROUP_NAME>/dependency_proxy/containers/hello-world:latest

Вы можете скачать большую часть популярных Docker-образов, используя наше зеркало, работающее внутри Yandex Cloud.

Для этого используйте команду следующего вида:

docker pull cr.yandex/mirror/hello-world
  1. Используйте команду из способа выше для скачивания Docker-образа на вашу локальную машину.
  2. Загрузите полученный Docker-образ в приватный реестр Yandex Container Registry по этой инструкции.
    Не забудьте заменить в вашей CI/CD-cистеме ссылки для скачивания Docker-образов на новые.

Важно

В ближайшее время будет доступен DaemonSet для Managed Service for Kubernetes, перенаправляющий запросы в реестр dockerhub.com на другое зеркало.

О готовности DaemonSet мы сообщим в этом руководстве дополнительно.

DaemonSet для Managed Service for KubernetesDaemonSet для Managed Service for Kubernetes

Наша команда поддержки подготовила манифест объекта DaemonSet для кластеров Kubernetes. Этот DaemonSet создает внутри кластера привилегированный под, который обновляет конфигурацию containerd таким образом, чтобы запросы к реестру hub.docker.io перенаправлялись на cr.yandex/mirror.

Текст манифеста следует скопировать в файл с расширением YAML и применить к кластеру с помощью команды kubectl apply -f filename.yaml:


# Создаем Namespace
---
apiVersion: v1
kind: Namespace
metadata:
  name: docker-mirror

# Создаем объект ConfigMap конфига config.toml для containerd
# В секции [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
# определяем зеркала. Список endpoint можно пополнять
---
apiVersion: v1
data:
  config.toml: |
    oom_score = -999
    version = 2

    [debug]
      level = "info"

    [plugins]
      [plugins."io.containerd.grpc.v1.cri".cni]
          bin_dir = "/home/kubernetes/cni/bin"
          conf_dir = "/etc/cni/net.d"

      [plugins."io.containerd.runtime.v1.linux"]
          runtime = "/home/kubernetes/bin/runc"
          shim = "/home/kubernetes/bin/containerd-shim"

      [plugins."io.containerd.grpc.v1.cri"]
          stream_server_address = "127.0.0.1"
          enable_tls_streaming = false
          sandbox_image = "cr.yandex/crpsjg1coh47p81vh2lc/pause:3.9"
          [plugins."io.containerd.grpc.v1.cri".containerd]
              snapshotter = "overlayfs"

      [plugins."io.containerd.grpc.v1.cri".registry]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
          [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
            endpoint = ["https://cr.yandex/v2/mirror/io/docker","https://mirror.gcr.io"]
kind: ConfigMap
metadata:
  name: configtoml
  namespace: docker-mirror

# Ниже – манифест DaemonSet для запуска привилегированных подов, каждый из которых копирует config.toml
# В etc/containerd/config.toml на каждой и однократно перезапускает containerd.
# Добавили секцию, чтобы DaemonSet смог запускаться на нодах с taint. 
---
apiVersion: "apps/v1"
kind: DaemonSet
metadata:
  name: docker-mirror
  namespace: docker-mirror
  labels:
    app: docker-mirror
    version: 1v
spec:
  selector:
    matchLabels:
      app: docker-mirror
  template:
    metadata:
      labels:
        app: docker-mirror
    spec:
      schedulerName: default-scheduler
      priorityClassName: system-node-critical
      hostPID: true
      hostIPC: true
      containers:
      - name: config-updater
        image: cr.yandex/yc/mk8s-openssl:stable
        command:
          - sh
          - -c
          - |
             cp /tmp/config.toml /host/etc/containerd/config.toml &&
             ps -x -o pid= -o comm= | awk '$2 ~ "^(containerd|dockerd)$" { print $1 }' | xargs kill
             sleep infinity
        imagePullPolicy: IfNotPresent
        securityContext:
          privileged: true
        resources:
          limits:
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 200Mi
        volumeMounts:
        - name: containerd-config
          mountPath: /host/etc/containerd
        - name: config
          mountPath: /tmp
      volumes:
      - name: containerd-config
        hostPath:
          path: /etc/containerd
      - name: config
        configMap:
          name: configtoml

Была ли статья полезна?

Проект Яндекса
© 2025 ООО «Яндекс.Облако»