Это 29-й день моего участия в Gengwen Challenge.Подробности о мероприятии:Обновить вызов
задний фон
В этой статье сущность образа от файловой системы до внутренней структуры была исследована на соответствующих библиотеках разработки, и было проведено техническое предварительное исследование для более поздних связанных настраиваемых операций.
Два зеркала природы
1.1 Базовое изображение
Двухслойное значение базового образа
- Сборка с нуля без зависимости от других образов.
- Другие изображения могут быть расширены на его основе.
Поэтому то, что можно назвать базовыми образами, обычно является образами Docker различных дистрибутивов Linux, таких как Ubuntu, Debian, CentOS и т. д.docker pull centos
Получите образ CentOS.
- Пространство ядра — это ядро, и файловая система bootfs будет загружена при запуске Linux, а затем bootfs будет выгружена.
- Файловая система пользовательского пространства — rootfs, которая содержит знакомые каталоги, такие как /dev, /proc, /bin и т. д.
Для базового образа Docker нижний уровень напрямую использует ядро хоста, и вам нужно только предоставить rootfs.
Для урезанной ОС rootfs может быть небольшим и включать только самые основные команды, инструменты и библиотеки.
Итак, базовый образ предоставляет минимально установленный дистрибутив Linux.
1.2 Разные зеркала
Разница между разными Base образами в том, что они поддерживают работу с разными ОС Linux, то есть rootfs разные.Например, Ubuntu 14.04 использует upstart для управления службами и apt для управления пакетами, тогда как CentOS 7 использует systemd и yum. Это все различия в пользовательском пространстве, ядро линукса не сильно отличается
Таким образом, Docker может поддерживать несколько образов Linux одновременно, имитируя среду нескольких операционных систем. Debian и BusyBox (встроенный Linux) предоставляют свои собственные rootfs вверху и совместно используют ядро Docker Host внизу.
Посмотреть информацию о зеркале
mkdir /registry
docker run -p 5000:5000 --restart=always --name registry -v /registry/:/var/lib/registry -d registry
[root@img-tools registry]# docker pull centos:latest
[root@img-tools registry]# docker tag centos:latest 127.0.0.1:5000/mycentos:latest
[root@img-tools registry]# docker push 127.0.0.1:5000/mycentos:latest
The push refers to repository [127.0.0.1:5000/mycentos]
2653d992f4ef: Pushed
latest: digest: sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875 size: 529
[root@img-tools registry]# curl -X GET http://127.0.0.1:5000/v2/_catalog -k
{"repositories":["mycentos"]}
// 查看获取到镜像的Digest
[root@img-tools harbor]# curl -I -H "Accept: application/vnd.docker.distribution.manifest.v2+json" localhost:5000/v2/mycentos/manifests/latest
HTTP/1.1 200 OK
Content-Length: 529
Content-Type: application/vnd.docker.distribution.manifest.v2+json
Docker-Content-Digest: sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
Docker-Distribution-Api-Version: registry/2.0
Etag: "sha256:dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875"
X-Content-Type-Options: nosniff
Date: Fri, 11 Jun 2021 09:15:55 GMT
// 查看宿主机信息
[root@img-tools ~]# tree /registry/docker/
/registry/docker/
└── registry
└── v2
├── blobs
│ └── sha256
│ ├── 30
│ │ └── 300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55
│ │ └── data
│ ├── 7a
│ │ └── 7a0437f04f83f084b7ed68ad9c4a4947e12fc4e1b006b38129bac89114ec3621
│ │ └── data
│ └── db
│ └── dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
│ └── data
└── repositories
└── mycentos
├── _layers
│ └── sha256
│ ├── 300e315adb2f96afe5f0b2780b87f28ae95231fe3bdd1e16b9ba606307728f55
│ │ └── link
│ └── 7a0437f04f83f084b7ed68ad9c4a4947e12fc4e1b006b38129bac89114ec3621
│ └── link
├── _manifests
│ ├── revisions
│ │ └── sha256
│ │ └── dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
│ │ └── link
│ └── tags
│ └── latest
│ ├── current
│ │ └── link
│ └── index
│ └── sha256
│ └── dbbacecc49b088458781c16f3775f2a2ec7521079034a7ba499c8b0bb7f86875
│ └── link
└── _uploads
27 directories, 8 files
Уникальность трех зеркальных изображений
- Возможности зеркального репозитория
Для зеркального хранилища его основные функции в основном состоят из двух частей: распространение и хранение изображений.
* 镜像分发:并对外提供一套,[HTTP API V2](https://docs.docker.com/registry/spec/api/)
* 镜像存储:镜像仓库中的所有镜像,都是以数据块 (Blob) 的方式存储在文件系统中。[文件系统](https://docs.docker.com/registry/storage-drivers/#provided-drivers)
Благодаря тесту мы теперь знаем вывод.
* 通过 Registry API 获得的两个镜像仓库中相同镜像的 manifest 信息完全相同。
* 两个镜像仓库中相同镜像的 manifest 信息的存储路径和内容完全相同。
* 两个镜像仓库中相同镜像的 blob 信息的存储路径和内容完全相同。
- Зеркало состоит из двух частей:
- JSON-манифест
- Большие двоичные объекты состоят из каскадных файлов.
- процесс вытягивания зеркала
- Процесс вытягивания зеркала — это процесс извлечения этих двух компонентов. Первый шаг в извлечении зеркала — получение манифеста.
- После получения манифеста клиенту необходимо проверить подпись, чтобы убедиться, что имя и fsLayers действительны. После подтверждения клиент может использовать дайджест для загрузки каждого слоя файловой системы. В API версии 2 слои хранятся в больших двоичных объектах, обработанных как ключевые значения.
- Конкретный процесс
- Сначала извлеките манифест изображения (вытягивание манифеста изображения)
$ HEAD /v2/<image/manifests/<reference>#检查镜像清单是否存在
$ GET /v2/<image>/manifests/<reference>#拉取镜像清单
* 开始拉取每个层(pulling a Layer)
$ GET /v2/<image>/blobs/<digest>
дайджест — это уникальный идентификатор каждого слоя зеркала fsLayer. Существует в fsLayers манифеста.
Четыре связанных API
метод метод | Путь пути | Сущность | Описание |
---|---|---|---|
ПОЛУЧИТЬ получить | /v2/ | База | Убедитесь, что конечная точка реализует Docker Registry API V2. |
ПОЛУЧИТЬ получить | /v2//tags/list | Теги теги | Получить теги в репозитории, указанном в поле Получить имя тега в репозитории. |
ПОЛУЧИТЬ получить | /v2//manifests/ | Список грузов | Получить манифест, идентифицированный с помощью выборки по имени и ссылке, где ссылка может быть тегом или дайджестом. A может быть тегом или дайджестом HEADrequest также может быть отправлен на эту конечную точку для получения информации о ресурсе без получения всех данных. Также можно сделать запрос на эту конечную точку, чтобы получить информацию о ресурсах, не получая все данные |
размещение PUT | /v2//manifests/ | Список грузов | Поместите манифест, идентифицированный путем идентификации манифеста как имени и ссылки, где ссылка может быть тегом или дайджестом.Это может быть тег или дайджест. |
УДАЛИТЬ удалить | /v2//manifests/ | Список грузов | Удалить манифест, идентифицированный по имени и ссылке. Обратите внимание, что манифест может. Обратите внимание, что манифест может бытьтолько толькобыть удалены удаленным дайджестом. |
ПОЛУЧИТЬ получить | /v2//blobs/ | капля | Получите большой двоичный объект из реестра, указанный blobdigest.A . Для этой конечной точки также может быть отправлен запрос HEADrequest для получения информации о ресурсах без получения всех данных. |
УДАЛИТЬ удалить | /v2//blobs/ | капля | Удалить большой двоичный объект, идентифицированный с помощью удаления по имени и дайджесту |
ПОСТ Сообщение | /v2//blobs/uploads/ | Инициировать отправку BLOB-объектов Инициировать отправку BLOB-объектов | Инициировать возобновляемую загрузку BLOB-объектов. В случае успеха будет предоставлено место загрузки для завершения загрузки. При необходимости, если установлен параметр Инициировать возобновляемую загрузку BLOB-объектов. В случае успеха будет предоставлено место загрузки для завершения загрузки. |
ПОЛУЧИТЬ получить | /v2//blobs/uploads/ | Загрузка BLOB-объектов | Получить статус загрузки, идентифицированный Получить идентифицированный UUID статуса загрузки. Основная цель этой конечной точки — разрешить текущий статус возобновляемой загрузки. Основная цель этой конечной точки — определить текущее состояние возобновляемых загрузок. |
ПЛАСТЫРЬ | /v2//blobs/uploads/ | Загрузка BLOB-объектов | Загрузить блок данных для указанной загрузки. |
размещение PUT | /v2//blobs/uploads/ | Загрузка BLOB-объектов | Завершите загрузку, указанную uuid, при необходимости добавив тело в качестве финального фрагмента, при необходимости добавив тело в качестве финального фрагмента. |
УДАЛИТЬ удалить | /v2//blobs/uploads/ | Загрузка BLOB-объектов | Отмените незавершенные процессы загрузки, освободив связанные ресурсы. Если это не будет вызвано, незавершенные загрузки в конечном итоге прекратятся по тайм-ауту. Отмените незавершенные процессы загрузки, освободив связанные ресурсы. Если не вызвать, незавершенные загрузки в конечном итоге истекут по тайм-ауту. |
ПОЛУЧИТЬ получить | /v2/_catalog | Каталог | Получить отсортированный список репозиториев в формате json, доступных в реестре. |
5 других
- основная библиотека зависимостей
github.com/containers/image/v5/image
github.com/containers/image/v5/docker
Зная нижний уровень образа, вы можете использовать базовую библиотеку для выполнения настраиваемых операций над образом в соответствии с конкретными потребностями бизнеса.