Дело об образах контейнеров

задняя часть контейнер
Дело об образах контейнеров

Это 29-й день моего участия в Gengwen Challenge.Подробности о мероприятии:Обновить вызов

задний фон

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

Два зеркала природы

1.1 Базовое изображение

Двухслойное значение базового образа

image.png

  • Сборка с нуля без зависимости от других образов.
  • Другие изображения могут быть расширены на его основе.

Поэтому то, что можно назвать базовыми образами, обычно является образами 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

Зная нижний уровень образа, вы можете использовать базовую библиотеку для выполнения настраиваемых операций над образом в соответствии с конкретными потребностями бизнеса.

Ссылка на ссылку