Реестр Docker (Docker Registry) - это служба для хранения, управления и распространения Docker-образов
Реестр может быть:
Реестр разбит на репозитории - один репозиторий хранит образы с одним конкретным именем разных версий. Сам реестр представляет собой базу данных вида NoSQL, к которой другие участники сети имеют доступ по протоколу HTTP(S) через порт 5000
Самый простой способ запустить приватный реестр - это запустить соответствующий образ, который содержит логику реестра:
docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v /opt/registry/data:/var/lib/registry \
registry:3
Образ реестра называется registry:3 и доступен в реестре Docker Hub. Здесь было сделано монтирование папки /opt/registry/data на хосте к папке /var/lib/registry контейнера, чтобы образы хранились в файловой системе реальной машины, а не контейнера. Аргумент --restart=always говорит, что демон containerd должен перезапускать контейнер, если его выполнение нештатно прекратилось
Чтобы загрузить образ из реестра на локальную машину, можно воспользоваться командой docker pull:
docker pull адрес-реестра/имя-образа:тег-версии
Вместо тега версии можно указать latest - тогда загрузиться образ последней версии (в лексикографическом порядке)
Изначально запущенный первый раз реестр пуст. Для того, чтобы его заполнить нужными образами, нужно присвоить образу тег, который содержит адрес машины с реестром:
docker tag имя-образа:тег-версии адрес-реестра/имя-образа:тег-версии
А далее можно воспользоваться командой docker push:
docker push адрес-реестра/имя-образа:тег-версии
Без указания адреса (то есть docker push my-app:1.0) утилита загрузит образ в публичный реестр Docker Hub
По умолчанию, общение с реестром происходит по протоколу HTTPS, то есть реестр должен иметь действующий сертификат подлинности, чтобы избежать атаки “человек посередине” (man-in-the-middle attack, MITM). Сертификат должен выдать центр сертификации, но, если такой возможности нет, можно:
Внести адрес реестра в список доверенных на локальной машине. Это полезно в локальных сетях, где атаки “человек посередине” неприменимы, а сервер с реестром является подлинным - тогда общение будет происходить по протоколу HTTP. Для этого в конфигурацию /etc/docker/daemon.json нужно в список "insecure-registries" добавить нужную подсеть, например:
{
"insecure-registries": [
...,
"my-custom-registry.io",
"10.0.2.183/32"
],
...
}
После нужно перезапустить демон Docker, например, с помощью systemd:
systemctl restart docker
Далее можно убедиться, что изменения применились, с помощью команды docker info
Или создать самоподписанный сертификат, которым будет пользоваться реестр