
Создание своего docker private registry
Теория
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
При составлении этой заметки использовалась эта статья.