После начнете работать с Docker, вы в конечном итоге обнаружите, что вы хотите немного более контролировать изображения, на которых вы хотите развернуть свой контейнер. Здесь Docker Registry играет важную роль, оно поможет вам централизовать ваши контейнерные изображения, а также уменьшить время сборки для вас и вашей команды. Преимущества реестров Не останавливаются здесь, вы можете интегрировать его с помощью своей постоянной интеграции/непрерывной развертывания (CI/CD) трубопроводами, автоматически автоматизируя процесс push в частном документе, который помогает обновить среду производства или разработки на идти.
Docker предоставляет бесплатный общедоступный реестр, известный как Docker Hub , что принимает пользовательские сборки докера. Но это не идеально, когда вы работаете над проприетарным программным обеспечением или веб-приложением, так как он содержит весь необходимый код для запуска приложения. Следовательно, здесь приходит частный реестр Docker для спасения.
Этот учебник поможет вам настроить и обеспечить собственный реестр Private Docker. Ниже приведены упомянутые предварительные условия, прежде чем начать 4 этапа руководства:
- Нам нужно 2 сервера Ubuntu 18.04 с привилегиями Sudo. Сначала будет действовать как клиентский сервер, а второе будет частным реестром Docker.
- Обе системы должны иметь Docker и Docker Compose.
- Статический IP, чтобы указать свой домен.
- Доменное имя или подделок (в зависимости от того, что вы предпочитаете), что вы предпочитаете), этот устойчивый/разрешенный сервер реестра.
- SSL для частного реестра. Мы будем использовать давайте шифрование с nginx.
Итак, давайте начнем гид …
Шаг 1 — Настройка реестра Docker
Командная строка Docker идеально подходит для управления 2 или 3 контейнерами. Но если мы поговорим о развертывании полного развертывания приложений, которое часто требует нескольких других компонентов, работающих параллельно, то он может быть немного подавляющим.
С помощью Docker Compose мы можем создать .yml Файл, который помогает нам настроить конфигурацию каждого контейнера и устанавливать связь между ними. Теперь реестр Docker как приложение состоит из нескольких компонентов, поэтому мы собираемся использовать Docker Compose для управления конфигурацией.
Так, на всякий случай Если у личного сервера реестра Docker не имеет Docker-Compose
Тем не менее, затем следуйте указанным ниже шагам.
Установка Docker Compose на Linux Systems
Во-первых, вам нужно скачать Docker Compose Binary из Compose Resository, а затем сделать бинарный исполняемый файл:
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose \ && sudo chmod +x /usr/local/bin/docker-compose
Теперь проверьте установку:
$ docker-compose --version docker-compose version 1.25.0, build 4667896b
Если ваша установка не удается, вам может потребоваться создать дополнительную символическую ссылку:
$ sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
Обратите внимание, что вышеупомянутые шаги строго предназначены для систем на основе Linux. Если вы находитесь в другой ОС, следуйте инструкциям, упомянутым на этом ссылка Чтобы установить Docker-Compose
Отказ
Настройка частного реестра Docker
На сервере следуйте указанным ниже шагам, чтобы создать свой собственный реестр Private Docker. Во-первых, мы собираемся создать каталог, перейти к нему, а затем создать подкаталог для хранения наших данных:
$ mkdir /your/preferred/path/my-pdr && cd $_ $ mkdir main
Создать Docker-Compose.yml
Файл конфигурации для нашего реестра в My-Pdr
каталог, и откройте его в предпочтительном текстовом редакторе:
$ touch docker-compose.yml && nano docker-compose.yml
Добавьте описанную ниже базовую конфигурацию для реестра Docker:
version: '3.7' services: registry: restart: always image: registry:2 ports: - "5000:5000" Environment: REGISTRY_AUTH: htpasswd REGISTRY_AUTH_HTPASSWD_REALM: Registry REGISTRY_AUTH_HTPASSWD_PATH: /a2auth/registry.password REGISTRY_HTTP_SECRET: SomeRandomStringToUse REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /main REGISTRY_STORAGE_DELETE_ENABLED: 'true' volumes: - ./main:/main - ./a2auth:/a2auth
Давайте распадаем вышеуказанную конфигурацию,
Перезапустить политику:
Нам нужно обеспечить, чтобы наша система была принудительно остановлена или требуется запланированная перезагрузка системы, то сервер реестра перезапускается как сапоги системы. Следовательно, мы собираемся настроить Перезапуск: всегда
Отказ
Раздел изображения:
В разделе изображения вы должны использовать официальное изображение Docker https://hub.docker.com//registry с тегом 2
. Вы можете использовать любой другой или последнее изображение согласно вашему требованию, но ради этого урока мы собираемся придерживаться Реестр: 2
изображение.
Раздел порта:
В разделе портов мы использовали номер порта по умолчанию, используемый в изображении реестра, который является 5000
он говорит Docker на состав порта 5000
на сервере в порт 5000
в беговой контейнере. В случае, если 5000
Порт уже занят, тогда вы можете использовать любой другой порт согласно вашему желанию.
Секция окружающей среды:
В окружающая среда
Раздел, мы установили пару переменных среды в контейнере реестра Docker, мы собираемся нарушить это на две части, как указано ниже:
Место хранения:
Registry_Storage_filesystem_rootDirectory
С пути/главный
, поскольку приложение обнаруживает переменную во время запуска, она начнет сохранение данных в определенный каталог, то есть/главный
.Registry_Storage_delete_enabled
Он установлен в True, в противном случае контейнер Docker Registry не будет поддерживать удаление изображений.
Аутентификация:
Вы можете использовать базовый механизм аутентификации для управления доступом к вашим личным реестре Docker. Для этого вы можете создать файл аутентификации с HTPASSWD и добавить пользователей к нему.
Вы можете установить HTPASSWD Пакет, запустив следующую команду:
$ sudo apt install apache2-utils
Создайте каталог для хранения учетных данных:
$ mkdir /your/preferred/path/my-pdr/a2auth && cd $_
Чтобы создать первый пользователь, вы можете использовать ниже команду. Он предложит вам ввести пароль, когда вы вводите пароль, убедитесь, что вы копируете его где-то в безопасности. Как это будет использоваться для вохода в ваш личный реестр:
$ htpasswd -Bc registry.password yourusername
Вы можете использовать флаг -B
Чтобы указать BCRYPT, который более безопасен, чем шифрование по умолчанию и -C
создать новый пользователь.
Регистрация
, этим мы указалиHTPASSWD
Используемая мы использовали схему аутентификации.Реестр Auth HTAPASWD PATH
он указывает на файл аутентификации, который мы создали для пользователя.Регистрация ktpasswdrealm
это подразумевает названиеHTPASSWD
область.Registryhttpsecret
, вы можете использовать любую длинную структуру Format Format в переменной, или вы можете генерировать одну из самой системы, запустив эту команду:Cat/Dev/Urandom | tr -dc 'a-za-z0-9' | головки 32
Раздел громкости:
Вы также упомянули раздел «Объемы» в файле конфигурации, что помогает Docker на карте /Главная
каталог внутри контейнера к /главный
на сервере реестра. Так что к концу дня все данные, которые отправляются в реестр контейнера, будут храниться в /Ваш/предпочтительный/путь/my-pdr
На сервере реестра.
Теперь пришло время поставить нашу конфигурацию для тестирования. Вы можете сделать это, запустив следующую команду:
$ docker-compose up
Вы увидите указанный ниже вывод:
Creating network "registry_default" with the default driver Pulling registry (registry:2)... 2: Pulling from library/registry c87736221ed0: Pull complete 1cc8e0bb44df: Pull complete 54d33bcb37f5: Pull complete e8afc091c171: Pull complete b4541f6d3db6: Pull complete Digest: sha256:8004747f1e8cd820a148fb7499d71a76d45ff66bac6a29129bfdbfdc0154d146 Status: Downloaded newer image for registry:2 Creating registry_registry_1 ... done Attaching to registry_registry_1 registry_1 | time="2019-12-31T09:21:37.028548595Z" level=info msg="redis not configured" go.version=go1.11.2 instance.id=3a07596d-d918-4b9f-ac80-e0b3f9ae1e1a service=registry version=v2.7.1 registry_1 | time="2019-12-31T09:21:37.028661776Z" level=info msg="Starting upload purge in 55m0s" go.version=go1.11.2 instance.id=3a07596d-d918-4b9f-ac80-e0b3f9ae1e1a service=registry version=v2.7.1 registry_1 | time="2019-12-31T09:21:37.040850986Z" level=info msg="using inmemory blob descriptor cache" go.version=go1.11.2 instance.id=3a07596d-d918-4b9f-ac80-e0b3f9ae1e1a service=registry version=v2.7.1 registry_1 | time="2019-12-31T09:21:37.041642152Z" level=info msg="listening on [::]:5000" go.version=go1.11.2 instance.id=3a07596d-d918-4b9f-ac80-e0b3f9ae1e1a service=registry version=v2.7.1
Вуаля … Выход указывает, что наш контейнер запускается и работает на порту 5000. На данный момент ударил Ctrl + C
выключить ваш реестр Private Docker.
Шаг 2 — Настройка Nginx для переадресации портов
Теперь вы должны настроить переадресацию портов через Nginx в порт контейнеров, который работает на порту 5000
Отказ После завершения этого шага вы можете получить доступ к частном реестре по вашему определенному домену или поддомену.
Это руководство предполагает, что вы уже настроили Nginx с помощью Encrypt. Теперь вам нужно создать файл конфигурации сервера —
$ cd /etc/nginx/conf.d && nano yourdomainname.com.conf
Здесь вы должны пересылать трафик в порт 5000, на котором будет запущен ваш существующий контейнер Docker Registry. Вам необходимо добавить дополнительную информацию с сервера в реестр для каждого запроса и ответа в заголовке.
Файл конфигурации сервера должен выглядеть что-то вроде ниже. Обратите внимание, что вам нужно запустить Certbot Чтобы установить SSL для домена.
http { upstream docker-registry { server registry:5000; } map $upstream_http_docker_distribution_api_version $docker_distribution_api_version { '' 'registry/2.0'; } server { listen 80; listen [::]:80; server_name yourdomainname.com; return 301 https://$host$request_uri; } server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name yourdomainname.com; ssl_certificate /etc/letsencrypt/live/yourdomainname.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomainname.com/privkey.pem; location /v2/ { if ($http_user_agent ~ "^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$" ) { return 404; } add_header 'Docker-Distribution-Api-Version' $docker_distribution_api_version always; 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; } }
$ http_user_agent
Блок проверяет, что докерная версия клиента выше 1,5 или нет, потому что здесь мы используем версию 2.0 реестра. Useragent
гарантирует, что это не Идти применение. Вы можете найти больше информации о конфигурации заголовка Nginx здесь Отказ
Теперь пришло время проверить файл конфигурации сервера:
$ sudo nginx -t
Вы увидите следующий вывод:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
Если ваш тест не удается, вы можете пройти через журнал ошибок Nginx, который обычно находится в /var/log/nginx/
Дирецортий, это поможет вам понять, что пошло не так.
Далее необходимо изменить предел загрузки файла NGINX по умолчанию, который бывает единственным 1 МБ. Поскольку Docker разделяет большое изображение загрузки на отдельные слои, иногда они могут получить максимально 1 ГБ, поэтому вам нужно убедиться, что реестр может обрабатывать большие загрузки файлов. Для этого вам нужно настроить client_max_body_size
предел в /etc/nginx/nginx.conf
файл.
Откройте файл и найдите http
раздел:
... http { client_max_body_size 3000M; ... } ...
Опять же, проверьте ваши изменения и перезапустите Nginx.
$ sudo nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful $ sudo systemctl restart nginx
Здесь вы можете увидеть, что тест успешен, и вы изменили размер максимального загрузки до 3 ГБ.
Чтобы подтвердить, что Nginx пересылает трафик для порта 5000
Откройте окно браузера и введите URL-адрес:
https://yourdomainname.com/v2/
Вы увидите подсказку в вашем браузере, так как процесс аутентификации находится в пьесе. Введите имя пользователя и пароль, которые вы создали ранее, и вы увидите пустой объект JSON:
{}
Принимая во внимание, что если вы перейдете к вашему терминалу, вы найдете выход, аналогичный следующему:
registry_1 | time="2019-12-31T09:21:37.041642152Z" level=info msg="response completed" go.version=go1.7.6 http.request.host=cornellappdev.com http.request.id=a8f5984e-15e3-4946-9c40-d71f8557652f http.request.method=GET http.request.remoteaddr=128.84.125.58 http.request.uri="/v2/" http.request.useragent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7" http.response.contenttype="application/json; charset=utf-8" http.response.duration=2.125995ms http.response.status=200 http.response.written=2 instance.id=3093e5ab-5715-42bc-808e-73f310848860 version=v2.6.2 registry_1 | 172.17.0.2 - - [31/Dec/2019:09:21:38+0000] "GET /v2/ HTTP/1.0" 200 2 "" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_2) AppleWebKit/604.4.7 (KHTML, like Gecko) Version/11.0.2 Safari/604.4.7"
200
Код ответа в последней строке указывает, что контейнер обрабатывает запрос успешно.
Шаг 3 — Издание изображения в Частный реестр Docker
Ради этого учебника мы создадим простое изображение, основанное на альпийский
Изображение из докера концентратора.
Перейти на ваш клиент-сервер, запустите следующую команду:
$ docker pull alpine edge: Pulling from library/alpine d95bb1b66adb: Pull complete Digest: sha256:2e8c50cbe65693cdf3e6c3822f23ee3e07a7d92fd891d0a5ed9710aedd05ee19 Status: Downloaded newer image for alpine docker.io/library/alpine $ docker run -it --name test-alpine alpine /bin/sh
Флаг -Питать
Дает вам интерактивную оболочку доступа в контейнер. Через который вы можете создать файл для проверки процесса публикации:
root@dc59bfcd63b3:/# touch file-from-client-server.txt
Выход из контейнера Docker:
root@dc59bfcd63b3:/# exit
При этом вы создали новое изображение, основанное на изображении, уже запущенном плюс изменения, которые вы выполнили. Теперь вы должны совершить изменения:
$ docker commit $(docker ps -lq) your-test-image sha256:83b7ae6c35a534d81ea0ad13fce007c2c6da39dfaf13a35faacdb358d7e12eb6
Вы можете проверить, если вышеуказанная команда работает успешно, введя следующую команду:
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE your-test-image latest 83b7ae6c35a5 7 seconds ago 6MB
Вы успешно создали изображение, но на данный момент он находится только на клиентском сервере. Теперь пришло время подтолкнуть ваше недавно созданное изображение в ваш реестр Private Docker. Вам будет предложено ввести имя пользователя и пароль:
$ docker login https://yourdomainname.com
Всегда хорошая вещь, чтобы добавить теги на ваше изображение, так как он, безусловно, помогает в долгосрочной перспективе и помогает вам определить изображения и толкать метешенное изображение в реестр:
$ docker tag v1 yourdomainname.com/your-test-image $ docker push yourdomainname.com/your-test-image
Ваш выход будет выглядеть похоже на следующее:
The push refers to a repository [yourdomainname.com/test-image] 83b7ae6c35a5: Pushed dec4bff59bf4: Pushed 7363c5bcdbce: Pushed 982d147b635c: Pushed ...
Шаг 4 — Потягивание для личного реестра Docker
Вы уже успешно выдвинули изображение, теперь вы должны вытащить изображение с удаленного сервера на свой клиентский сервер. Если вы хотите, вы также можете проверить его с другой машины.
Итак, теперь вы собираетесь войти в систему с паролем имени пользователя, которое вы создали ранее:
$ docker login https://yourdomainname.com
Потяните изображение из своего личного реестра Докера. Если успешно вы увидите следующий вывод в вашем терминале:
$ docker pull yourdomainname.com/your-test-image v1: Pulling from v2/your-test-image d95bb1b66adb: Pull complete Digest: sha256:2e8c50cbe65693cdf3e6c3822f23ee3e07a7d92fd891d0a5ed9710aedd05ee19 Status: Downloaded newer image for alpine:edge yourdomainname.com/v2/your-test-image:v1
Чтобы подтвердить, что тяга был успешным, вы всегда можете запустить контейнер со следующей командой. Вы можете использовать --rm
Флаг, так что контейнер уничтожит себя, как только вы выйдете с помощью интерактивной оболочки:
$ docker run --rm -it yourdomainname.com/your-test-image /bin/sh
Чтобы проверить изменения, которые вы сделали на ваше изображение, используйте Ls
команда:
$ ls bin dev etc file-from-client-server.txt home lib media mnt opt proc root run sbin srv sys tmp usr var
Вы увидите файл, который мы создали ранее с именем file-from-client-server.txt
Отказ Теперь вы можете подтвердить, что вы настроили безопасный личный реестр Docker, через который кто-либо с учетными данными может нажать и потянуть пользовательские изображения.
Оригинал: «https://dev.to/appfleet/4-easy-steps-to-set-up-a-private-docker-registry-on-ubuntu-4pc»