ONE DUDE`S BLOG

/media/docker-2.webp

Создание своего docker private registry

10.10.2020
Пошаговое создание приватного реестра для ваших докер контейнеров.

Теория

Docker registry - приложение, позволяющее хранить локально докер контейнеры в 1 централизованно месте.

Установка

Предполагаю, что вы уже имеете установленный docker (можно проверить командой docker version) и docker-compose.

Первым делом, нам необходимо создать новые директории для нашего реестра и поддериктории для nginx и auth:

mkdir -p registry/{nginx, auth}

создадим директорию конфигурации nginx и директорию для ssl сертификатов:

cd registry
mkdir -p nginx/{conf.d/,ssl}

Созаздим docker-compose.yml файл внутри registry для описание сервисов: vim docker-compose.yml

version: '3'
services:
#Registry
  registry:
    image: registry:2
    restart: always
    ports:
    - "5000:5000"
    environment:
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry-Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/registry.passwd
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
    volumes:
      - registrydata:/data
      - ./auth:/auth
    networks:
      - mynet
#Nginx Service
  nginx:
    image: nginx:alpine
    container_name: nginx
    restart: unless-stopped
    tty: true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/conf.d/:/etc/nginx/conf.d/
      - ./nginx/ssl/:/etc/nginx/ssl/
    networks:
      - mynet
#Docker Networks
networks:
  mynet:
    driver: bridge
#Volumes
volumes:
  registrydata:
    driver: local

Настроим порты для nginx, для этого создадим файл registry/nginx/conf.d/registry.conf vim registry/nginx/conf.d/registry.conf.

upstream docker-registry {
    server registry:5000;
}

server {
    listen 80;
    server_name registry.example-server.com;
    return 301 https://registry.example-server.com$request_uri; 
}

server {
    listen 443 ssl http2;
    server_name registry.example-server.com;

    ssl_certificate /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;

    # Log files for Debug
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    location / {
        # Do not allow connections from docker 1.5 and earlier
        # docker pre-1.6.0 did not properly set the user agent on ping, catch "Go *" user agents
        if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" )  {
            return 404;
        }

        proxy_pass                          http://docker-registry;
        proxy_set_header  Host              $http_host;
        proxy_set_header  X-Real-IP         $remote_addr;
        proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto $scheme;
        proxy_read_timeout                  900;
    }

}

Также увеличим максимальный размер загружаемых файлов, для этого создадим registry/nginx/conf.d/additional.conf

client_max_body_size 2G;

Настройка ssl

Приватный репозиторий докер контейнеров не работает без ssl (в случае если пробрасываем порты в интернет). Не буду зацикливаться на настройке ssl, подробнее про это можно прочитать тут.

Запросим пароль для register.passwd

cd auth
htpasswd -Bc registry.passwd example

После настройки ssl можем запускать

docker-compose up -d

Пример использования

Для начала авторизируемся в нашем реестре для этого на локальной машине:

docker login https://your-domain

Получим список репозиториев с удаленного реестра:

curl -k -X GET https://<username>:<password>@<domain_name>/v2/_catalog

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

docker tag test-image example.com/test-image

После чего можно опубликовать образ в реестре

docker push example.com/test-image

При составлении этой заметки использовалась эта статья.

Docker
1
1269