Как настроить личный реестр Docker в Ubuntu 18.04

_ Автор выбрал Apache Software Foundation, чтобы получить пожертвование в рамках Write for DOnations program._

Вступление

Docker Registry - это приложение, которое управляет хранением и доставкой изображений контейнера Docker. Реестры централизуют образы контейнеров и сокращают время сборки для разработчиков. Образы Docker гарантируют ту же среду выполнения посредством виртуализации, но создание образа может потребовать значительных временных затрат. Например, вместо того, чтобы устанавливать зависимости и пакеты отдельно для использования Docker, разработчики могут загрузить сжатый образ из реестра, который содержит все необходимые компоненты. Кроме того, разработчики могут автоматизировать отправку изображений в реестр с помощью инструментов непрерывной интеграции, таких как TravisCI, чтобы беспрепятственно обновлять изображения в процессе производства и разработки.

Docker также имеет бесплатный общедоступный реестр Docker Hub, на котором можно размещать ваши собственные образы Docker, но есть ситуации, когда вы не хотите, чтобы ваше изображение было общедоступным. Изображения обычно содержат весь код, необходимый для запуска приложения, поэтому использование частного реестра предпочтительнее при использовании проприетарного программного обеспечения.

В этом руководстве вы создадите и защитите свой собственный реестр Docker. Вы будете использовать Docker Compose, чтобы определить конфигурации для запуска ваших приложений Docker и Nginx для пересылки трафика сервера с HTTPS в работающий контейнер Docker. После того, как вы закончите этот урок, вы сможете перенести пользовательский образ Docker в свой личный реестр и безопасно извлечь образ с удаленного сервера.

Предпосылки

Прежде чем начать это руководство, вам потребуется следующее:

  • Два сервера Ubuntu 18.04, настроенные по следующему адресу https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04, - руководство по первоначальной настройке сервера Ubuntu 18.04], включая sudo пользователь root и брандмауэр. Один сервер будет содержать ваш личный реестр Docker, а другой будет вашим * клиентом * сервером.

  • Docker и Docker-Compose установлены на обоих серверах, следуя инструкциям https://www.digitalocean.com/community/tutorials/how-to-install-docker-compose-on-ubuntu-18-04Как установить Docker-Compose на Ubuntu 18.04] учебник. Вам нужно только выполнить первый шаг этого руководства, чтобы установить Docker Compose. В этом руководстве объясняется, как установить Docker как часть его предварительных требований.

  • Nginx установлен на вашем частном сервере реестра Docker, следуя указаниям https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04 как установить Nginx в Ubuntu 18.04].

  • Nginx защищен с помощью Let’s Encrypt на вашем сервере для частного реестра Docker, следуя https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu- 18-04 [Как обезопасить Nginx с помощью Let’s Encrypt]. Обязательно перенаправьте весь трафик с HTTP на HTTPS на шаге 4.

  • Доменное имя, которое разрешается на сервер, который вы используете для частного реестра Docker. Вы установите это как обязательное условие Let’s Encrypt.

Шаг 1 - Установка и настройка реестра Docker

Инструмент командной строки Docker полезен для запуска и управления одним или двумя контейнерами Docker, но для полного развертывания большинству приложений, выполняющихся внутри контейнеров Docker, требуется, чтобы другие компоненты работали параллельно. Например, многие веб-приложения состоят из веб-сервера, такого как Nginx, который обслуживает код приложения, интерпретируемого языка сценариев, такого как PHP, и сервера базы данных, такого как MySQL.

С помощью Docker Compose вы можете написать один файл + .yml +, чтобы настроить конфигурацию каждого контейнера и информацию, которую контейнеры должны обмениваться друг с другом. Затем вы можете использовать инструмент командной строки + docker-compose + для выдачи команд всем компонентам, составляющим ваше приложение.

Docker Registry сам по себе является приложением с несколькими компонентами, поэтому вы будете использовать Docker Compose для управления своей конфигурацией. Чтобы запустить экземпляр реестра, вы должны настроить файл + docker-compose.yml +, чтобы определить место, где ваш реестр будет хранить свои данные.

На сервере, который вы создали для размещения вашего личного реестра Docker, вы можете создать каталог + docker-registry +, перейти в него, а затем создать подпапку + data + со следующими командами:

mkdir ~/docker-registry && cd $_
mkdir data

Используйте ваш текстовый редактор для создания файла конфигурации + docker-compose.yml +:

nano docker-compose.yml

Добавьте в файл следующее содержимое, описывающее базовую конфигурацию реестра Docker:

докер-compose.yml

version: '3'

services:
 registry:
   image: registry:2
   ports:
   - "5000:5000"
   environment:
     REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
   volumes:
     - ./data:/data

Секция + environment + устанавливает переменную окружения в контейнере Docker Registry с путем + / data +. Приложение реестра Docker проверяет эту переменную среды при запуске и в результате начинает сохранять свои данные в папку + / data +.

Однако, поскольку вы включили строку + volume: - ./data: / data +, Docker начнет сопоставлять каталог + / data + в этом контейнере с + / data + на вашем сервере реестра. В результате все данные реестра Docker хранятся в + ~ / docker-registry / data + на сервере реестра.

Раздел + ports + с конфигурацией 5000: 5000 сообщает Docker о том, чтобы сопоставить порт + 5000 + на сервере с портом + 5000 + в работающем контейнере. Это позволяет отправлять запрос на порт + 5000 + на сервере и отправлять запрос в приложение реестра.

Теперь вы можете запустить Docker Compose, чтобы проверить настройки:

docker-compose up

В выводе вы увидите полосы загрузки, которые показывают, как Docker загружает образ реестра Docker из собственного реестра Docker. Через минуту или две вы увидите вывод, похожий на следующий (версии могут отличаться):

Output of docker-compose upStarting docker-registry_registry_1 ... done
Attaching to docker-registry_registry_1
registry_1  | time="2018-11-06T18:43:09Z" level=warning msg="No HTTP secret provided - generated random secret. This may cause problems with uploads if multiple registries are behind a load-balancer. To provide a shared secret, fill in http.secret in the configuration file or set the REGISTRY_HTTP_SECRET environment variable." go.version=go1.7.6 instance.id=c63483ee-7ad5-4205-9e28-3e809c843d42 version=v2.6.2
registry_1  | time="2018-11-06T18:43:09Z" level=info msg="redis not configured" go.version=go1.7.6 instance.id=c63483ee-7ad5-4205-9e28-3e809c843d42 version=v2.6.2
registry_1  | time="2018-11-06T18:43:09Z" level=info msg="Starting upload purge in 20m0s" go.version=go1.7.6 instance.id=c63483ee-7ad5-4205-9e28-3e809c843d42 version=v2.6.2
registry_1  | time="2018-11-06T18:43:09Z" level=info msg="using inmemory blob descriptor cache" go.version=go1.7.6 instance.id=c63483ee-7ad5-4205-9e28-3e809c843d42 version=v2.6.2
registry_1  | time="2018-11-06T18:43:09Z" level=info msg="listening on [::]:5000" go.version=go1.7.6 instance.id=c63483ee-7ad5-4205-9e28-3e809c843d42 version=v2.6.2

В этом руководстве мы рассмотрим предупреждающее сообщение «+ Нет HTTP-секрета предоставлено » позже. Вывод показывает, что контейнер запускается. Последняя строка вывода показывает, что он успешно начал прослушивать порт ` 5000 +`.

По умолчанию Docker Compose будет ждать вашего ввода, поэтому нажмите + CTRL + C +, чтобы закрыть контейнер реестра Docker.

Вы настроили полное прослушивание реестра Docker на порт + 5000 +. На этом этапе реестр не запустится, если вы не запустите его вручную. Кроме того, Docker Registry не имеет встроенного механизма аутентификации, поэтому в настоящее время он небезопасен и полностью открыт для общественности. На следующих этапах вы решите эти проблемы безопасности.

Шаг 2 - Настройка переадресации портов Nginx

У вас уже настроен HTTPS на вашем сервере Docker Registry с Nginx, что означает, что теперь вы можете настроить переадресацию портов с Nginx на порт + 5000 +. Выполнив этот шаг, вы можете получить доступ к своему реестру напрямую по адресу

В рамках How для защиты Nginx с помощью Let’s Encrypt Для этого вы уже настроили файл + / etc / nginx / sites-available / +, содержащий конфигурацию вашего сервера.

Откройте этот файл в текстовом редакторе:

sudo nano /etc/nginx/sites-available/

Найти существующую строку + location +. Это будет выглядеть так:

/etc/nginx/sites-available/example.com

...
location / {
 ...
}
...

Вам нужно перенаправить трафик на порт + 5000 +, где будет работать ваш реестр. Вы также хотите добавить заголовки к запросу в реестр, которые предоставляют дополнительную информацию с сервера при каждом запросе и ответе. Удалите содержимое раздела + location + и добавьте следующее содержимое в этот раздел:

/etc/nginx/sites-available/example.com

...
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://localhost:5000;
   proxy_set_header  Host              $http_host;   # required for docker client's sake
   proxy_set_header  X-Real-IP         $remote_addr; # pass on real client's IP
   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 + проверяет, что версия клиента Docker выше + 1.5 +, и гарантирует, что + UserAgent + не является приложением + Go +. Поскольку вы используете версию + 2.0 + реестра, более старые клиенты не поддерживаются. Для получения дополнительной информации вы можете найти конфигурацию заголовка + nginx + в Docker’s Guide Nginx Registry.

Сохраните и выйдите из файла. Примените изменения, перезапустив Nginx:

sudo service nginx restart

Вы можете подтвердить, что Nginx перенаправляет трафик на порт + 5000 +, запустив реестр:

cd ~/docker-registry
docker-compose up

В окне браузера откройте следующий URL:

https:///v2

Вы увидите пустой объект JSON или:

{}

В вашем терминале вы увидите вывод, подобный следующему:

Output of docker-compose upregistry_1  | time="2018-11-07T17:57:42Z" 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.18.0.1 - - [07/Nov/2018:17:57:42 +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"

Из последней строки вы можете видеть, что запрос + GET + был сделан для + / v2 / +, который является конечной точкой, к которой вы отправили запрос из вашего браузера. Контейнер получил ваш запрос от переадресации порта и возвратил ответ + {} +. Код + 200 + в последней строке вывода означает, что контейнер успешно обработал запрос.

Теперь, когда вы настроили переадресацию портов, вы можете перейти к повышению безопасности вашего реестра.

Шаг 3 - Настройка аутентификации

Правильно используя запросы прокси-серверов Nginx, вы теперь можете защитить свой реестр с помощью HTTP-аутентификации, чтобы определить, кто имеет доступ к вашему реестру Docker. Для этого вы создадите файл аутентификации с помощью + htpasswd + и добавите в него пользователей. HTTP-аутентификация быстро устанавливается и защищается через HTTPS-соединение, что и используется реестром.

Вы можете установить пакет + htpasswd +, выполнив следующее:

sudo apt install apache2-utils

Теперь вы создадите каталог, в котором вы будете хранить наши учетные данные для аутентификации, и перейдете в этот каталог. + $ _ + расширяется до последнего аргумента предыдущей команды, в этом случае + ~ / docker-registry / auth +:

mkdir ~/docker-registry/auth && cd $_

Затем вы создадите первого пользователя следующим образом, заменив ++ на имя пользователя, которое вы хотите использовать. Флаг + -B + определяет шифрование + bcrypt +, которое является более безопасным, чем шифрование по умолчанию. Введите пароль при появлении запроса:

htpasswd -Bc registry.password

Затем вы отредактируете файл + docker-compose.yml +, чтобы Docker использовал созданный вами файл для аутентификации пользователей.

cd ~/docker-registry
nano docker-compose.yml

Вы можете добавить переменные окружения и том для созданного вами каталога + auth / +, отредактировав файл + docker-compose.yml +, чтобы сообщить Docker, как вы хотите аутентифицировать пользователей. Добавьте следующий выделенный контент в файл:

докер-compose.yml

version: '3'

services:
 registry:
   image: registry:2
   ports:
   - "5000:5000"
   environment:



     REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
   volumes:

     - ./data:/data

Для + REGISTRY_AUTH + вы указали + htpasswd +, который вы используете в качестве схемы аутентификации, и задали для + REGISTRY_AUTH_HTPASSWD_PATH + путь к файлу аутентификации. Наконец, + REGISTRY_AUTH_HTPASSWD_REALM + обозначает имя области + htpasswd +.

Теперь вы можете проверить правильность своей аутентификации, запустив реестр и убедившись, что он запрашивает у пользователя имя пользователя и пароль.

docker-compose up

В окне браузера откройте + https: /// v2 +.

После ввода ++ и соответствующего пароля вы снова увидите + {} +. Вы подтвердили базовую настройку аутентификации: реестр вернул результат только после того, как вы ввели правильное имя пользователя и пароль. Теперь вы защитили свой реестр и можете продолжать пользоваться реестром.

Шаг 4 - Запуск Docker Registry как службы

Вы хотите, чтобы ваш реестр запускался при каждой загрузке системы. В случае непредвиденных сбоев системы необходимо убедиться, что реестр перезагружается при перезагрузке сервера. Откройте + docker-compose.yml:

nano docker-compose.yml

Добавьте следующую строку содержимого в + registry: +:

докер-compose.yml

...
 registry:

...

Вы можете запустить свой реестр как фоновый процесс, который позволит вам выйти из сеанса + ssh + и продолжить процесс:

docker-compose up -d

Теперь, когда ваш реестр работает в фоновом режиме, вы можете подготовить Nginx к загрузке файлов.

Шаг 5 - Увеличение размера файла для загрузки Nginx

Прежде чем вы сможете отправить изображение в реестр, вы должны убедиться, что ваш реестр сможет обрабатывать загрузки больших файлов. Хотя Docker разделяет загрузку больших изображений на отдельные слои, иногда они могут превышать + 1GB +. По умолчанию Nginx имеет ограничение «+ 1 МБ » при загрузке файлов, поэтому вам нужно отредактировать файл конфигурации для « nginx » и установить максимальный размер загрузки файла « 2 ГБ +».

sudo nano /etc/nginx/nginx.conf

Найдите раздел + http + и добавьте следующую строку:

/etc/nginx/nginx.conf

...
http {

       ...
}
...

Наконец, перезапустите Nginx, чтобы применить изменения конфигурации:

sudo service nginx restart

Теперь вы можете загружать большие изображения в реестр Docker без ошибок Nginx.

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

Теперь вы готовы опубликовать изображение в своем личном реестре Docker, но сначала вам нужно создать изображение. Для этого урока вы создадите простое изображение на основе изображения + ubuntu из Docker Hub. Docker Hub - это общедоступный реестр, содержащий множество предварительно настроенных образов, которые можно использовать для быстрой Dockerize-приложений. Используя образ + ubuntu, вы протестируете push и pull в ваш реестр.

На вашем * клиентском * сервере создайте небольшое пустое изображение для отправки в ваш новый реестр, флаги + -i + и + -t + предоставляют вам интерактивный доступ оболочки в контейнер:

docker run -t -i ubuntu /bin/bash

После завершения загрузки вы увидите приглашение Docker, обратите внимание, что идентификатор вашего контейнера после + root @ + будет меняться. Сделайте быстрое изменение в файловой системе, создав файл с именем + SUCCESS +. На следующем шаге вы сможете использовать этот файл, чтобы определить, успешен ли процесс публикации:

touch /SUCCESS

Выход из контейнера Docker:

exit

Следующая команда создает новый образ с именем + test-image + на основе уже запущенного образа плюс любые внесенные вами изменения. В нашем случае добавление файла + / SUCCESS + включено в новый образ.

Зафиксируйте изменения:

docker commit $(docker ps -lq) test-image

На данный момент изображение существует только локально. Теперь вы можете перенести его в новый реестр, который вы создали. Войдите в свой реестр Docker:

docker login https://

Введите ++ и соответствующий пароль ранее. Далее вы пометите изображение местоположением частного реестра, чтобы перейти к нему:

docker tag test-image /test-image

Вставьте недавно помеченное изображение в реестр:

docker push /test-image

Ваш вывод будет выглядеть примерно так:

OutputThe push refers to a repository [/test-image]
e3fbbfb44187: Pushed
5f70bf18a086: Pushed
a3b5c80a4eba: Pushed
7f18b442972b: Pushed
3ce512daaf78: Pushed
7aae4540b42d: Pushed
...

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

Шаг 7 - Извлечение из вашего личного реестра Docker

Вернитесь на сервер реестра, чтобы вы могли проверить получение изображения с вашего * клиента * сервера. Также возможно проверить это с третьего сервера.

Войдите с именем пользователя и паролем, которые вы установили ранее:

docker login https://

Теперь вы готовы вытащить изображение. Используйте доменное имя и имя изображения, которое вы отметили на предыдущем шаге:

docker pull /test-image

Docker загрузит изображение и вернет вас к приглашению. Если вы запустите образ на сервере реестра, вы увидите файл + SUCCESS +, который вы создали ранее:

docker run -it /test-image /bin/bash

Перечислите ваши файлы внутри оболочки bash:

ls

Вы увидите файл + SUCCESS +, который вы создали для этого изображения:

SUCCESS  bin  boot  dev  etc  home  lib  lib64  media   mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

Вы завершили настройку безопасного реестра, в который пользователи могут загружать и извлекать пользовательские изображения.

Заключение

В этом руководстве вы создали собственный личный реестр Docker и опубликовали образ Docker. Как упомянуто во введении, вы также можете использовать TravisCI или аналогичный инструмент CI для автоматической отправки непосредственно в частный реестр. Используя Docker и реестры в своем рабочем процессе, вы можете гарантировать, что образ, содержащий код, будет вести себя одинаково на любом компьютере, будь то на производстве или в разработке. Дополнительную информацию о написании файлов Docker вы можете прочитать в этом Docker tutorial объяснении процесса.

Related