# Сервер для проекта "Ресторан" (тесты) + инструкция для создания своего Docker-репозитория. ## Создание self-hosted docker-репозитория (далее _докер-репозиторий_) ### Настройка авторизации 1. На сервере, где разворачиваете _докер-репозиторий_, установите утилиту `htpasswd`, входящую в состав `apache2-utils`: ``` sudo apt install apache2-utils ``` 1. Создайте каталог для хранения файла учетных данных (предварительно создайте, где вам удобно, каталог, в котором будут храниться все даные docker-репозитория, например `/home/user/docker-registry`) Дальнейшие команды выполняйте в этом каталоге 1. Создаём каталог для файла с паролями ``` mkdir -p ./auth ``` 1. Создаём файл с парой логин/пароль (если нужно добавить пару в существующий файл, то используем `>>`): ``` htpasswd -Bbn username password > ./auth/htpasswd ``` * `-B` — использование bcrypt для хеширования пароля. * `-b` — передача пароля через командную строку вместо интерактивного ввода. * `-n` — указание не запрашивать ввод пароля повторно. * `username` — название учетной записи пользователя. * `password` — пароль. ### Создание _докер-репозитория_ _Докер-репозиторий_ сам по себе тоже является docker-контейнером и запускается командой (в том же каталоге, где мы до этого настраивали авторизацию): ``` mkdir ./regrepo docker run -d -p 5000:5000 --restart=always --name KeiRegistry -v ./regrepo:/var/lib/registry -v ./auth:/auth -e REGISTRY_AUTH=htpasswd -e REGISTRY_AUTH_HTPASSWD_REALM=KeiRegistry -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry:latest ``` * `-v ./regrepo:...` - том для репозиториев * `-v ./auth:...` - том для авторизации * `-e REGISTRY_AUTH=htpasswd` — указание **Docker Registry** использовать базовую аутентификацию через htpasswd. * `-e REGISTRY_AUTH_HTPASSWD_REALM=KeiRegistry` — область (realm) для аутентификации, которую пользователи увидят при попытке войти в **Docker Registry**. Это текстовое поле помогает идентифицировать ресурс, к которому осуществляется доступ. * `-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd` — путь до файла с паролями **внутри** контейнера. После запуска контейнера можно проверить его доступность командой (в примере реальный сервер с настроенной авторизацией, поэтому в ответ получим ошибку авторизации): ```sh curl https://docker.kolei.ru/v2/ ``` ## Создание образа и публикация его в своем _докер-репозитории_ (который настроили выше) ### Авторизуемся на сервере с _докер-репозиторием_ ```sh docker login docker.kolei.ru ``` ### Собираем образ (сразу задаём тег) ```sh docker build --tag docker.kolei.ru/restaurant-api:0.1 . ``` * `--tag docker.kolei.ru/restaurant-api:0.1` - задаем тег (имя) образа (сразу указываем _докер-репозиторий_) * `.` - контекст (где искать `Dockerfile`) ### Пушим (публикуем) образ в _докер-репозитории_ ```sh docker push docker.kolei.ru/restaurant-api:0.1 ``` ## Запуск образа на сервере 1. Авторизуемся ``` docker login docker.kolei.ru ``` 1. Останавливаем и удаляем предыдущую версию образа ``` docker stop restaurant-api || true docker rm restaurant-api || true ``` 1. Запускаем новый образ ``` docker run --name restaurant_api -d -p 3025:3025 --restart unless-stopped docker.kolei.ru/restaurant-api:0.1 ```