Настраиваем приватный Docker репозиторий

в 12:18, , рубрики: devops, docker, LetsEncrypt, repository, виртуализация, ит-инфраструктура, Серверное администрирование

Настраиваем приватный Docker репозиторий - 1 Docker одна из горячих тем в разработке. Большинство новых проектов строится именно на Docker. Как минимум, он отлично зарекомендовал себя для распространения ПО, например, наша система поиска по документам Ambar устанавливается с помощью docker-compose.

В начале работы над Ambar мы использовали публичный docker репозиторий, но с ростом проекта и появлением enterprise версии мы задумались над созданием собственного приватного репозитория. В данной статье мы поделимся своим опытом развертывания селф-хостед репозитория: пошагово опишем весь процесс, попытаемся обойти все подводные камни.

Локальный docker репозиторий

Итак, простейший Docker репозиторий можно поднять одной командой

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

Для проверки репозитория зальем в него образ ubuntu.

  1. Сначала скачаем образ с официального репозитория и добавим ему тег localhost:5000/ubuntu.
  2. Запушим образ в наш новый репозиторий: docker push localhost:5000/ubuntu.

Хорошо, теперь мы умеем работать с локальным docker репозиторием. Чтобы каждый раз не вспоминать команду запуска репозитория давайте создадим docker-compose.yml файл:

registry:
  restart: always
  image: registry:2
  ports:
    - 5000:5000  
  volumes:
    - /path/data:/var/lib/registry /* раздел который будет использоваться как хранилище для вашего репозитория*/

Чтобы запустить репозиторий достаточно ввести команду docker-compose up -d в директории с docker-compose файлом. С локальным репозиторием разобрались, перейдем к настройке SSL.

Настройка SSL

Зачем нужен SSL? Docker репозиторий который доступен из интернета должен работать только через защищенное https соединение. Есть возможность обойти это ограничение, использовать самоподписанные сертификаты, но как показывает практика это работает через раз и легче один раз настроить все правильно, благо для тех у кого нет SSL сертификата я расскажу как использовать Letsencrypt. Стоит упомянуть что SSL является обязательным условием для работы аутентификации в репозитории.

Если у вас есть SSL сертификат — указываем путь к нему в docker-compose файле, смотрите листинг ниже.

registry:
  restart: always
  image: registry:2
  ports:
    - 5000:5000
  environment:
    REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt
    REGISTRY_HTTP_TLS_KEY: /certs/domain.key
  volumes:
    - /path/data:/var/lib/registry 
    - /path/certs:/certs /* папка где хранитcя сертификат */

Если же SSL сертификата нет — лучший выход использовать Letsencrypt. В последних версиях docker он работает из коробки без предварительного создания сертификатов, правда рабочего примера я нигде не нашел, поэтому приведу его здесь.

registry:
  restart: always
  image: registry:2
  ports:
    - 443:5000 /* важно поменять порт с на 443, иначе letsencrypt работать не будет */
  environment:
    REGISTRY_HTTP_TLS_LETSENCRYPT_CACHEFILE: /cache.letsencrypt /* файл в котором будет храниться кэш letsencrypt*/
    REGISTRY_HTTP_TLS_LETSENCRYPT_EMAIL: hello@rdseventeen.com /* email, который будет использоваться для создания учетной записи в letsencrypt */    
  volumes:
    - /path/data:/var/lib/registry    

Стоит обратить внимание на то что для корректной работы Letsencrypt необходимо поменять порт с 5000 на 443. Расположение кеша Letsencrypt может быть любым.
Для тестирования нашего репозитория выполним следующие команды:

docker pull ubuntu
docker tag ubuntu myregistrydomain.com:443/ubuntu
docker push myregistrydomain.com:443/ubuntu
docker pull myregistrydomain.com:443/ubuntu

Настраиваем аутентификацию

Защитим наш репозиторий паролем. Для этого необходимо создать файл с паролями и указать его docker репозиторию. Следующая команда создаст пользователя testuser с паролем testpassword, поместит их в файл и сохранит его в path/auth/htpasswd.

  docker run --entrypoint htpasswd registry:2 -Bbn testuser testpassword > path/auth/htpasswd

В docker-compose укажем путь к файлу с паролями и использование basic аутентификации

registry:
  restart: always
  image: registry:2
  ports:
    - 443:5000
  environment:
    REGISTRY_HTTP_TLS_LETSENCRYPT_CACHEFILE: /cache.letsencrypt
    REGISTRY_HTTP_TLS_LETSENCRYPT_EMAIL: hello@rdseventeen.com
    REGISTRY_AUTH: htpasswd
    REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
  volumes:
    - /path/data:/var/lib/registry
    - /path/auth:/auth

Для того чтобы изменения вступили в силу необходимо перезапустить docker репозиторий. Используем команду docker-compose restart. Логинимся в созданный репозиторий с помощью команды docker login myregistrydomain.com:443. После этого наш репозиторий будет доступен для скачивания хранящихся в нём образов.

Итог

В статье мы рассмотрели создание приватного docker репозитория. Для глубокого изучения темы рекомендую ознакомиться с официальным мануалом и списком настроек репозитория.

Спасибо за внимание!

Автор: sochix

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js