🐳 Как запустить Docker Контейнеры, используя Podman и Libpod

by itisgood

Вступление

Если вы знакомы с контейнерами, вы наверняка слышали о Docker и, возможно, Kubernetes (оркестратор).

Здесь речь идет о Podman, который привносит инновации в контейнерные инструменты в духе команд Unix, которые хорошо выполняют «одну вещь».

Если вы ранее использовали Docker, Podman предлагает такой же интерфейс, как и интерфейс командной строки Docker.

Как работает Docker CLI

Docker CLI является операцией клиент / сервер и связывается с Docker engine, когда он хочет создать или манипулировать операциями контейнера.

Эта клиент-серверная архитектура может привести к проблемам в работе, потому что, прежде всего, вам нужно запустить демон Docker, прежде чем Docker CLI сможет работать.

Затем Docker CLI отправляет вызов API в Docker Engine для запуска среды выполнения контейнера Open Container Initiative (OCI), в большинстве случаев runc, чтобы запустить контейнер (projectatomic.io).

Это означает, что запущенные контейнеры являются дочерними процессами Docker Engine.

Что такое Podman?

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

Podman – это демон-контейнерный движок для разработки, управления и запуска OCI-контейнеров в вашей системе Linux.

Docker или Podman

Основное различие между Docker и Podman в том, что во втором нет демона.
Он также использует среды выполнения контейнеров, например runc, но запущенные контейнеры являются прямыми потомками процесса podman.
Этот вид архитектуры имеет свои преимущества, такие как:
  • Прикладные Cgroups или ограничения безопасности по-прежнему контролируют контейнер: какими бы ни были ограничения cgroup, которые вы применяете к команде podman, запущенные контейнеры получат те же самые ограничения напрямую.
  • С помощью этой модели можно использовать расширенные функции systemd: это можно сделать, поместив podman в файл пода systemd и, следовательно, достигнув большего.

Что насчет Libpod?

Вы, наверное, видели Libpod в названии этого руководства. Libpod просто предоставляет библиотеку для приложений, стремящихся использовать концепцию Container Pod, популяризированную Kubernetes.

Это позволяет другим инструментам управлять модулями / контейнером (projectatomic.io).

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

Есть еще две важные библиотеки, которые делают Podman рабочим:

  • containers/storage – эта библиотека позволяет использовать файловые системы копирования при записи (COW), необходимые для запуска контейнеров.
  • containers/image – эта библиотека позволяет загружать и устанавливать образы контейнеров на основе OCI из реестров контейнеров, таких как Docker.io, Quay и Artifactory, а также многих других (projectatomic.io).
Эти две библиотеки были созданы с нуля для поддержки нескольких независимых процессов для одновременного взаимодействия с библиотеками.
Хорошим примером является то, что вы можете запускать полную среду Kubernetes с CRI-O, создавать образы контейнеров с помощью Buildah и одновременно управлять вашими контейнерами и подами с помощью Podman (projectatomic.io).
Это приносит дух команд Unix, которые хорошо выполняют «одну вещь». Такая комбинация инструментов невозможна в Docker.

Управление образами контейнеров

Вытащите образ, используя Podman:

$ podman pull ubuntu
$ podman pull centos
$ podman pull centos:8
Чтобы вывести список загруженных образов, используйте команду:
$ podman  images
REPOSITORY                 TAG      IMAGE ID       CREATED        SIZE
docker.io/library/ubuntu   latest   3556258649b2   2 weeks ago    66.6 MB
docker.io/library/alpine   latest   b7b28af77ffe   3 weeks ago    5.85 MB
docker.io/library/debian   latest   00bf7fdd8baf   4 weeks ago    119 MB
docker.io/library/centos   latest   9f38484d220f   4 months ago   209 MB
Чтобы удалить образ, используйте параметр -rmi, а затем имя / идентификатор:
$ podman rmi 00bf7fdd8baf
00bf7fdd8baf2ba6f0918e1f48415b2a4a1a616806e7cf32527a749dd2ce4b2c

$ podman rmi docker.io/library/ubuntu
3556258649b2ef23a41812be17377d32f568ed9f45150a26466d2ea26d926c32

Пометка образов ( теггирование )

Вы можете добавить свое собственное имя образу чтобы сделать его более интуитивным.

# podman tag 7698f282e524 webserver

# podman images                    
 REPOSITORY                 TAG      IMAGE ID       CREATED       SIZE
 docker.io/library/ubuntu   latest   7698f282e524   4 weeks ago   72.3 MB
 localhost/webserver        latest   7698f282e524   4 weeks ago   72.3 MB

Запуск контейнеров с Podman

Для запуска простого контейнера с использованием образа Ubuntu, который выведет сообщение, используйте:

# podman run --rm ubuntu /bin/echo "IT IS GOOD" 
IT IS GOOD
Чтобы запустить контейнер в фоновом режиме (detached mode), используйте параметр -d.
podman run -dt -p 8080:8080/tcp -e HTTPD_VAR_RUN=/var/run/httpd -e HTTPD_MAIN_CONF_D_PATH=/etc/httpd/conf.d \
                  -e HTTPD_MAIN_CONF_PATH=/etc/httpd/conf \
                  -e HTTPD_CONTAINER_SCRIPTS_PATH=/usr/share/container-scripts/httpd/ \
                  registry.fedoraproject.org/f29/httpd /usr/bin/run-httpd

Система вернет идентификатор контейнера:

Trying to pull registry.fedoraproject.org/f29/httpd...Getting image source signatures
Copying blob d77ff9f653ce done
Copying blob aaf5ad2e1aa3 done
Copying blob 7692efc5f81c done
Copying config 25c76f9dcd done
Writing manifest to image destination
Storing signatures
d2cdf0efb0ddc6e2ae52a5a0bdadababa6ee6cc2e1e49145c92a0474b089b664

Список запущенных контейнеров

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

$ podman ps
CONTAINER ID  IMAGE                                        COMMAND               CREATED        STATUS            PORTS                   NAMES
d2cdf0efb0dd  registry.fedoraproject.org/f29/httpd:latest  container-entrypo...  4 minutes ago  Up 4 minutes ago  0.0.0.0:8080->8080/tcp  cranky_borg

# To include stopped / exited containers, use:
$ podman ps --all

Запустить оболочку в контейнере

Чтобы получить доступ к оболочке контейнера, используйте параметры -it:

# podman run -it ubuntu bash
root@d273c12899cd:/#
root@d273c12899cd:/# apt update
 Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
 Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]          
 Get:3 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [717 kB]
 Get:4 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]        
 Get:5 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [535 kB]
 Get:6 http://archive.ubuntu.com/ubuntu bionic-backports InRelease [74.6 kB]

Поиск в Podman

$ podman search httpd

Просмотр контейнеров

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

# podman inspect 024a277cc474
[
    {
        "ID": "024a277cc4748ab48539c9ddea15d98c0e0bccc307506c44fbce12ec6c568dfc",
        "Created": "2019-06-14T10:58:07.764967058-04:00",
        "Path": "/bin/bash",
        "Args": [
            "/bin/bash"

Подробнее об использовании этого инструмента:

$ podman inspect --help

Удаление контейнеров

Сначала перечислите все запущенные контейнеры:

$ podman ps -a

CONTAINER ID  IMAGE                            COMMAND               CREATED        STATUS                    PORTS  NAMES
 024a277cc474  docker.io/library/ubuntu:latest  /bin/bash             3 minutes ago  Exited (0) 3 minutes ago         laughing_blackwell
 cf4267fb7a2b  docker.io/library/ubuntu:latest  bash                  4 hours ago    Exited (0) 2 hours ago           nostalgic_archimedes
 b800dd64ba11  docker.io/library/ubuntu:latest  /bin/bash
Чтобы удалить один работающий контейнер, используйте команду podman rm, за которой следует идентификатор контейнера:
$ podman rm 024a277cc474
024a277cc4748ab48539c9ddea15d98c0e0bccc307506c44fbce12ec6c568dfc
Чтобы удалить все контейнеры, как работающие, так и остановленные, используйте:
podman rm $(podman ps -a -q)

Просмотр логов контейнера

Вы также можете просматривать логи контейнера с помощью Podman:

$ podman logs --latest

Вы также можете указать идентификатор контейнера:

$ podman ps
$ podman logs d2cdf0efb0dd
Чтобы следить за выводом логов в режиме реального времени, используйте:
$ podman logs -f  ContainerID
$ podman logs --follow=true --since 10m ContainerID
Показать только последние 10 строк логов:
$ podman logs --tail 10 d2cdf0efb0dd

Просмотр pid’ов контейнеров

Используйте podman top для просмотра pid контейнеров.

$ podman top <container_id>

Пример:

$ podman top d2cdf0efb0dd
USER      PID   PPID   %CPU    ELAPSED            TTY     TIME   COMMAND
default   1     0      0.000   29m22.496484247s   pts/0   0s     httpd -D FOREGROUND 
default   22    1      0.000   29m21.496767511s   pts/0   0s     /usr/bin/coreutils --coreutils-prog-shebang=cat /usr/bin/cat 
default   23    1      0.000   29m21.496866314s   pts/0   0s     /usr/bin/coreutils --coreutils-prog-shebang=cat /usr/bin/cat 
default   24    1      0.000   29m21.497020539s   pts/0   0s     /usr/bin/coreutils --coreutils-prog-shebang=cat /usr/bin/cat 
default   25    1      0.000   29m21.497127237s   pts/0   0s     /usr/bin/coreutils --coreutils-prog-shebang=cat /usr/bin/cat 
default   26    1      0.000   29m21.49723933s    pts/0   0s     httpd -D FOREGROUND 
default   27    1      0.000   29m21.497361006s   pts/0   0s     httpd -D FOREGROUND 
default   28    1      0.000   29m21.497459891s   pts/0   0s     httpd -D FOREGROUND 
default   29    1      0.000   29m21.497552695s   pts/0   0s     httpd -D FOREGROUND 

Checkpoint контейнера

Checkpoint контейнера останавливает контейнер при записи состояния всех процессов в контейнере на диск.

Эта возможность требует CRIU 3.11 или более поздней версии, установленной в системе.

podman container checkpoint <container_id>

Пример

$ podman container checkpoint d2cdf0efb0dd
Позже контейнер можно восстановить и продолжить работу в тот же момент времени, что и checkpoint.
podman container restore <container_id>

Перенос контейнера

Первый сheckpoint контейнера в исходной системе:

podman container checkpoint <container_id> -e /tmp/checkpoint.tar.gz
Скопируйте его на целевой сервер:
scp /tmp/checkpoint.tar.gz <destination_system>:/tmp

В системе назначения восстановите контейнер:

podman container restore -i /tmp/checkpoint.tar.gz

Управление контейнером с помощью Podman

Поды Podman похожи на концепцию подов Kubernetes

Большая часть взаимодействия с подами происходит с помощью команд podman pod:
$ podman pod --help
NAME:
   podman pod - Manage container pods.

Pods are a group of one or more containers sharing the same network, pid and ipc namespaces.

USAGE:
   podman pod command [command options] [arguments...]

COMMANDS:
     create        Create a new empty pod
     exists        Check if a pod exists in local storage
     inspect       displays a pod configuration
     kill          Send the specified signal or SIGKILL to containers in pod
     pause         Pause one or more pods
     ps, ls, list  List pods
     restart       Restart one or more pods
     rm            Remove one or more pods
     start         Start one or more pods
     stats         Display percentage of CPU, memory, network I/O, block I/O and PIDs for containers in one or more pods
     stop          Stop one or more pods
     top           Display the running processes of containers in a pod
     unpause       Unpause one or more pods

OPTIONS:
   --help, -h  show help
В приведенном ниже примере будет создан под под названием web
$ podman pod create --name web
0f565b11e9cb3736dc15b46f3361305e351ce556818e342a9fdf799ea4edf7ca
Эта команда создает под без дополнительных атрибутов
$ podman pod create --help
Подтвердите создание пода
$ podman pod list
POD ID         NAME   STATUS    CREATED              # OF CONTAINERS   INFRA ID
0f565b11e9cb   web    Running   About a minute ago   1                 44cca777d12f

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

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

$ podman ps -a --pod 
CONTAINER ID  IMAGE                 COMMAND  CREATED         STATUS             PORTS  NAMES               POD
44cca777d12f  k8s.gcr.io/pause:3.1           23 minutes ago  Up 23 minutes ago         0f565b11e9cb-infra  0f565b11e9cb
Теперь, когда под создан, мы можем добавить в него контейнер:
podman run -dt --pod web alpine:latest top
Теперь вы должны увидеть, что у пода есть два контейнера.
$ podman ps -a --pod 
CONTAINER ID  IMAGE                            COMMAND  CREATED             STATUS                 PORTS  NAMES               POD
36ccace2d653  docker.io/library/alpine:latest  top      About a minute ago  Up About a minute ago         zen_hugle           0f565b11e9cb
44cca777d12f  k8s.gcr.io/pause:3.1                      28 minutes ago      Up 28 minutes ago             0f565b11e9cb-infra  0f565b11e9cb
Таким образом, вы создадите контейнер и предоставите порт – root, необходимый для привязки порта.
sudo podman pod create -p 8080:80 --name web1
sudo podman run -dt --pod web1 -p 8080 nginx:latest
Обратите внимание, что вам нужно опубликовать столько портов, сколько будет использовано при создании пода.
Это не может быть изменено после создания.
Podman показывает многообещающее будущее контейнеризации.
Фактически, Red Hat не просто удалила движок контейнера Docker из OpenShift.
Они также полностью удалиил Docker engine и команду docker из Red Hat Enterprise Linux 8. 

You may also like

Leave a Comment