Docker Hub - andyceo/documentation GitHub Wiki
-
выкачиваем образ:
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
Ссылки:
-
Запустим его простой командой:
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. -
Нужно на всех хост-системах, на которых запущен докер, прописать этот репозиторий как незащищенный, чтобы можно было делать pull/push своих образов
nano /etc/default/docker DOCKER_OPTS="--insecure-registry example.com:5000 --insecure-registry example.org:5000"
В данном примере, мы позволяем использовать два небезопасных реестра образов: example.com и example.org. Эти домены должны успешно резолвится по DNS, в противном случае надо использовать IP-адреса.
-
Перазапустить сервис докера:
service docker restart
Также, можно заморочиться с сертификатами (см. Insecure Registry)
-
Если вы хотите, чтобы в вашем приватном хабе работал поиск, нужно настроить Search Backend на нем. Подробнее см. на Search-engine options
Также, можно установить с помощью Ansible-роли andyceo.docker: Ansible Docker config.
Еше можно установить фронтэнд для своего реестра из образа konradkleine/docker-registry-frontend, с помощью Ansible-роли andyceo.docker: Ansible Docker config.
Ссылки:
- Docker Registry
- Insecure Registry
- Official Repository: registry
- Search-engine options
- Deploying a registry server
Допустим, у вас есть локально построенный образ foo:1.0
.
-
Сначала тегируем этот образ так, чтобы он указывал на приватный репозиторий:
sudo docker tag foo:1.0 example.com:5000/foo:1.0
-
Теперь мы можем запушить этот образ в приватный репозиторий:
sudo docker push example.com:5000/foo:1.0
-
Попробуем найти этот образ, напрямую обращаясь к 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"]}
-
Попробуем найти этот образ с помощью команды
docker search
(для этого вы прежде должны были настроить Search backend в реестре, см. Search-engine options):docker search example.com:5000/library
-
Теперь на каком-либо другом сервисе, можно выкачать данный образ из приватного репозитория:
sudo docker pull example.com:5000/foo:1.0
-
Удалить образ из репозитория по умолчанию нельзя, эта функция все еще в разработке (верно для registry v2.3.0). Но есть workaround, см. его в разделе Удаление образа из репозитория (workaround).
Сначала, удостоверьтесь, что в контейнере реестра лежит следующая переменная: REGISTRY_STORAGE_DELETE_ENABLED=true
. Далее:
-
Взять манифест образа из реестра
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"]
-
Удалим слои FS (
layerDigests
)delete v2/<repoName>/blobs/<layerDigests>
:curl -X DELETE http://example.com:5000/v2/ubuntu/blobs/sha256:a3ed95caeb02ffe68cdd9fd84406680ae93d633cb16422d00e8a7c22955b46d4
И так для каждого слоя, начиная с самого верхнего (последнего).
-
Удалим образ (
Docker-Content-Digest
)delete v2/<repoName>/manifests/<Docker-Content-Digest>
:curl -X DELETE http://example.com:5000/v2/ubuntu/manifests/sha256:212cc33ddd6d0dff93f2d1c38a26b605fb80e3c77a79c4813fb207aa4d1a7045
-
Проверим что образ удален, попытавшись загрузить его (
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
Для того, чтобы целиком очистить реестр, нужно сделать следующее:
-
Зайти в контейнер реестра:
sudo docker exec -ti registry bash
-
Зайти в контейнере в папку реестра:
cd /var/lib/registry/docker/registry/v2/
-
Удаляем папки
repositories
иblobs
:rm -rf repositories rm -rf blobs
-
Выходим из контейнера
-
Перезапустим контейнер реестра, чтобы сбросился кеш образов:
sudo docker restart registry
Реестр будет обнулен целиком, не будет содержать в себе ни одного образа. После этого, можно будет в реестр закачать нужные образы снова (с нуля). См. скрипт push2docker_registry.sh.
Если у вас есть кластер Docker Swarm, то можно поднять докер-репозиторий как сервис с репликацией 1, на какой-либо ноде, и опубликовать порт 5000. Тогда с любой ноды кластера можно будет работать с репозиторием по адресу localhost:5000, т.к. Swarm для сервиса на каждой ноде откроет порт 5000. Тогда здесь не нужны ни сертификаты, ни дополнительная настройка Docker Engine, чтобы он работал с недоверенными сертификатами и т.п. Все просто работает.
Ссылки:
- Deploy a registry server
- Configuring a registry
- Docker Registry with AWS & Let's Encrypt
- Docker Swarm with Private Registry for Micro-Services (Behind Corporate Proxy)
- Start docker registry with letsencrypt certificates (Linux Ubuntu)
- Hosting own docker registry with UI and tls
- composer (Official)
- satis
- Microsoft Azure CLI 2.0
- acme.sh
- lrzip