Уведомление об авторских правах: Эта статья является оригинальной статьей блогера, не должна воспроизводиться без разрешенных блоггеров. Обратите внимание на публичный аккаунтОбмен технологиями (ID: jishuhui_2015)Связаться с автором можно.
〇.Предисловие
Build, Ship and Run any App, Anywhere
В этой статье не будет повторяться больше концепций Docker.Как восходящая звезда на рынке виртуализации, Docker пользуется поддержкой все большего числа предприятий, и все больше и больше разработчиков принимают решение использовать Docker.
«Контейнер» — это философия дизайна Docker. Он упрощает и упрощает для физической машины (или виртуальной машины) запуск нескольких приложений, изолированных друг от друга, в то же время. Конечно, все это благодаря базовому Технология Linux, конечно, также Включая OS X, две операционные системы Windows.
Существует достаточно руководств по Docker, но из-за быстрого развития Docker в последние годы скорость итерации версий высока, и между несколькими версиями все еще есть несовместимости.Если вы найдете статьи в блогах в Интернете, вы, возможно, не сможете для решения проблем, с которыми вы сталкиваетесь.
Конечно, для установки среды Docker, основных команд и т. д. вообще нет проблем, и вы в принципе можете освоить содержание документов официального сайта. Однако, когда я попытался создать набор реестра Docker на основе SSL (метод, рекомендованный официальным сайтом), я столкнулся с большим количеством проблем.В этой части большая часть содержимого документа блога напрямую пропускает ссылку SSL и принимает Форма HTTP-доступа.
Настоящим сообщается, что после прочтения этой статьи сборка Docker Registry больше не является проблемой.
> docker --version
Docker version 18.03.1-ce, build 9ee9f40
Выше приведена моя среда Docker, рекомендуется установить Docker 1.6+ или выше.
Помимо этого, читателям также понадобятся:
1. Хост (или виртуальная машина) с установленной операционной системой CentOS_7_64bit;
2. Подать заявку на доменное имя. В противном случае вы можете изменить файл HOST, но это не гарантирует успеха. Автор подал заявку на получение личного доменного имени на Alibaba Cloud сроком на 5 лет на сумму 105 иен;
3. Если вы подаете заявку на доменное имя, вы, кстати, можете получить бесплатный сертификат CA.Поскольку требуется доступ HTTPS, требуется сертификат SSL.Точно так же есть бесплатное приложение для сертификата на Alibaba Cloud. В противном случае вы можете использовать OpenSSL, чтобы сгенерировать его самостоятельно, что также упоминается во многих сообщениях в блогах и не гарантирует успеха;
4. Установите еще один Nginx в качестве прокси, необязательно.
5. Знакомы с основными понятиями Docker и общими командами, но не должны знать знания высокого порядка, такие как Dockerfile, Compose, Swarm, Kubernetes.
1. Начните с образа Docker
Об абстрактном понятии говорить особо нечего, автор приводит два примера, чтобы все почувствовали:
1. В дополнение к основной операционной системе файл ISO, который мы скачали с System Home, также может иметь несколько встроенных предустановленных программ;
2. При использовании maven для управления зависимостями пакетов jar, чтобы каждый раз не вытягивать пакеты зависимостей из центрального хранилища, в качестве прокси-хранилища используется nexus.
Можно считать, что образ Docker представляет собой комбинацию ряда программного обеспечения (файлов), которые можно использовать «из коробки», пока они размещены на подходящем хосте.
В этой статье требуется пять часто используемых команд для работы с образом Docker:
Какие,вытащить изображение, а затем название зеркального склада.Если вы хотите указать определенную версию, вы можете привести тег.
> docker pull <repo>[:tag]
Нет,перечислить все зеркала, вы можете получить основную информацию о зеркале.
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest bfcb1f6df2db 3 weeks ago 107MB
registry 2 d1fd7d86a825 4 months ago 33.3MB
hyper/docker-registry-web latest 0db5683824d8 19 months ago 599MB
от,удалить зеркало. Его можно удалить по идентификатору зеркала или имени склада-зеркала.
> docker rmi <IMAGE ID>/<repo>
из,зеркальная маркировка. Эту операцию можно сравнить с маркировкой Git, что эквивалентно выпуску доступной зеркальной версии.
> docker tag <repo> <new_repo>[:tag]
Ой,зеркальный толчок. То же самое можно узнать Git, отправляя поле операций, упакованный образ помещается в удаленный репозиторий (например, в реестр Docker).
> docker push <new_repo>[:tag]
Вышеупомянутые пять команд являются лишь кратким введением, а не темой этой статьи. Дополнительные команды работы с зеркалом вы можете проверить самостоятельно.
Прежде чем приступить к следующей операции, сначала извлеките образ реестра.
> docker pull registry:2
2: Pulling from library/registry
81033e7c1d6a: Pull complete
b235084c2315: Pull complete
c692f3a6894b: Pull complete
ba2177f3a70e: Pull complete
a8d793620947: Pull complete
Digest: sha256:672d519d7fd7bbc7a448d17956ebeefe225d5eb27509d8dc5ce67ecb4a0bce54
Status: Downloaded newer image for registry:2
Этот процесс займет несколько минут, в зависимости от условий сети, проявите терпение.
Примечание: когда автор вытягивает, указывается TAG, который должен использовать версию реестра v2.Для версии реестра v1 читателям не нужно заботиться, она в основном исключена.
Во-вторых, краткий обзор
Читатели, которым не терпится увидеть, как работает Docker Registry, могут сначала прочитать этот раздел.
Выполните следующую команду:
> docker run -d \
-p 5000:5000 \
-v /usr/local/registry:/var/lib/registry \
--restart=always \
--name registry \
registry:2
Это типичная команда запуска, если ничего другого, реестр запустится на порту 5000.
Для проверки читатели могут извлечь образ busybox (из-за его небольшого размера) и провести эксперименты.
> docker pull busybox
Получив последний образ busybox, отметьте его и подготовьтесь к публикации в реестре.
> docker tag busybox localhost:5000/bosybox:v1.0
Наконец, отправьте его в реестр.
> docker push localhost:5000/bosybox:v1.0
На данный момент в реестре есть образ busybox:v1.0.В настоящее время вам не нужно заходить в Docker Hub, чтобы получить его, вы можете использовать собственный реестр.
> docker pull localhost:5000/bosybox:v1.0
Если вы хотите увидеть, какие образы находятся в удаленном репозитории, вы можете запустить следующую команду:
> curl http://localhost:5000/v2/_catalog
С помощью приведенной выше команды мы можем сделать важный вывод:
Доступ к реестру осуществляется через серию REST API.
На данный момент мы построили «полуфабрикат» Docker Registry, который называется «полуфабрикат», потому что этот реестр может нормально работать только на этой машине.Если вы попытаетесь запушить образ на другие хосты, результат будет неудачным.
Если вы хотите быть доступным извне, вы должны использоватьсертификат безопасности ЦС.
3. Обновление реестра на основе SSL-сертификата
Прежде чем приступить к изучению этого раздела, читателю предлагается подтвердить, выполняются ли условия, перечисленные в начале статьи.
Автор подал заявку на доменное имя: iwendao.vip и сопоставил доменное имя второго уровня: Registration.iwendao.vip, которое специально используется для доступа к реестру Docker, а затем подал заявку на сертификат CA на основе этого домена второго уровня. название.
Неудивительно, что все бесплатные сертификаты, запрошенные в Alibaba Cloud, выпущены Symantec.После загрузки сертификата в сжатом пакете есть два файла: xxxxxx.pem и xxxxxx.key.
Переименуйте его в server.key, server.pem, загрузите его на хост через ftp-инструмент, предполагая, что каталог, в котором он хранится: /usr/local/certs.
> ll /usr/local/certs
- rw-r--r-- 1 root root 1678 May 28 13:42 server.key
- rw-r--r-- 1 root root 3662 May 28 13:42 server.pem
Поскольку выдан промежуточный сертификат, вы обнаружите, что файла crt нет, вы можете использовать следующую команду, чтобы получить его:
> cat server.pem > server.crt
Содержимое файла pem напрямую вводится как содержимое файла crt, после чего создается файл server.crt.
На данный момент доменное имя и сертификат готовы.
Если вы хотите использовать nginx для создания прокси, вам нужно изменить файл nginx.conf, следующее содержимое конфигурации автора:
user root root;
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
keepalive_timeout 60;
gzip on;
server {
listen 443;
server_name i-wendao;
ssl on;
root html;
index index.html index.htm;
ssl_certificate /usr/local/certs/server.pem;
ssl_certificate_key /usr/local/certs/server.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location ~ {
proxy_pass_header Server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass https://registry;
}
}
upstream registry {
server 127.0.0.1:5000;
}
}
В конфигурационном файле nginx.conf нужно обратить внимание на два места:
1. Чтобы включить ssl nginx, вам нужно только настроить ранее загруженные файлы pem и key.Это официальный пример, предоставленный Alibaba Cloud, который действителен для личного тестирования;
2. Поскольку доступ к реестру осуществляется через REST API и является протоколом доступа HTTPS, в конфигурации узла местоположения proxy_pass настраивается с https://registry.Если он настроен как http://registry , как только Docker После того, как реестр включен с SSL, он недоступен.
Настройка хоста завершена, затем настроен контейнер Docker.
Для развертывания Docker Registry Server чиновник дал два пути:
Во-первых, для случая, когда существует множество параметров, он может быть указан непосредственно в команде Docker Run;
Другой — настроить несколько параметров одновременно с помощью файла конфигурации YAML.
В этом разделе автор будет использовать первый способ развертывания, а второй способ развертывания можно найти во вложении в конце статьи.
> docker run -d \
-p 5000:5000 \
-v /usr/local/registry:/var/lib/registry \
-v /usr/local/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
--restart=always \
--name registry \
registry:2
Если у вас не установлен ридер с nginx, вы можете запустить эту команду:
> docker run -d \
-p 443:443 \
-v /usr/local/registry:/var/lib/registry \
-v /usr/local/certs:/certs \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
--restart=always \
--name registry \
registry:2
Видно, что когда сервер реестра Docker включает SSL, используются два файла сертификата, crt и key.
Далее поэкспериментируем.
> docker tag busybox registry.iwendao.vip/bosybox:v1.0
Наконец, отправьте его в реестр.
> docker push registry.iwendao.vip/bosybox:v1.0
Проверьте, какие зеркала есть в удаленном репозитории.
> curl https://registry.iwendao.vip/v2/_catalog
В другом хосте повторяя вышеуказанные шаги, все еще может добиться успеха, описание было успешно настроено.
В-четвертых, благословение аутентификации
Благодаря построению сервера реестра мы можем ясно почувствовать, что Docker уделяет достаточно внимания контролю безопасности, что является подходящим подходом в контексте HTTPS во всей сети.
Этот раздел представляет собой расширенные знания, цель которых — сделать механизм безопасности Docker более тщательным, а также механизм проверки входа.
Очевидно, поскольку это частный сервер, это означает, что не все могут отправлять изображения, только с логином и паролем.
Разумеется, предпосылкой механизма проверки входа является протокол HTTPS, иначе имя пользователя и пароль будут передаваться открытым текстом.
Существует также множество реализаций механизма аутентификации Docker.Вы можете напрямую использовать прокси-сервер (например, nginx) для перехвата и проверки перед реестром.У некоторых высокопроизводительных есть сервер токенов, который помогает пользователям авторизовать вход в систему, что сложно реализовать .
В этой статье используются самые простыеhtpasswdРеализация механизма проверки входа. Более подробная информация о htpasswd выходит за рамки этой статьи, пожалуйста, обратитесь к ней самостоятельно.
Если этот командный инструмент не установлен на хосте, вы можете запустить следующую команду:
> yum install httpd-tools
Поскольку htpasswd является вспомогательной командой Apache2, если Apache2 установлен, эта команда должна быть доступна.
Если читатель не хочет его устанавливать, он может напрямую использовать зеркало реестра, в которое встроен httpd.
Предполагая, что файл паролей хранится в каталоге /usr/local/auth, выполните следующую команду
> htpasswd -Bbn admin 123456 > /usr/local/auth/passwd
Используйте встроенное зеркало реестра httpd следующим образом:
> docker run --entrypoint htpasswd registry:2 -Bbn admin 123456 > /usr/local/auth/passwd
Оба способа достигают одной и той же цели: сгенерируйте имя пользователя и пароль в файле /usr/local/auth/passwd.
admin в команде — это имя пользователя, а 123456 — пароль.
Просмотрите содержимое файла passwd:
> cat /usr/local/auth/passwd
admin:$2y$05$/2H8DTcY.1JROHm0MnnK8.UulmbSclib63qTe8FGyWnnE9XWBz3cy
Хотя это одна и та же команда, сгенерированные результаты не совпадают на разных хостах. Поэтому файл паролей, сгенерированный на хосте А, нельзя использовать для аутентификации на хосте Б.
Следующим шагом будет запуск контейнера реестра:
> docker run -d \
-p 5000:5000 \
--restart=always \
--name registry \
-v /usr/local/auth:/auth \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM=Registry_Realm \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/passwd \
-v /usr/local/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/server.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/server.key \
registry:2
После успешного запуска, если вы попытаетесь напрямую просмотреть, какие зеркала находятся на удаленном складе, вам будет предложено отменить аутентификацию, как показано ниже:
> curl https://registry.iwendao.vip/v2/_catalog
{
"errors": [{
"code": "UNAUTHORIZED",
"message": "authentication required",
"detail": [{
"Type": "registry",
"Class": "",
"Name": "catalog",
"Action": "*"
}]
}]
}
Он также ограничен операциями PULL и PUSH. Поэтому перед выполнением операций необходимо авторизоваться.
> docker login https://registry.iwendao.vip
Так как есть логин, то конечно же вы вышли из системы.
> docker logout https://registry.iwendao.vip
5. ВЕБ-интерфейс для реестра
Когда мы настраиваем сервер реестра, это означает, что нам нужно начать управлять нашими образами. В настоящее время вы обнаружите, что нет визуального инструмента, помогающего пользователям управлять изображениями.
Уже существует множество инструментов управления WEB UI с открытым исходным кодом:
1,docker-registry-frontend.截止到目前(2018年5月),其功能主要是镜像列表查看,标签查看,还未开放镜像删除功能,在GitHub上开源,stars 1k+。
2,docker-registry-web. По сравнению с проектом docker-registry-frontend этот проект предоставляет функцию удаления образа, а также доступ к системе ролей.Функция была дополнительно улучшена.Это открытый исходный код на GitHub и имеет 300+ звезд.
3.Rancher. Позиционирование этой платформы похоже на Kubernetes, она не только так же проста, как управление образами, но и способна управлять всем контейнером Docker.
4.shipyard. Жаль, что у автора нет сил его поддерживать.По звездам на GitHub нетрудно увидеть его былую славу.
Установка и развертывание в веб-интерфейсе не будут повторяться, есть соответствующий документ. Если нет особых требований к управлению изображениями, можно не использовать WEB UI или использовать один из первых двух.
6. Резюме
В этой статье подробно описывается процесс создания частного сервера Docker Registry, обобщаются учебные материалы из различных блогов и официальных веб-сайтов, а также помощь читателям в создании частного сервера Docker Registry.
Прикрепил:
1. Используйте файл yaml для запуска сервера реестра.
Предположим, что путь хранения файла конфигурации: /usr/local/registry/config.yml
Отредактируйте его содержимое следующим образом:
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
maxthreads: 100
delete:
enabled: true
http:
addr: 0.0.0.0:5000
host: https://registry.iwendao.vip
secret: yoogurt-taxi-123!@#
headers:
X-Content-Type-Options: [nosniff]
tls:
certificate: /certs/214709594090104.crt
key: /certs/214709594090104.key
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
Для получения дополнительных элементов конфигурации вы можете посетитьConfiguring a registry.
Элементы конфигурации в файле конфигурации — это переменные среды, которые могут соответствовать параметру -e в предыдущем разделе.
1. Имя переменной состоит из заглавных букв;
2. Префикс фиксируется РЕГИСТРОМ;
3. Замените двоеточие (:) элемента конфигурации в YAML на подчеркивание (_).
Например:
REGISTRY_HTTP_TLS_CERTIFICATE, соответствующий элементу конфигурации http:tls:certificate;
Registry_auth_htpasswd_path, соответствующий Auth: htpasswd: элемент конфигурации пути.
Стоит отметить, что пути, задействованные в конфигурационном файле, все для контейнера, а это значит, что при запуске образа реестра нужно указать каталог монтирования через параметр -v.
После сохранения файла конфигурации вы можете запустить контейнер:
> docker run -d -p 5000:5000 --restart=always --name registry \
-v /usr/local/certs:/certs
-v /usr/local/registry/config.yml:/etc/docker/registry/config.yml \
registry:2
2. Представьте книги о Docker
- "The First Docker Book (Revised Edition)", заслуженная просветительская книга о Docker. Новички с нулевыми базовыми знаниями могут сосредоточиться на основных частях первых пяти глав, чтобы освоить соответствующие принципы и использовать Docker, который можно использовать в качестве справочника. После прочтения этой книги рекомендуется попрактиковаться с синхронизацией контента.После начала работы вы можете укрепить свой интерес к Docker, чтобы продолжить обучение.
- «Контейнер Docker и облако контейнеров (2-е издание)», содержание знаний было расширено. Первая часть контента — это базовые знания, вы сможете быстро ее пройти. В этой книге неоднократно объяснялась концепция контейнерного облака в различных аспектах, что очень увлекательно и может быть усвоено. Далее идет содержание оркестровки и развертывания контейнеров, которые можно практиковать для развития чувств.
- Полное руководство по Kubernetes (2-е издание), заслуженная вводная книга по Kubernetes. После прочтения Kubernetes-части Docker Containers and Container Cloud (2-е издание) будет легче снова прочитать эту книгу.