Как стать автором
Обновить

Комментарии 22

Для Kubernetes, еще как вариант, можно использовать Kyverno для настройки

macOS:
~/.docker/daemon.json

Docker Desktop:

Settings -> Docker Engine

Есть еще ряд зеркал: https://huecker.io, https://yandex.cr/mirror/...
Но, остался еще один вопрос: как производить поиск образов, как это было на сайте hub.docker.com?

https://gallery.ecr.aws/ довольно таки удобен и пока не закрыт

Да вас наверное будет удивительно, но зачастую данный файлик не является пустым, > перезапишет файл полностью, разумней было бы добавить эти записи через jq

Данный файлик обновляется не перетирается.

current_mirrors=$(grep -oP '(?<="registry-mirrors": [)[^]]*' /etc/docker/daemon.json | tr -d ' \n' | tr ',' '\n' | tr -d '"')

Фуфуфу. А если у меня вот так ?

"registry-mirrors" [
"https://mirror-1.tld",
"https://mirror-2.tld"
]

И таки скрипт все перетирает кроме registry-mirrors

А push через зеркало допустим?

Это немного про другое. Через push накатываются обновления кода. Т.е. вы просто загрузили код проекта, и больше ничего делать не нужно. Если вы развертываете с использованием Dockerfile, система просто сама правильно сходит на Docker Hub и загрузит что нужно

Поясните, пожалуйста, почему другое? У меня сейчас пулится через зеркало прекрасно, но тот же частный закрытый репозиторий не пушится. Говорит 403 и всё тут. Подскажите, как починить, буду очень признателен

поддерживаю, пуш не работает с зеркалом, 403 lolhello we saw that you are from Mordor, fuck you and not the docker

Плейбук для Ansible:

Код
---
- name: Install Docker
  hosts: all
  become: true
  vars_files:
    - '{{ inventory_dir }}/vars/vars.yaml'
  vars:
    docker_config_file: "/etc/docker/daemon.json"
    docker_features:
      containerd-snapshotter: true
    docker_mirrors_ru:
      - "https://dockerhub.timeweb.cloud"
      - "https://mirror.gcr.io"
      - "https://daocloud.io"
      - "https://c.163.com"
      - "https://registry.docker-cn.com"
    
  tasks:
    - name: Get the public IP of the host
      command: curl -s ifconfig.me
      register: public_ip
      changed_when: false

    - name: Query IPInfo for geolocation information
      uri:
        url: "https://ipinfo.io/{{ public_ip.stdout }}/json"
        method: GET
        return_content: yes
      register: ipinfo_response

    - name: Parse the country from IPInfo response
      set_fact:
        country: "{{ ipinfo_response.json.country }}"

    - name: Debug country information
      debug:
        msg: "The country for IP {{ public_ip.stdout }} is {{ country }}"

    - name: Ensure Docker configuration file exists
      file:
        path: "{{ docker_config_file }}"
        state: touch
        mode: '0644'
      when: country == 'RU'

    - name: Read existing Docker configuration
      slurp:
        path: "{{ docker_config_file }}"
      register: docker_config_file_content
      when: country == 'RU'

    - name: Parse existing Docker configuration
      set_fact:
        docker_config: "{{ docker_config_file_content.content | b64decode | from_json | default({}) }}"
      when: country == 'RU' and docker_config_file_content.content | b64decode | length > 0

    - name: Use default Docker configuration
      set_fact:
        docker_config: {}
      when: country == 'RU' and not (docker_config_file_content.content | b64decode | length > 0)

    - name: Set Docker Hub mirrors
      set_fact:
        docker_config: "{{ docker_config | combine({'registry-mirrors': docker_mirrors_ru}) }}"
      when: country == 'RU'

    - name: Set Docker features
      set_fact:
        docker_config: "{{ docker_config | combine({'features': docker_features}) }}"
      when: country == 'RU'

    - name: Write updated Docker configuration
      copy:
        content: "{{ docker_config | to_nice_json }}"
        dest: "{{ docker_config_file }}"
        mode: '0644'
        backup: yes
      when: country == 'RU'

    - name: Restart Docker
      service:
        name: docker
        state: restarted
      when: country == 'RU'

Работает для установленного Docker в режиме пользователя

На WSL файл находится по пути C:/Users/<username>/.docker/daemon.json

Для containerd (в т.ч. если он используется как CRI для кубера):

/etc/containerd/config.toml

version = 2
[plugins]
[plugins."io.containerd.grpc.v1.cri"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://mirror.gcr.io"]

возможно что то не так делаю, но все равно пытается через registry-1.docker.io

ctr: failed to resolve reference "docker.io/calico/node:v3.26.1": unexpected status from HEAD request to https://registry-1.docker.io/v2/calico/node/manifests/v3.26.1: 403 Forbidden

ctr не использует CRI, так что вам нужно использовать hosts.toml

/etc/containerd/certs.d/docker.io/hosts.toml
server = "https://registry-1.docker.io"

[host."https://mirror.gcr.io"]
  capabilities = ["pull", "resolve"]

проверьте что в /etc/containerd/config.toml есть

/etc/containerd/config.toml
  [plugins."io.containerd.grpc.v1.cri".registry]
      config_path = "/etc/containerd/certs.d"

При указании зеркал в js демон докера перестает стартовать. Возвращаю предыдущую версию тут же стартует.

Пробовал и одно зеркало и как в статье - несколько. Результат всегда один - "exit-code" с комментарием что докер стартует слишком часто.

{ "registry-mirrors" : [ "https://mirror.gcr.io", "https://dockerhub.timeweb.cloud" ] }

В статье представлена лишь часть конфига. А не готовое решение.

У меня примерно так было, когда я яндексовское зеркало пытался подставить. Оно ругалось так: invalid mirror: path, query, or fragment at end of the URI "https://cr.yandex/mirror"

Т.е., видимо, должен быть ТОЛЬКО домен, без всяких путей (как /mirror у яндекса) и параметров.

ЗЫ. версия докера 24.0.5

Зарегистрируйтесь на Хабре, чтобы оставить комментарий