Podman complète Buildah et Skopeo en offrant une expérience similaire à la ligne de commande Docker :permettant aux utilisateurs d'exécuter des conteneurs autonomes (non orchestrés). Et Podman n'a pas besoin d'un démon pour exécuter des conteneurs et des pods, nous pouvons donc facilement dire au revoir aux gros démons. Il n'y a pas de démons en arrière-plan qui font des choses, ce qui signifie que Podman peut être intégré aux services système via systemd
.
Dans ce guide, nous apprendrons comment installer Podman dans Rocky Linux/Alma Linux/Centos 8. Cet article fonctionne également pour les dérivés de RHEL 8 tels qu'Oracle Linux.
Articles associés
- Comment installer et utiliser Podman dans Debian 11
- Comment installer et utiliser Podman dans Fedora 34/35
- Comment installer et utiliser Podman dans OpenSUSE Leap 15.3
- Comment installer et configurer docker dans Rocky Linux/Centos 8
- Premiers pas avec Docker Compose avec des exemples
- Docker en tant qu'agent de build :exécutez les builds Jenkins sur Docker
Prérequis
Pour suivre, assurez-vous que vous disposez des éléments suivants :
- Un Rocky Linux/Centos 8 mis à jour
- Accès root ou utilisateur avec accès sudo
- Accès à Internet
Table des matières
- S'assurer que le serveur est à jour
- Installer podman
- Exemples de ligne de commande
- Exécuter un conteneur persistant postgres
- Gestion des conteneurs en tant que services système via systemd et Podman
1. S'assurer que le serveur est à jour
Utilisez cette commande pour vous assurer que nos packages de serveur sont mis à jour
sudo dnf update -y
Assurons-nous que les packages communs sont installés
sudo dnf install -y vim
2. Installer Podman
Podman est disponible dans le référentiel AppStream par défaut pour CentOS 8 et Stream. Installez-le à l'aide de cette commande :
sudo dnf install -y podman
Cette commande installera Podman ainsi que ses dépendances : atomic-registries
, runC
, skopeo-containers
, et les politiques SELinux.
C'est tout. Nous pouvons maintenant jouer avec Podman.
3. Exemples de ligne de commande
Explorons l'exécution de Rocky Linux Container à l'aide de podman.
Sur Docker, nous utiliserions cette commande pour exécuter un conteneur Rocky Linux :
docker run -it rockylinux/rockylinux:8.4 sh
Cela échouera car il n'y a pas de docker
commande sur mon serveur Rocky Linux. On peut remplacer docker par podman :
podman run -it rockylinux/rockylinux:8.4 sh
Exécutons quelques commandes pour confirmer qu'il fonctionne comme prévu :
$ podman run -it rockylinux/rockylinux:8.4 sh
✔ docker.io/rockylinux/rockylinux:8.4
Trying to pull docker.io/rockylinux/rockylinux:8.4...
Getting image source signatures
Copying blob 1b474f8e669e done
Copying config 333da17614 done
Writing manifest to image destination
Storing signatures
sh-4.4# ps ax
PID TTY STAT TIME COMMAND
1 pts/0 Ss 0:00 sh
6 pts/0 R+ 0:00 ps ax
sh-4.4# exit
exit
Pour vérifier l'état du conteneur, utilisez podman ps
commande
$ podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f81814c698e docker.io/rockylinux/rockylinux:8.4 sh 3 minutes ago Exited (0) 3 minutes ago competent_pasteur
Pour supprimer le conteneur, utilisez podman rm
:
$ podman rm 5f81814c698e
5f81814c698ef09484c66d4427fda5de21c4dca1766a67ee108d256117460d71
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/rockylinux/rockylinux 8.4 333da17614b6 4 months ago 234 MB
[[email protected] ~]$ podman image rm rockylinux/rockylinux
Untagged: docker.io/rockylinux/rockylinux:8.4
Deleted: 333da17614b642a228c30edcb2bddfdf17b2d713ae71b7930c44b714ff8b92e7
Pour lister les images :
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/rockylinux/rockylinux 8.4 333da17614b6 4 months ago 234 MB
Nous pouvons supprimer l'image en utilisant l'image podman image rm
commande :
$ podman image rm rockylinux/rockylinux
Untagged: docker.io/rockylinux/rockylinux:8.4
Deleted: 333da17614b642a228c30edcb2bddfdf17b2d713ae71b7930c44b714ff8b92e7
D'après ce qui précède, nous pouvons confirmer que la commande podman utilise la même syntaxe que docker
Exécuter un conteneur persistant Postgres
Ensuite, explorons comment nous pouvons exécuter un conteneur persistant. Dans cet exemple, nous allons exécuter un conteneur Postgres 14 et monter les données postgres sur un volume local afin qu'il puisse persister les redémarrages. Les conteneurs étant éphémères, les données seront perdues si nous ne sauvegardons pas dans un volume local.
Extrayez docker.io/library/postgres:14.0-alpine
photo
$ podman pull docker.io/library/postgres:14.0-alpine
✔ docker.io/library/postgres:14.0-alpine
Trying to pull docker.io/library/postgres:14.0-alpine...
Getting image source signatures
Copying blob 82e9eb77798b done
Copying blob c6b2245b2f36 done
Copying blob a0d0a0d46f8b done
Copying blob 3da258773353 done
Copying blob ccd761727716 done
Copying blob 5034a66b99e6 done
Copying blob 2c7ee7bc69e8 done
Copying blob 028554d3b6cc done
Copying config 87440f4e7f done
Writing manifest to image destination
Storing signatures
87440f4e7f9e60607dc11a4f0590a1c69b3a1c075211df478e22b0c27fb263e6
Confirmer les images
$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/postgres 14.0-alpine 87440f4e7f9e 2 weeks ago 198 MB
Inspectez l'image avec
$ podman inspect 87440f4e7f9e
Configurons un dossier qui gérera les données Postgres une fois que nous aurons démarré notre conteneur :
$ mkdir -p ~/apps/postgres/data
Exécutez-le
podman run -d \
-p 5432:5432 \
-v ~/apps/postgres/data:/var/lib/postgresql/data:Z \
-e POSTGRES_PASSWORD=Sup3rSecre7 \
-e POSTGRES_USER=citizix_user \
-e POSTGRES_DB=citizix_db \
docker.io/library/postgres:14.0-alpine
Ceci est ma sortie
$ podman run -d \
> -p 5432:5432 \
> -v ~/apps/postgres/data:/var/lib/postgresql/data:Z \
> -e POSTGRES_PASSWORD=Sup3rSecre7 \
> -e POSTGRES_USER=citizix_user \
> -e POSTGRES_DB=citizix_db \
> docker.io/library/postgres:14.0-alpine
9aa1fb68beeeb7c68a9ea5afb4ca91bf07acf3fef92bf21249a6d8a4e43f5dbd
Vérifier les processus :
$ podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9aa1fb68beee docker.io/library/postgres:14.0-alpine postgres 46 seconds ago Up 47 seconds ago 0.0.0.0:5432->5432/tcp gracious_jemison
Confirmez les journaux du conteneur avec ceci. Vous pouvez voir qu'il initialise la base de données
$ podman logs 9aa1fb68beee | head performing post-bootstrap initialization ... sh: locale: not found 2021-11-11 09:05:00.481 UTC [30] WARNING: no usable system locales were found The files belonging to this database system will be owned by user "postgres". This user must also own the server process. The database cluster will be initialized with locale "en_US.utf8". The default database encoding has accordingly been set to "UTF8". The default text search configuration will be set to "english". Data page checksums are disabled. fixing permissions on existing directory /var/lib/postgresql/data ... ok
Connectons-nous à la base de données et effectuons quelques opérations
$ podman exec -it 9aa1fb68beee /bin/bash
bash-5.1# psql -U citizix_user -d citizix_db;
psql (14.0)
Type "help" for help.
citizix_db=# select version();
version
--------------------------------------------------------------------------------------------------------------
PostgreSQL 14.0 on x86_64-pc-linux-musl, compiled by gcc (Alpine 10.3.1_git20210424) 10.3.1 20210424, 64-bit
(1 row)
citizix_db=#
Ensuite, explorons la suppression et le retrait du conteneur. Nous pouvons utiliser podman kill
pour arrêter le conteneur. Cela arrêtera le conteneur, mais il sera toujours là. Utilisez podman ps -a
lister. Pour le supprimer complètement, alors podman rm -f
.
$ podman kill 9aa1fb68beee
9aa1fb68beee
$ podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9aa1fb68beee docker.io/library/postgres:14.0-alpine postgres 14 minutes ago Exited (137) 20 seconds ago 0.0.0.0:5432->5432/tcp gracious_jemison
$ podman rm -f 9aa1fb68beee
9aa1fb68beeeb7c68a9ea5afb4ca91bf07acf3fef92bf21249a6d8a4e43f5dbd
Gérer les conteneurs en tant que services système via systemd et Podman
Nous pouvons gérer les conteneurs podman via systemd. Créons un systemd
fichier de ressources pour gérer le conteneur postgres que nous venons de créer ci-dessus.
Créez un fichier podman postgres :
sudo vim /etc/systemd/system/postgres-podman.service
Ajouter ce contenu
[Unit]
Description=Custom Postgres Podman Container
After=network.target
[Service]
Type=simple
TimeoutStartSec=5m
ExecStartPre=-/usr/bin/podman rm -f postgrespodman
ExecStart=/usr/bin/podman run \
-p 5432:5432 \
-v /home/rocky/apps/postgres/data:/var/lib/postgresql/data:Z \
-e POSTGRES_PASSWORD=Sup3rSecre7 \
-e POSTGRES_USER=citizix_user \
-e POSTGRES_DB=citizix_db \
docker.io/library/postgres:14.0-alpine
ExecReload=-/usr/bin/podman stop postgrespodman
ExecReload=-/usr/bin/podman rm postgrespodman
ExecStop=-/usr/bin/podman stop postgrespodman
Restart=always
RestartSec=30
[Install]
Ensuite, nous pouvons recharger le systemd
catalogue et démarrer le service :
sudo systemctl daemon-reload
sudo systemctl start postgres-podman
Confirmer l'état du service
$ sudo systemctl status postgres-podman
● postgres-podman.service - Custom Postgres Podman Container
Loaded: loaded (/etc/systemd/system/postgres-podman.service; static; vendor preset: disabled)
Active: active (running) since Thu 2021-11-11 10:07:09 UTC; 21s ago
Process: 71868 ExecStop=/usr/bin/podman stop postgrespodman (code=exited, status=125)
Process: 71943 ExecStartPre=/usr/bin/podman rm -f postgrespodman (code=exited, status=1/FAILURE)
Main PID: 71973 (podman)
Tasks: 11 (limit: 23167)
Memory: 27.8M
CGroup: /system.slice/postgres-podman.service
├─71973 /usr/bin/podman run -p 5432:5432 -v /home/rocky/apps/postgres/data:/var/lib/postgresql/data:Z -e POSTGRES_PASSWORD=Sup3rSecre7 -e POSTGRES_USER=citizix_user -e POSTGRE>
└─72073 /usr/bin/conmon --api-version 1 -c 03e82c0f88fe4d69630b308f59f2e62bb23b19021a0de5ab0b267950c9367103 -u 03e82c0f88fe4d69630b308f59f2e62bb23b19021a0de5ab0b267950c9367103>
Nov 11 10:07:09 ip-10-2-40-72.us-west-2.compute.internal systemd[1]: Starting Custom Postgres Podman Container...
Nov 11 10:07:09 ip-10-2-40-72.us-west-2.compute.internal podman[71943]: Error: no container with name or ID "postgrespodman" found: no such container
Nov 11 10:07:09 ip-10-2-40-72.us-west-2.compute.internal systemd[1]: Started Custom Postgres Podman Container.
Nov 11 10:07:10 ip-10-2-40-72.us-west-2.compute.internal podman[71973]: PostgreSQL Database directory appears to contain a database; Skipping initialization
Nov 11 10:07:10 ip-10-2-40-72.us-west-2.compute.internal podman[71973]: 2021-11-11 10:07:10.428 UTC [1] LOG: starting PostgreSQL 14.0 on x86_64-pc-linux-musl, compiled by gcc (Alpine 10>
Nov 11 10:07:10 ip-10-2-40-72.us-west-2.compute.internal podman[71973]: 2021-11-11 10:07:10.429 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
Nov 11 10:07:10 ip-10-2-40-72.us-west-2.compute.internal podman[71973]: 2021-11-11 10:07:10.429 UTC [1] LOG: listening on IPv6 address "::", port 5432
Nov 11 10:07:10 ip-10-2-40-72.us-west-2.compute.internal podman[71973]: 2021-11-11 10:07:10.432 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
Nov 11 10:07:10 ip-10-2-40-72.us-west-2.compute.internal podman[71973]: 2021-11-11 10:07:10.437 UTC [20] LOG: database system was shut down at 2021-11-11 10:07:09 UTC
Nov 11 10:07:10 ip-10-2-40-72.us-west-2.compute.internal podman[71973]: 2021-11-11 10:07:10.440 UTC [1] LOG: database system is ready to accept connections
Nous venons de mettre en place un service système personnalisé basé sur un conteneur géré via Podman !
Conclusion
Nous avons réussi à explorer comment installer Podman sur notre serveur Rocky Linux/Centos 8 dans ce guide.