Как установить Podman в Ubuntu 24.04 (Noble Numbat)
Вы начали путь изучения и освоения технологий контейнеризации? Вы наткнулись на Подмана в своем исследовании «лучших механизмов управления контейнерами»? Podman — это бесплатное приложение, которое может управлять контейнерами и модулями. Благодаря мощному интерфейсу командной строки вы можете создавать, находить, запускать и управлять общим жизненным циклом контейнеров. Podman приобрел большую популярность как более безопасная альтернатива Docker. Но в отличие от Docker, podman не требует, чтобы процесс-демон работал в фоновом режиме.
Podman изначально был создан на основе контейнера и в соответствии со стандартами Open Container Initiative (OCI). Он поддерживает следующие функции, связанные с контейнерами:
- Управление образами контейнеров. Используйте podman для создания образов контейнеров, отправки их в реестр или извлечения из реестра.
- Запуск контейнерных приложений: подкоманда
run
используется для запуска контейнера из образа, входа в его оболочку и управления приложением в контейнере. - Управление хранилищем: Podman позволяет создавать постоянные тома, подключаться к контейнеру и удалять тома.
- Управление сетью: Podman предоставляет вам команды для управления сетью контейнеров. Создание сетевого моста и подключение сети к приложению.
- Управление модулями. Основная задача Podman — не управление модулями, а возможность управлять группой контейнеров как модулями. Это похоже на функциональность, которую вы получаете в Kubernetes.
Что включает в себя эта статья:
- Как установить подман на Ubuntu 24.04
- Как создать образ докера с помощью Dockerfile
- Как запускать контейнеры в Podman
- Как подключить внешнее хранилище в контейнер Podman
- Как запустить поды в Podman
- Как создать сеть в Podman и использовать со своими контейнерами
1 – Установите Podman на Ubuntu 24.04.
Обновите список пакетов в вашей системе Ubuntu.
sudo apt update
Установите Podman с помощью инструмента управления пакетами apt, доступного в Ubuntu.
sudo apt install podman -y
Установка займет всего несколько секунд.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
aardvark-dns buildah catatonit conmon containernetworking-plugins crun fuse-overlayfs golang-github-containers-common golang-github-containers-image libslirp0 libsubid4 libyajl2 login netavark
passt passwd slirp4netns uidmap
Suggested packages:
containers-storage libwasmedge0 docker-compose
The following NEW packages will be installed:
aardvark-dns buildah catatonit conmon containernetworking-plugins crun fuse-overlayfs golang-github-containers-common golang-github-containers-image libslirp0 libsubid4 libyajl2 netavark passt
podman slirp4netns uidmap
The following packages will be upgraded:
login passwd
2 upgraded, 17 newly installed, 0 to remove and 187 not upgraded.
Need to get 33.4 MB of archives.
After this operation, 130 MB of additional disk space will be used.
Get:1 http://ke.archive.ubuntu.com/ubuntu noble/main amd64 login amd64 1:4.13+dfsg1-4ubuntu3 [202 kB]
Get:2 http://ke.archive.ubuntu.com/ubuntu noble/main amd64 passwd amd64 1:4.13+dfsg1-4ubuntu3 [845 kB]
Get:3 http://ke.archive.ubuntu.com/ubuntu noble/universe amd64 netavark amd64 1.4.0-4 [1,666 kB]
8% [3 netavark 1,217 kB/1,666 kB 73%]
...
2. Создайте свое приложение с помощью Dockerfile.
Подтвердите установку Podman, проверив его версию.
$ podman --version
podman version 4.9.3
Давайте создадим образ веб-сервера Nginx, используя Dockerfile. Создайте новый файл с именем Dockerfile
.
vim Dockerfile
Добавьте содержимое ниже. Если у вас есть Dockerfile для вашего конкретного приложения, используйте его.
FROM ubuntu
MAINTAINER Josphat Mutai <[email >
RUN apt update
RUN apt install nginx -y
RUN echo "Hello World from Podman" > /var/www/html/index.html
EXPOSE 80
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
Создайте образ контейнера с помощью команды podman build
.
podman build -t nginx:latest .
Это загрузит базовый образ Ubuntu, установит пакет nginx, создаст простую веб-страницу hello world и установит порт, на котором будет работать служба, на 80.
....
invoke-rc.d: could not determine current runlevel
invoke-rc.d: policy-rc.d denied execution of start.
Setting up nginx (1.18.0-6ubuntu14.4) ...
Processing triggers for libc-bin (2.35-0ubuntu3.6) ...
--> 10af6f97e841
STEP 5/7: RUN echo "Hello World from Podman" > /var/www/html/index.html
--> 5f7aff2e1220
STEP 6/7: EXPOSE 80
--> b506f58bddca
STEP 7/7: CMD ["/usr/sbin/nginx", "-g", "daemon off;"]
COMMIT nginx:latest
--> 4bf25c100a11
Successfully tagged localhost/nginx:latest
4bf25c100a116551b0d727e827d560357f6a5edc15265e2fb7805f16677e2ecc
После сборки подтвердите сбор, перечислив доступные образы контейнеров.
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/nginx latest 4bf25c100a11 40 seconds ago 188 MB
docker.io/library/ubuntu latest 7af9ba4f0a47 10 days ago 80.4 MB
3 – Запуск контейнерного приложения в контейнере
У нас есть образ контейнера, который можно использовать для создания работающего экземпляра приложения — это контейнер. Вы можете создать контейнер с помощью команд podman run
.
podman run -d -p 8080:80 --name nginx localhost/nginx
Флаг -d
укажет podman запустить контейнер в фоновом режиме и отключить его, -p 8080
привязывает службу к порту вашего локального хоста с номером 8080. Контейнер будет иметь имя nginx.
Список запущенных контейнеров Podman в системе.
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
40c59fdad9ae localhost/nginx:latest /usr/sbin/nginx -... 3 seconds ago Up 3 seconds 0.0.0.0:8080->80/tcp nginx
Получите доступ к веб-странице приложения через IP-порт сервера 8080.
Команду curl
также можно использовать для проверки функциональности приложения из CLI.
$ curl http://192.168.1.201:8080/
Hello World from Podman
4 – Подключите внешнее хранилище в контейнер Podman
Если вы удалите контейнер, все данные, хранящиеся в нем, будут потеряны. Для сохранения данных требуется внешнее хранилище. Мы можем рассмотреть некоторые доступные для этого варианты.
1. Использование локального каталога
В качестве примера мы создаем каталог /data
.
mkdir -p ~/data/container
echo "Test file for container data persistence"|tee ~/data/container/test.txt
Чтобы смонтировать каталог в контейнере, выполните:
$ podman run -it -v ~/data/container:/mnt ubuntu /bin/bash
root@ebd6efbb01bf:/# cat /mnt/test.txt
Test file for container data persistence
2. Использование томов Podman
Тома Podman хранят данные в каталоге /var/lib/containers/storage/volumes/
. Давайте создадим тестовый том, чтобы проверить это.
podman volume create testvolume
Вы можете проверить созданный том, чтобы увидеть его точку монтирования.
jkmutai@ubuntu-2404-server:~$ podman volume ls
DRIVER VOLUME NAME
local testvolume
jkmutai@ubuntu-2404-server:~$ podman volume inspect testvolume
[
{
"Name": "testvolume",
"Driver": "local",
"Mountpoint": "/home/jkmutai/.local/share/containers/storage/volumes/testvolume/_data",
"CreatedAt": "2024-04-21T13:13:47.175944787Z",
"Labels": {},
"Scope": "local",
"Options": {},
"MountCount": 0,
"NeedsCopyUp": true,
"NeedsChown": true,
"LockNumber": 3
}
]
Чтобы смонтировать том, используйте команды ниже.
$ podman run -it -v testvolume:/mnt ubuntu /bin/bash
Подтвердите, перечислив точки монтирования в контейнере.
root@8bf46bd77811:/# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/ubuntu--vg-ubuntu--lv ext4 15G 5.7G 8.3G 41% /mnt
tmpfs tmpfs 392M 184K 392M 1% /etc/hosts
shm tmpfs 63M 0 63M 0% /dev/shm
overlay overlay 15G 5.7G 8.3G 41% /
tmpfs tmpfs 64M 0 64M 0% /dev
Чтобы удалить запуск тома:
podman volume rm testvolume
3. Файловые системы NFS
Создайте том с информацией о доступе к NFS.
podman volume create \
--opt type=nfs4 \
--opt o=rw \
--opt device=192.168.1.22:/nfsshare nfsvolume
Где;
- 192.168.1.22 — IP-адрес вашего NFS-сервера.
- /nfsshare — это экспортированный путь к общему ресурсу NFS – общий ресурс NFS.
Теперь смонтируйте том в контейнере, как и любые другие тома.
podman run -it -v nfsvolume:/nfsshare ubuntu
5 – Как запускать модули в Podman
Создайте модуль, службы которого будут находиться на порту 8085.
podman pod create -p 8085:80 -n mypod
Список созданных модулей.
$ podman pod ls
POD ID NAME STATUS CREATED INFRA ID # OF CONTAINERS
fd73821c2dbb mypod Created 5 seconds ago aaacb992072e 1
Затем вы можете создать контейнер внутри модуля.
podman run -dt --pod mypod localhost/nginx
Посмотреть работающие контейнеры
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aaacb992072e localhost/podman-pause:4.9.3-0 About a minute ago Up 19 seconds 0.0.0.0:8085->80/tcp fd73821c2dbb-infra
e3d2331926fc localhost/nginx:latest /usr/sbin/nginx -... 19 seconds ago Up 19 seconds 0.0.0.0:8085->80/tcp heuristic_tu
Тестовый сервис.
$ curl localhost:8085
Hello World from Podman
Мы создаем несколько контейнеров, например запускаем Nginx и MySQL, как показано ниже.
podman run -dt --pod new:mypod2 -p 8086:80 -p 3306:3306 localhost/nginx
podman run -dt --pod mypod2 -e MYSQL_ROOT_PASSWORD=DBPassword docker.io/library/mariadb
Получение списка контейнеров
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
aaacb992072e localhost/podman-pause:4.9.3-0 7 minutes ago Up 6 minutes 0.0.0.0:8085->80/tcp fd73821c2dbb-infra
e3d2331926fc localhost/nginx:latest /usr/sbin/nginx -... 6 minutes ago Up 6 minutes 0.0.0.0:8085->80/tcp heuristic_tu
54c1f7f605af localhost/podman-pause:4.9.3-0 About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp, 0.0.0.0:8086->80/tcp 1f3c516682fc-infra
38aec09c76dc localhost/nginx:latest /usr/sbin/nginx -... About a minute ago Up About a minute 0.0.0.0:3306->3306/tcp, 0.0.0.0:8086->80/tcp competent_easley
543ebb2a4874 docker.io/library/mariadb:latest mariadbd 26 seconds ago Up 26 seconds 0.0.0.0:3306->3306/tcp, 0.0.0.0:8086->80/tcp lucid_nash
Тестирование юзабилити.
$ curl localhost:8086
Hello World from Podman
$ mysql -u root -p'DBPassword' -h 192.168.1.201 -e "show variables like 'hostname';"
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| hostname | mypod2 |
+---------------+--------+
6 – Создание сети Podman
Чтобы создать новую сеть с подсетью 172.20.50.0/24
, используйте:
podman network create --subnet 172.20.50.0/24 network50
Прикрепляем его к контейнеру.
podman run --network network50 ubuntu /bin/bash
Вы можете подключить сеть к работающему контейнеру
podman network connect <networkname> <container>
Для отключения используйте:
podman network disconnect <networkname> <container>
Проверка маршрутов в контейнере
podman exec <container> /bin/bash -c "apt update; apt -y install iproute2; ip route"
podman exec <container> ip route
Чтобы полностью удалить сеть, используйте:
podman network ls
podman network rm <networkname>
podman network rm -f <networkname>
Обратитесь к документации Podman для получения более практических примеров использования Podman.