Skip to content

Docker Hub

andyceo edited this page Oct 13, 2023 · 4 revisions

Работаем с Docker Hub

  • выкачиваем образ:

      sudo docker pull ubuntu:14.04
    

    Выкачивать можно, будучи анонимом.

  • регистрируемся/заходим на Docker Hub:

      sudo docker login
    

    Это нужно для того, чтобы получить имя пользователя, из-под которого затем будем создавать образы и закачивать их в хаб. Допустим, мы зарегистрировались как andyceo.

    Также можно залогиниться одной строкой:

      sudo docker login -u "myusername" -p "mypassword" docker.io
    
  • создаем свой образ:

      sudo docker build andyceo/example:1.0
    
  • закачиваем образ в хаб (нужно быть залогиненным на Docker Hub, см. docker login):

      sudo docker push andyceo/example:1.0
    

    Если пытаться запушить образ, не будучи залогиненным в Docker Hub, будет выдавать ошибку:

      denied: requested access to the resource is denied
    

Ссылки:

Поднимаем свой локальный Docker Hub

  1. Запустим его простой командой:

     sudo docker run -d -p 5000:5000 -e REGISTRY_STORAGE_DELETE_ENABLED=true --restart always --name registry registry:2.3.1
    

    Опция REGISTRY_STORAGE_DELETE_ENABLED=true нужна для того, чтобы можно было удалять размещенные в репозитории образы. Если эта переменная не передана, то удалять образы будет нельзя. О том, как удалять образы, получить из список и т.п., см. в разделе Работаем с локальным Docker Hub.

  2. Нужно на всех хост-системах, на которых запущен докер, прописать этот репозиторий как незащищенный, чтобы можно было делать pull/push своих образов

     nano /etc/default/docker
    
     DOCKER_OPTS="--insecure-registry example.com:5000 --insecure-registry example.org:5000"
    

    В данном примере, мы позволяем использовать два небезопасных реестра образов: example.com и example.org. Эти домены должны успешно резолвится по DNS, в противном случае надо использовать IP-адреса.

  3. Перазапустить сервис докера:

     service docker restart
    

    Также, можно заморочиться с сертификатами (см. Insecure Registry)

  4. Если вы хотите, чтобы в вашем приватном хабе работал поиск, нужно настроить Search Backend на нем. Подробнее см. на Search-engine options

Также, можно установить с помощью Ansible-роли andyceo.docker: Ansible Docker config.

Еше можно установить фронтэнд для своего реестра из образа konradkleine/docker-registry-frontend, с помощью Ansible-роли andyceo.docker: Ansible Docker config.

Ссылки:

Работаем с локальным Docker Hub

Допустим, у вас есть локально построенный образ foo:1.0.

  1. Сначала тегируем этот образ так, чтобы он указывал на приватный репозиторий:

     sudo docker tag foo:1.0 example.com:5000/foo:1.0
    
  2. Теперь мы можем запушить этот образ в приватный репозиторий:

     sudo docker push example.com:5000/foo:1.0
    
  3. Попробуем найти этот образ, напрямую обращаясь к API приватного репозитория:

     # выведет список образов
     curl -X GET http://example.com:5000/v2/_catalog
     > {"repositories":["redis","ubuntu"]}
     
     # выведет список тегов для образа ubuntu
     curl -X GET http://example.com:5000/v2/ubuntu/tags/list
     > {"name":"ubuntu","tags":["14.04"]}
    
  4. Попробуем найти этот образ с помощью команды docker search (для этого вы прежде должны были настроить Search backend в реестре, см. Search-engine options):

     docker search example.com:5000/library
    
  5. Теперь на каком-либо другом сервисе, можно выкачать данный образ из приватного репозитория:

     sudo docker pull example.com:5000/foo:1.0
    
  6. Удалить образ из репозитория по умолчанию нельзя, эта функция все еще в разработке (верно для registry v2.3.0). Но есть workaround, см. его в разделе Удаление образа из репозитория (workaround).

Удаление образа из репозитория (workaround)

Сначала, удостоверьтесь, что в контейнере реестра лежит следующая переменная: REGISTRY_STORAGE_DELETE_ENABLED=true. Далее:

  1. Взять манифест образа из реестра get v2/<repoName>/manifests/<tagName>:

     curl -i -X GET http://example.com:5000/v2/ubuntu/manifests/1.0
    

    Docker-Content-Digest находится в одноименном HTTP заголовке: response.Header["Docker-Content-Digest"].

    layerDigests находится в ответе: response.body["fsLayers"]["blobSum"]

  2. Удалим слои FS (layerDigests) delete v2/<repoName>/blobs/<layerDigests>:

     curl -X DELETE http://example.com:5000/v2/ubuntu/blobs/sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
    

    И так для каждого слоя, начиная с самого верхнего (последнего).

  3. Удалим образ (Docker-Content-Digest) delete v2/<repoName>/manifests/<Docker-Content-Digest>:

     curl -X DELETE http://example.com:5000/v2/ubuntu/manifests/sha256:212cc33ddd6d0dff93f2d1c38a26b605fb80e3c77a79c4813fb207aa4d1a7045
    
  4. Проверим что образ удален, попытавшись загрузить его (pull). Ответ от сервера будет таким: invalid character '<' looking for beginning of value

Источник: Delete images (repository + data) from registry

Для работы с реестром с помощью этого API, можете попробовать этот скрипт: docker-registry-manager.sh

Для того, чтобы физически удалить ненужные образы, нужно периодически на хост-машине запускать сборщик мусора (это не делается автоматически):

    sudo docker exec registry /bin/registry garbage-collect /etc/docker/registry/config.yml

Очистка всего реестра

Для того, чтобы целиком очистить реестр, нужно сделать следующее:

  1. Зайти в контейнер реестра:

     sudo docker exec -ti registry bash
    
  2. Зайти в контейнере в папку реестра:

     cd /var/lib/registry/docker/registry/v2/
    
  3. Удаляем папки repositories и blobs:

     rm -rf repositories
     rm -rf blobs
    
  4. Выходим из контейнера

  5. Перезапустим контейнер реестра, чтобы сбросился кеш образов:

     sudo docker restart registry
    

Реестр будет обнулен целиком, не будет содержать в себе ни одного образа. После этого, можно будет в реестр закачать нужные образы снова (с нуля). См. скрипт push2docker_registry.sh.

Полезные ссылки по поднятию своего защищенного докер-репозитория

Если у вас есть кластер Docker Swarm, то можно поднять докер-репозиторий как сервис с репликацией 1, на какой-либо ноде, и опубликовать порт 5000. Тогда с любой ноды кластера можно будет работать с репозиторием по адресу localhost:5000, т.к. Swarm для сервиса на каждой ноде откроет порт 5000. Тогда здесь не нужны ни сертификаты, ни дополнительная настройка Docker Engine, чтобы он работал с недоверенными сертификатами и т.п. Все просто работает.

Ссылки:

Полезные утилиты на Docker Hub

Sidebar is under construction

Clone this wiki locally