Локальный реестр.

Используем команду

docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  registry:2

После запуска команды локальный docker реестр готов к использованию. Но это годится только для примера. Для производственной среды нужно защитить реестр с помощью TLS/SSL и конечно использовать механизм контроля доступа.

Копирование образа в локальный реестр

Можно полчить образ из Docker Hub и затем записать его в локальньй реестр.

# получить образ ubuntu:16.04 из Docker Hub
$ docker pull ubuntu:16.04

# добавить тег localhost:5000/my-ubuntu. 
# в первой чатсти тега имя хоста и порт, Docker
# интерпретирует это как адрес реестра, при
# записи образа (push)
$ docker tag ubuntu:16.04 localhost:5000/my-ubuntu

# записать образ в локальный реестр
$ docker push localhost:5000/my-ubuntu

# теперь удалим локально-кешированные образы
# ubuntu:16.04 и localhost:5000/my-ubuntu
$ docker image remove ubuntu:16.04
$ docker rmi localhost:5000/my-ubuntu

# получить образ из локального реестра
$ docker pull localhost:5000/my-ubuntu

Остановить локальный реестр

Для остановки используется docker container stop, также как и для всех других контейнеров

$ docker container stop registry

Для удаления контейнера

$ docker container stop registry \
  &&  docker container rm -v registry

Запуск реестра автоматически

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

$ docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  registry:2 

Настройка порта

Если порт 5000 уже используется на хосте, или есть необходимость запустить несколько реестров на одном хосте:

$ docker run -d \
  -p 5001:5000 \
  --name registry-test \
  registry:2

Если нужно изменить порт реееста внутри контейнера, нужно использовать переменную окружения REGISTRY_HTTP_ADDR

$ docker run -d \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:5001 \
  -p 5002:5001 \
  --name registry-test-5002
  registry:2

Хранилище реестра

По умолчанию, данные реестра сохраняются с использованием томов (docker volume) на хосте. Если необходимо хранить данные в определенной локации файловой системы, то нужно использовать привязку/монтирование. Монтирование имеет большую связь со структурой файловой системы хоста, но имеет лучшие показатели скорости работы во многих случаях.

$ docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /mnt/registry:/var/lib/registry \
  registry:2

если использовать различные драверы, то данные реестра можно сохранить в S3, Google Cloud, OSS, Azure...

Запуск реестра с доступом из-вне.

Доступный только локально реест удобен только для тестирования, но для реальной работы он практически бесполезен.

Лучшим решением будет использовать nginx proxy или готовые решения типа Harbor.