Перейти к содержанию

▍Registry

Docker registry

Настройка частного реестра Docker в Ubuntu 22.04 в рамках сборки сайта на MkDocs

Будем использования Traefik в качестве обратного прокси для маршрутизации трафика внутрь Docker контейнеров. Базовую конфигурацию Traefik можно посмотреть здесь.

Compose для Registry

version: '3.3'

services:
   registry:
        image: registry:2
        container_name: registry
        logging:
          driver: "json-file"
          options:
            max-size: "10m"
            max-file: "10" 
        restart: always
        labels:
          - "traefik.enable=true" 
          - "traefik.http.routers.registry-secure.entrypoints=https"
          - "traefik.http.routers.registry-secure.rule=Host(`registry.example.com`) && Method(`GET`, `HEAD`, `POST`, `PUT`, `DELETE`, `PATCH`)"
          - "traefik.http.routers.registry-secure.tls=true"
          - "traefik.http.routers.registry-secure.service=registry"
          - "traefik.http.middlewares.registry-auth.basicauth.users=<ADMIN-PASSWORD-OUTPUT>"
          - "traefik.http.routers.registry-secure.middlewares=registry-auth"
          - "traefik.http.services.registry.loadbalancer.server.port=5000"
          - "traefik.http.routers.guest-registry-secure.entrypoints=https"
          - "traefik.http.routers.guest-registry-secure.rule=Host(`registry.example.com`) && Method(`GET`, `HEAD`)"
          - "traefik.http.routers.guest-registry-secure.tls=true"
          - "traefik.http.routers.guest-registry-secure.service=guest-registry"
          - "traefik.http.middlewares.guest-registry-auth.basicauth.users=<USER-PASSWORD-OUTPUT>"
          - "traefik.http.routers.guest-registry-secure.middlewares=guest-registry-auth"
          - "traefik.http.services.guest-registry.loadbalancer.server.port=5000"

Зарегистрируем на этом контейнере 2 набора роутеров и сервисов:

  • registry-secure - роутер и сервис с таким именем будут предоставлять полный доступ (чтение\запись)

  • guest-registry-secure - роутер и сервис с таким именем будут предоставлять гостевой доступ (чтение)

Запускаем registry:

docker-compose up -d

Добавление basic авторизации

Сначала мы собираемся сгенерировать комбинацию пользователя и пароля для базовой аутентификации с использованием htpasswd. Если он у вас не установлен, вам нужно сначала сделать это (например, для сервера Ubuntu):

apt-get install apache2-utils
Мы должны экранировать каждый символ “$” в нашем зашифрованном пароле (заменить $ на $$), если мы используем пароль напрямую в docker-compose.yml
echo $(htpasswd -nbB USER "PASS") | sed -e s/\\$/\\$\\$/g
Пример вывода команды (результат будет разный при каждом запуске команды):
USER:$$2y$$05$$iPGcI0PwxkDoOZUlGPkIFe31e47F5vewcjlhzhgf0EHo45H.dFyKW

Данный вывод нужно вставить в параметры и .

Публикация в частном реестре Docker

Авторизуемся в свой реестр Docker:

docker login https://registry.example.com

Введите логин и соответствующий пароль, заданный ранее.

Сборка своего контейнера с MkDocs

Создадим файл Dockerfile c необходимыми нам плагинами и темами:

FROM squidfunk/mkdocs-material

RUN apk add build-base ttf-ubuntu-font-family libffi-dev zlib-dev \
    libwebp-dev jpeg-dev harfbuzz-dev fribidi-dev freetype-dev \
    cairo-dev musl-dev pango-dev gdk-pixbuf-dev && \
    /usr/local/bin/python -m pip install --upgrade pip && \
    pip install mkdocs-with-pdf && \
    pip install mkdocs-bootswatch && \
    pip install mkdocs-blog-plugin && \
    pip install mkdocs-awesome-pages-plugin && \
    pip install mkdocs-roamlinks-plugin

В директории с этим файлом выполните команду сборки:

docker build -t srv/mkdocs .

Затем поставьте для образа метку расположения частного реестра, чтобы отправить туда образ:

docker tag srv/mkdocs registry.example.com/mkdocs

Отправьте образ с меткой в реестр:

docker push registry.example.com/mkdocs
Экран результатов должен выглядеть примерно следующим образом:
Output
The push refers to a repository [registry.example.com/mkdocs]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...

Настройка Gitlab-runner

Добавим настройки авторизации в наш приватный registry в Gitlab-runner, для этого отредактируем config.toml:

sudo nano /srv/docker/conf/gitlab-runner/config.toml
где добавим параметр:
[[runners]]
  environment = ["DOCKER_AUTH_CONFIG={\"auths\":{\"registry.example.com\":{\"auth\":\"bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ=\"}}}"]

где "bXlfdXNlcm5hbWU6bXlfcGFzc3dvcmQ=" нужно заменить на хеш, который можно увидеть в файле ~/.docker/config.json

Снова отредактируем файл .gitlab-ci.yml:

где изменем:
  image:
    name: squidfunk/mkdocs-material

на:
  image:
    name: registry.example.com/mkdocs

Полезные команды

Посмотреть список загруженных репозиториев:

THE_REGISTRY=registry.example.com

# Get username:password from docker configuration. You could
# inject these some other way instead if you wanted.
CREDS=$(jq -r ".[\"auths\"][\"$THE_REGISTRY\"][\"auth\"]" ~/.docker/config.json | base64 -d)

curl -s --user $CREDS https://$THE_REGISTRY/v2/_catalog | \
    jq -r '.["repositories"][]' | \
    xargs -I @REPO@ curl -s --user $CREDS https://$THE_REGISTRY/v2/@REPO@/tags/list | \
    jq -M '.["name"] + ":" + .["tags"][]'
К началу