Задонатить и смотреть →
Открой безлимитный доступ к 100+ полезных скринкастов и получай скидки на все предстоящие мероприятия

Создание приватного Docker Registry

Создание персонального приватного реестра образов Docker Registry. Создание поддомена и виртуальной машины. Подключение сторонних хранилищ.

  • 00:00:56 - Реестр DockerHub
  • 00:02:51 - Обзор документации
  • 00:07:38 - Создание реестра
  • 00:09:02 - Сборка и push образов
  • 00:12:04 - Аутентификация
  • 00:13:32 - Добавление Nginx proxy
  • 00:16:21 - Фиксация девелоперского htpasswd
  • 00:17:51 - Прокси с Let's Encrypt для рабочего сервера
  • 00:19:20 - Команда деплоя на production
  • 00:21:48 - Настройка виртуальной машины с Ansible
  • 00:25:05 - Создание виртуальной машины
  • 00:27:24 - Деплой на готовый сервер
  • 00:30:42 - Push в рабочий репозиторий
  • 00:32:10 - Контроль места на диске
  • 00:33:15 - Garbage collector
  • 00:36:11 - Подключение сторонних хранилищ
Скрытый контент (код, слайды, ...) для подписчиков. Открыть →
Дмитрий Елисеев
elisdn.ru
Комментарии (78)
fedot

Спасибо

Ответить
Arunas

Спасибо, замечательный урок.

Ответить
Arunas

а Lets Encrypt здесь, в Docker регистре, это то же самое, как, напр., у Nginx gateway/docker/production/nginx/conf.d/frontend.conf?

Ответить
Дмитрий Елисеев

Да, всё то же самое.

Ответить
Дмитрий

Очень полезный урок. В начале бы курса, но и сейчас хорошо.

Ответить
Дмитрий

И всё же это вариант с отдельной виртуалкой для реестра? Если пытаться поднять этот проект на уже занятой виртуалке, то пишет что порт 443 уже занят. Естественно, ведь там уже gateway есть. Добился что можно менять проекты на одной виртуалке с одинаковым gateway с настроенным доступом к реестру. Использую один реестр на всё про всё с помощью volumes: registry: name: registryname. После пуша и деплоя другого проекта реестр продолжает работать.

Ответить
Дмитрий

Хотя сейчас понял, что можно не задавать жестко имя реестра, а пользоваться одинаковым COMPOSE_PROJECT_NAME

Ответить
Дмитрий Елисеев

порт 443 уже занят

В этом случае registry можно поднять на любом другом порту и указывать везде его поддомен с этим портом.

Ответить
Дмитрий

Может мы о разном? я про то что сервис nginx из этого проекта не может подняться поскольку gateway из другого уже занимает порты 80 и 443. Или я не понял.

Ответить
Дмитрий Елисеев

В nginx реестра убираем порт 80 и меняем 443 на 5443. И работаем с registry.xxx:5443.

Ответить
Дмитрий

Понял, спасибо!

Ответить
Arunas

удалить всю эту часть?

server {
    listen 80;
    server_name registry.demo-auction.arsku.com;

в docker\production\nginx\conf.d\registry.conf

а как тогда ssl?

Ответить
Дмитрий Елисеев

Да, либо удалить этот блок с listen 80; и оставить listen 5443 ssl;, либо поменять порты в docker-compose-production,yml:

ports:
    - "5443:443"
Ответить
Arunas

понял, спасибо.

Ответить
Arunas

заработало, registry.demo-auction.arsku.com:5443/v2/_catalog , но не могу попасть - пароль почему-то не верный...
у Вас пароль password или htpasswd?

Ответить
Arunas

наконец вошел - оказывается, в пароль не можно знак $

Ответить
Serhii

Приветсвую.

Так же на одном сервере лежит и проект и реестр. Доступ к реестру по другому IP.

Реестр поднят и работает. При деплое проекта через реестр так же получил ошибку порт 443 уже занят. Используя вашу рекомендацию, заменил в docker-compose-production,yml:

ports:
    - "5443:443"

Пересобрал и залил реестр. Сайт реестра работает, адрес через порт 5443.

docker login авторизируется.

Но при деплое проекта:

ERROR: for api-php-fpm  Get registry.host.com:5443/v2/auction-api-php-fpm/manifests/master-1: no basic auth credentials
ERROR: for gateway  Get registry.host.com:5443/v2/auction-gateway/manifests/master-1: no basic auth credentials

Деплой командой:

HOST=deploy@4.121.7.91 PORT=22 REGISTRY=registry.host.com:5443 IMAGE_TAG=master-1 BUILD_NUMBER=1 make deploy

PS: хосты и IP изменены на несуществующие

Ответить
Дмитрий Елисеев

Нужно выполнить docker login и на самом продакшен-сервере.

Ответить
Serhii

Точно... завтыкал что-то... И надо в docker-compose-production.yml полностью удалит порт 80, иначе с ним будет конфликт. Оставить:

ports:
         - "5443:443"
Ответить
fedot

Дмитрий, извиняюсь, а вы не могли бы уточнить, зачем нам эти реестры и прочее если на локальной машине все есть, разве не проще грузить на виртуалку наш проект и запустить уже там докер по нашему прод файлу, предварительно поставив то что надо ансамблем? А надо там только докер как я понял, извиняюсь если не внимательно слушал, но этот момент не смог понять что-то. Или это делается для того, что бы не качались официальные образы, которые могут резко измениться и что то нам сломать в самый неподходящий момент? Если это так, то разве нельзя грузить из официального реестра строго определенный образ, который мы точно знаем что работает?

Ответить
Дмитрий Елисеев

Так можно в примитивном случае сделать с проектами на PHP, так как не нужно что-то компилировать.

Но если мы запустим docker-compose build в проекте на NodeJS или Java, то на слабой одноядерной виртуалке оно будет собираться десять минут со 100% нагрузкой. Если запускаем на кластере из нескольких виртуалок, то так весь кластер "ляжет".

Поэтому при работе с Docker предполагается, что мы собираем образ-архив с готовым скомпилированным кодом у себя на сборочном компьютере. И через реестр закидываем уже собранные образы на свои виртуалки и мгновенно там запускаем.

Ответить
fedot

Спасибо, за исчерпывающий ответ, но конечно всё равно хотелось бы рассмотреть и такой вариант в курсе, если есть такая возможность конечно, клонирование проекта может помочь если надо что то быстро поменять на проде, а на пример с реестром что то случилось и быстро разобраться не получается.

Ответить
Дмитрий Елисеев

если надо что то быстро поменять на проде

Если в проекте автодеплой, то вручную на прод обычно вообще никто не ходит. Если что-то сломалось, то либо запускают откат, либо сразу коммитят исправление и запускают следующий деплой.

Ответить
fedot

Ясно, спасибо.

Ответить
Arunas

auction в Dev реж. поднялся хорошо - работало localhost/8080, 8081, 8082.
Но после
docker-compose run --rm api-php-cli composer update
не поднялся 8081 (api):
Fatal error: Access level to App\ErrorHandler\LogErrorHandler::$logger must be protected (as in class Slim\Handlers\ErrorHandler) or weaker in /app/src/ErrorHandler/LogErrorHandler.php on line 15

Ответить
Дмитрий Елисеев

Да, так как в новой версии Slim в ErrorHandler добавили свой protected $logger.

Ответить
Arunas

спасибо за ответ.

Ответить
Arunas

что это за параметр в docker-compose-production.yml: SENTRY_DSN: ${SENTRY_DSN} ?

Ответить
Дмитрий Елисеев

Ключ для подключения сервиса Sentry из 24-го эпизода.

Ответить
Александр

Спасибо за урок! Очень полезно. Сделайте еще по sentry.

Ответить
Дмитрий Елисеев

Про его установку себе через Docker?

Ответить
Александр

Да да, не облачное решение, а поднятии своего с использованием докера

Ответить
fedot

Поддержу, всегда приятнее иметь такую вещь у себя и не зависеть от внешних источников, а то мало ли, возьму и уберут бесплатный тариф вообще или РКН адресом ошибется и все посыпется, а так на одном образе можно разные проекты держать и не париться.

Ответить
Александр

Почему-то после docker run --rm registry:2 htpasswd -Bbn registry password > htpasswd

Ошибка write /dev/stdout: permission denied

Ответить
Александр

Может с убунтой что не так, подскажите пожалуйста линуксоводы

Ответить
Александр

Понял в чем ошибка, она возникает при работе через терминал шторма. Решение - все команды вводил через родную консоль убунты - все отработало , без ошибок доступов. Может как шторм надо в убунте поднастроить незнаю, чтоб робить нормально через его консоль.

Ответить
Ярослав

После ввода команды docker run --rm registry:2 htpasswd -Bbn registry password > htpasswd пишет, что htpasswd не найдено. А когда используется nginx, то вовсе создает пустую папку вместо файла. Но аутентификация работает, правда я не знаю ни логина, ни пароля. Вроде делал то же самое.

Ответить
Дмитрий Елисеев

А просто команда docker run --rm registry:2 htpasswd -Bbn registry password хэш генерирует?

Ответить
Ярослав

Тот же результат. /entrypoint.sh: exec: line 10: htpasswd: not found Решил проблему только установкой apache-utils и команда в итоге чуть другая. Может из-за этого у меня не пулятся образы с реестра при деплое с основного проекта. Я эту проблему описал в комментарии к 5-му уроку.

Ответить
Дмитрий Елисеев

Удалили в последней версии. Используйте registry:2.6 вместо registry:2

Ответить
Ярослав

Так заработало. Спасибо.

Ответить
Михаил

Дмитрий, какие посоветуете UI для докер репозитория?

Ответить
Дмитрий Елисеев

Любой.

Ответить
Pavel N

Подскажите Dockrer начал выдавать ошибки при сборке - net/http: TLS handshake timeout. Причем то на один пакет ругается то на другой. В чем может быть проблема? Конфигурацию не менял.

Ответить
Дмитрий Елисеев

Да, тоже бывает иногда. Проблема на сервере Docker.

Ответить
Ruslan

Почему у вас не возникла эта ошибка?

Error docker-compose: error while loading shared libraries: libz.so.1: failed to map segment

Решение:

mkdir $HOME/tmp
export TMPDIR=$HOME/tmp

-- для локального запуска

А так :

sudo mount /tmp -o remount,exec
Ответить
Ruslan

Всё хорошо, но во всем проекте, мне не нравится, то что имена хостов разбросаны по конфигам.
Интересно решается ли это чем-то кроме как:

sed /deworker.pro/my_cooldoamin.com/g

Материал классный.
Спасибо.

Ответить
Дмитрий Елисеев

Все эти параметры можно переопределять через секцию vars прямо в файле hosts.yml

Ответить
Дядя Женя

А почему команда

docker run --rm registry:2 htpasswd -Bbn registry password > htpasswd

может выдавать ошибку, что файл не найден? /entrypoint.sh: exec: line 10: htpasswd: not found

Понятно, что он не с генерировался, но почему и как исправить?

Ответить
Дмитрий Елисеев

Уже ответил Ярославу выше.

Ответить
Дядя Женя

Ваш ответ Ярославу к сожалению не заметил. Не дочитал. Но решил проблему сам, тем же способом, случайно.

Ответить
Дядя Женя

Могу добавить, что если меняю на

htpasswd -Bbn registry password > htpasswd

то файл генерируется, вроде make init выполняется, но при этом авторизация не появляется

Ответить
Дядя Женя

У меня теперь другая проблема. Вроде все деплоится, но страница реестра не открывается. Мои последние строки отчета выполнения слегка отличаются от ваших

htpasswd                                               100%   71     1.9KB/s   00:00
ssh deploy@0.0.0.0 -p 22 'cd registry && echo "COMPOSE_PROJECT_NAME=registry" >> .env'
ssh deploy@0.0.0.0 -p 22 'cd registry && docker-compose pull'
Pulling registry ... done
Pulling nginx    ... done
ssh deploy@0.0.0.0 -p 22 'cd registry && docker-compose up --build --remove-orphans -d'
registry_registry_1 is up-to-date
registry_nginx_1 is up-to-date
Ответить
Дядя Женя

Кстати, при попытке запушить в такой ситуации выдает

docker login -u registry -p password registry.demo.kev.company
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get registry.demo.example.com/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
Ответить
kashamamina

а я никак не могу найти что значит этот Realm, зачем его передавать через переменные окружения и что он делает вообще? и почему в переменной окружения вы указывали Realm, а в nginx Registry Realm

и еще, вы какой-то плагин используете для nginx, чтобы синтаксис так грамотно подсвечивало или как? а то я качал плагины они как-то криво это делают.

Ответить
Дмитрий Елисеев

а я никак не могу найти что значит этот Realm

При использовании Basic-аутентификации в браузере это сообщение из Realm просто выводится в диалоговом окне ввода логина и пароля. То есть там можно вписать любой текст.

Ответить
kashamamina

спасибо

Ответить
Дмитрий Елисеев

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

Вроде плагина с именем Nginx у себя не нашёл. Может он так подсвечивает сам по себе цветами основной темы.

Ответить
Николай

Дмитрий, добрый день! Вопрос по смене порта ssh на 517 (в вашем случае). Как его правильно менять - вручную на самом сервере реестра, или через добавление роли для ansible?

Ответить
Дмитрий Елисеев

В моём случае я менял вручную файл /etc/ssh/sshd_config в виртуалке.

Ответить
Николай

Ясно. Спасибо!

Ответить
drakulitka

Ошибка установки зависимостей:

$ make server

TASK [docker : Install dependencies] 
fatal: [server]: FAILED! => {"changed": false, "msg": "Failed to update apt cache: W:This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details., E:Repository 'http://mirror.selectel.ru/debian buster InRelease' changed its 'Suite' value from 'stable' to 'oldstable', W:This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details., E:Repository 'http://mirror.selectel.ru/debian buster-updates InRelease' changed its 'Suite' value from 'stable-updates' to 'oldstable-updates', W:This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details., E:Repository 'http://security.debian.org buster/updates InRelease' changed its 'Suite' value from 'stable' to 'oldstable'"}
Ответить
Дмитрий Елисеев

Если ошибка при повторном запуске, то попробуйте зайти на сервер вручную по ssh и запустить:

apt update

Возможно, что эта команда что-нибудь спросит и нужно будет ответить yes.

Ответить
slo_nik

Доброй ночи, Дмитирй.

Подскажите, почему возникает такая "ошибка" при выполнении make docker-build?

> docker-compose build
registry uses an image, skipping
nginx uses an image, skipping

Когда удаляю make init тоже самое в консоли пишется.

Ответить
Дмитрий Елисеев

Это не ошибка.

Это сообщение, что сервисы используют готовые образы с DockerHub и их он не будет билдить.

Ответить
Никита

Доброго времени суток! Подскажите, почему может происходить следующие ситуации:

  1. При выполнении make server не хочет работать с 517 портом, если переключить на 22 то все нормально
  2. Deploy и build работают нормально, но при попытке запушить в реест, выходит ошибка connection refused - и соотвественно сам сайт ничего не отдает тоже. Хотя все записи dns создал, в самом vscale и регистраторе reg.ru, но заводиться не хочет ни в какую
Ответить
Никита

Все заработало и реест справился, но теперь при выполнении

HOST=root@5.53.124.113 PORT=22 REGISTRY=registry.evgenyaperesadova.com IMAGE_TAG=1 BUILD_NUMBER=1 make deploy

Получаю вот такой набор ошибок:

Get registry.evgenyaperesadova.com/v2/: dial tcp 5.53.124.113:443: connect: connection refused

Хотя команда docker login нормально отрабатывает

Ответить
Дмитрий Елисеев

При выполнении make server не хочет работать с 517 портом, если переключить на 22 то все нормально

Порт указывается в виртуальной машине в файле /etc/ssh/sshd_config. Если там не меняли, то по умолчанию будет 22.

Ответить
Дмитрий Елисеев

выходит ошибка connection refused

Такая ошибка бывает когда сервер не запустился.

Нужно зайти на сервер и посмотреть docker-compose logs

Ответить
Konstantin

супер

Ответить
Никита

Здравствуйте еще раз! Сейчас возникла такая проблема, что при попытке выполнить заново команду deploy, как будто происходит подмена сертификатов на домене registry и сертификат с поддомена registry по итогу ссылается на домен api - из-за этого ломается pull образов. Можно ли как то поправить эту проблему?

Ответить
Дмитрий Елисеев

Не встречал, так что не подскажу.

Ответить
Иван

Здравствуйте, Дмитрий! Скажите, пожалуйста, почему вы разделили provisioning сайта и реестра? Просто как бы и реестр и сайт относятся к одному проекту. Можно ли было оформить все отдельной ролью в одном provisioning или такой подход плох?

Ответить
Дмитрий Елисеев

Если проект всего один, то можно объединить, если так удобнее. Но со временем у компании может появиться несколько проектов. Тогда целесообразно Jenkins и реестр вынести отдельно.

Ответить
Олег

Здравствуйте!

сменил порт на 5443

задеплоил реестр на поддомен командой:

HOST=deploy@176.119.147.91 PORT=22 HTPASSWD_FILE=htpasswd make deploy

ошибок не получил.

Вывод в консоли: http://joxi.ru/Q2KRvQ7iO5zQkm

Перехожу по ссылке https://registry.tagzilla.ru:5443/v2/ Вижу ошибку "Не удается получить доступ к сайту" http://joxi.ru/L21KVobiwPXB4r

Не могу разобраться что не так сделал.

Вывод docker ps http://joxi.ru/4Ak7jqeFjvx9XA

Вывод docker logs registry_nginx_1 http://joxi.ru/Dr8XVMECKQV1Dr

Вывод docker logs registry_registry_1 http://joxi.ru/LmGLvMDtBqy8K2

Вывод netstat -tulpn http://joxi.ru/J2bRjqliqd8JW2

Может есть какие мысли куда посмотреть?

Ответить
Дмитрий Елисеев

Весьма странно. А на хостинге или в виртуалке никто порт 5443 не блокирует?

Ответить
Владимир Перепеченко

Ну просто отличный материал. Я в восхищении!

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий

Или войти через:

Google
GitHub
Yandex
MailRu