GrabDuck

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

:

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-репозитория. Для глубокого изучения темы рекомендую ознакомиться с официальным мануалом и списком настроек репозитория.

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