Вступление
Если вы знакомы с контейнерами, вы наверняка слышали о 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
- Прикладные 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).
Управление образами контейнеров
Вытащите образ, используя 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
$ 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
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 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
$ 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
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 --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
$ 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
sudo podman pod create -p 8080:80 --name web1
sudo podman run -dt --pod web1 -p 8080 nginx:latest