🐳 Как собирать образа контейнеров OCI и Docker с помощью Buildah

by itisgood

Введение

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

Сначала давайте разберемся, что такое OCI, Buildah и Docker.

Open Container Initiative (OCI)

Итак, ссылка на Официальный сайт OCI, Инициатива Открытых Контейнеров (OCI), запущенная 22 июня 2015 года Docker, CoreOS и другими партнерами, является легковесным проектом, целью которого является создание открытых отраслевых стандартов для форматов контейнеров и времени выполнения.

В настоящее время OCI содержит две спецификации: спецификацию времени выполнения (runtime-spec) и спецификацию образов (image-spec).

Спецификация времени выполнения описывает, как запустить «пакет файловой системы», который распакован на диске.

«Пакет файловой системы» – это набор файлов, организованных определенным образом и содержащих все необходимые данные и метаданные для любой совместимой среды выполнения (например, Docker и CRI-O) для выполнения всех стандартных операций с ним.

На высоком уровне реализация OCI будет загружать образ OCI, а затем распаковывать этот образ в комплект файловой системы OCI Runtime.

На этом этапе OCI Runtime Bundle будет запускаться OCI Runtime (например, Docker и CRI-O).

Теперь переходим к Buildah.

Buildah

Buildah – это инструмент командной строки, который можно использовать для создания образов, совместимых с Open Container Initiative (OCI).

Его можно использовать с Docker, Podman, Kubernetes или любым вашим любимым контейнерным инструментом.

Команды Buildah похожи на все команды, которые вы можете найти в Dockerfile.

Цель Buildah также заключается в предоставлении низкоуровневого интерфейса coreutils для создания образов контейнеров, позволяющего людям создавать контейнеры без использования Dockerfile.

Самый эффективный способ использования Buildah – это написание скриптов Bash для создания ваших образов, аналогично тому, как вы бы писали Dockerfile без использования демона.

Говоря простым языком, OCI устанавливает правила построения образов и то, как среды выполнения должны их потреблять, в то время как Buildah использует эти правила и использует их для создания образов контейнеров.

Что же такое Docker?

Docker

До версии 1.11 Docker реализация была монолитным демоном.

Монолит выполнял все как один пакет, например загружал образы контейнеров, запускал процессы контейнеров, представлял удаленный API и выступал в качестве демона сбора журналов, и все это в централизованном процессе, работающем от имени пользователя root (Source coreos).

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

Примером является то, что он не следует передовым методикам разделения процессов и привилегий в Unix.

Более того, монолитная реализация затрудняет правильную интеграцию Docker с системами инициализации Linux, такими как upstart и systemd https://coreos.com/rkt/docs/latest/rkt-vs-other-projects.html#rkt-vs-docker.

Это привело к разделению Docker на разные части, как показано в открывшемся ниже абзаце после запуска Docker 1.11.


«Мы рады представить Docker Engine 1.11, нашу первую версию, основанную на runC ™ и containerd ™. В этом выпуске Docker первым выпустил среду выполнения, основанную на технологии OCI, демонстрируя прогресс, достигнутый командой после нашего стандартного формата контейнера и среды выполнения под Linux Foundation в июне 2015 года. Source Docker ».

По их словам (Docker), разделение Docker на специализированные независимые инструменты означает более целенаправленную поддержку и, в конечном итоге, более качественное программное обеспечение.

С тех пор containerd теперь обрабатывает выполнение контейнеров, которое ранее выполнял сам демон docker.

Пользователь запускает команды из docker-cli.

Docker-cli разговаривает с демоном Docker.

Демон Docker (dockerd) прослушивает запросы и управляет жизненным циклом контейнера через containerd, с которым он связывается. containerd принимает запрос и запускает контейнер через runC и выполняет все жизненные циклы контейнера в хосте.

Вкратце, runc – это инструмент CLI для порождения и запуска контейнеров в соответствии со спецификацией OCI.

Установка Buildah

Запустите команду, показанную ниже на вашем CentOS 8, чтобы установить Buildah.

Мы установим Podman рядом, чтобы использовать его для запуска нашего образа с нуля.

sudo dnf update
sudo dnf -y install buildah podman

Проверьте, был ли он успешно установлен

$ rpm -q buildah
buildah-1.11.6-4.module_el8.1.0+272+3e64ee36.x86_64

Создание образа OCI с нуля с помощью Buildah

Здесь мы собираемся создать образ из небольшого количества метаданных контейнера, а затем добавить все, что нужно для запуска простого веб-сервера Apache.

Делая это, вы можете построить свой контейнер образа блок за блоком.

Как было объяснено ранее, мы используем команду buildah scratch для достижения этой цели.

Чтобы избежать проблем, мы будем использовать учетную запись «root».

brandnewcontainer=$(buildah from scratch)
$ buildah containers

CONTAINER ID  BUILDER  IMAGE ID     IMAGE NAME                       CONTAINER NAME   
e6c2f7b0b567     *                  scratch                          working-container

-- Можно также через podman
$  podman images
Приведенная выше команда создает пустой контейнер (без образа).
Установите пустой контейнер следующим образом:
scratchmnt=$(buildah mount $brandnewcontainer)
echo $scratchmnt

/var/lib/containers/storage/overlay/40e7215211b47e8de47991d0dc7be07e

Команда Buildah mount позволяет вам монтировать корневую файловую систему контейнера, которая дает вам доступ к ней с хоста.

Затем установите пакеты в исходный образ:

yum -y group install "Minimal Install" --releasever=8 --installroot=$scratchmnt
После того, как пакеты были установлены, теперь мы можем размонтировать образ и запустить его как независимый контейнер, поскольку в нем есть все необходимое для независимости.
$ buildah umount $brandnewcontainer
e6c2f7b0b5679133ad6e0ad6bd74164dac7f357f0076cf6cc819f9ed664236d5
Чтобы запустить образ как контйнер, введите приведенную ниже команду, и вы сможете приземлиться прямо в объятия вашего нового контейнера, который вы создали с нуля.
Вы можете установить другие приложения:
$ buildah run $brandnewcontainer bash
[root@e6c2f7b0b567 /]# ls 
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
Как видно из приведенного выше, все каталоги доступны, как и следовало ожидать в стандартном контейнере.
Мы можем установить Apache, чтобы проверить, все ли работает нормально.
[root@e6c2f7b0b567 /]# yum install httpd -y

Добавьте простую HTML-страницу в корневой каталог документов Apache по умолчанию и выйдите из контейнера.

[root@e6c2f7b0b567 /]# echo "Testing Apache." > /var/www/html/index.html
[root@e6c2f7b0b567 /]# exit

Возвращаясь к нашей хост-системе, вместо запуска httpd в качестве службы инициализации установите несколько параметров конфигурации buildah для запуска демона httpd непосредственно из контейнера:

$ buildah config --cmd "/usr/sbin/httpd -DFOREGROUND" working-container
$ buildah config --port 80/tcp working-container
$ buildah commit working-container localhost/firstapache:latest

Getting image source signatures
Copying blob b34ab2705c68 done
Copying config a0c546bc39 done
Writing manifest to image destination
Storing signatures
a0c546bc39271565946d11a843979e017aae73e2b792cc5d9ca589661f427543

После того, как buildah завершил фиксацию образа, давайте теперь используем Podman, чтобы запустить его следующим образом.

Сначала проверьте все образа, доступные в системе, и узнайте, какие из них нам интересны.

$ podman images

REPOSITORY              TAG      IMAGE ID       CREATED         SIZE   
localhost/firstapache   latest   a0c546bc3927   8 minutes ago   1.68 GB

Теперь запустите образ:

$ podman run -p 8080:80 -d --name apache-server a0c546bc3927
b1d29603542c8f91a289127cee4fa9157962f8fcdda9baa82b335e08a94c0992

Чтобы убедиться, что наш веб-сервер Apache обслуживает страницу, которую мы добавили ранее, мы должны что-то сделать.

Как вы уже догадались, мы можем либо использовать curl, либо даже использовать наш браузер, чтобы увидеть результаты.

Помните, что порт 80 в контейнере был связан с портом 8080 в системе.

Мы можем проверить, как показано ниже, используя curl.

curl -ik "localhost:8080"
HTTP/1.1 200 OK
Date: Thu, 23 Apr 2020 22:21:54 GMT
Server: Apache/2.4.37 (centos)
Last-Modified: Thu, 23 Apr 2020 22:02:43 GMT
ETag: "f-5a3fc6872e6c0"
Accept-Ranges: bytes
Content-Length: 15
Content-Type: text/html; charset=UTF-8      

Testing Apache.

Как вы можете ясно видеть, веб-сервер прослушивает порт и дал нам ответ, который мы ожидали.

Это работает.

Buildah поставляется с гораздо большим количеством инструментов в вашем распоряжении.

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

Чтобы рассмотреть его в качестве примера, перечислим все образа, чтобы получить их идентификаторы, используя команду «buildah images», затем наберем идентификатор того, который мы хотели бы проверить, и запустим:

$ buildah inspect a0c546bc3927
{
    "Type": "buildah 0.0.1",
    "FromImage": "localhost/firstapache:latest",
    "FromImageID": "a0c546bc39271565946d11a843979e017aae73e2b792cc5d9ca589661f427543",
    "FromImageDigest": "sha256:2060eb441d905934f0aa1749b0d9ed065fd464b30483a963e5719b27836c844d",
    "Config": "{\"created\":\"2020-04-23T22:09:50.515019063Z\",\"architecture\":\"amd64\",\"os\":\"linux\",\"config\":{\"ExposedPorts\":{\"80/tcp\":{}},\"Cmd\":[\"/usr/sbin/httpd\",\"-DFOREGROUND\"],\"Labels\":{\"io.buildah.version\":\"1.11.6\"}},\"rootfs\":{\"type\":\"layers\",\"diff_ids\":[\"sha256:b34ab2705c68989b396dfc33dd5174f34b14890242aae93397d628787d2a6a94\"]},\"history\":[{\"created\":\"2020-04-23T22:09:50.515019063Z\",\"created_by\":\"/bin/sh\"}]}",
    "Manifest": "{\"schemaVersion\":2,\"config\":{\"mediaType\":\"application/vnd.oci.image.config.v1+json\",\"digest\":\"sha256:a0c546bc39271565946d11a843979e017aae73e2b792cc5d9ca589661f427543\",\"size\":396},\"layers\":[{\"mediaType\":\"application/vnd.oci.image.layer.v1.tar\",\"digest\":\"sha256:b34ab2705c68989b396dfc33dd5174f34b14890242aae93397d628787d2a6a94\",\"size\":1684295168}]}",  
    "Container": "",
    "ContainerID": "",
    "MountPoint": "",
    "ProcessLabel": "",
    "MountLabel": "",
    "ImageAnnotations": null,
    "ImageCreatedBy": "",
    "OCIv1": {
        "created": "2020-04-23T22:09:50.515019063Z",
        "architecture": "amd64",
        "os": "linux",
        "config": {
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Cmd": [
                "/usr/sbin/httpd",
                "-DFOREGROUND"
            ],
            "Labels": {
                "io.buildah.version": "1.11.6"
            }
        },
        "rootfs": {
            "type": "layers",
            "diff_ids": [
                "sha256:b34ab2705c68989b396dfc33dd5174f34b14890242aae93397d628787d2a6a94"
            ]
        },
        "history": [
            {
                "created": "2020-04-23T22:09:50.515019063Z",
                "created_by": "/bin/sh"
            }
        ]
    },
    "Docker": {
        "created": "2020-04-23T22:09:50.515019063Z",
        "container_config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
Система должно произвести обильное количество информации!

Заключение

Buildah – это крутой инструмент, который может создавать образа с нуля или использовать любой образ в качестве основы.

 см. также:

🐳 Настройка локального реджестри для Docker контейнеров с помощью Podman & Let’s Encrypt SSL

 

You may also like

Leave a Comment