Podman - Gestion du stockage

Dans le cas d’un conteneur faisant office de server Web ou de BDD, il sera sans doute nécessaire d’accrocher un stockage persistant ou un accès à d’autres réseaux.

Stockage persistant de conteneur

Par défaut, toutes les nouvelles données écrite dans le conteneur sont perdues après sa suppression.

Pour conserver les données, l’option --volume (-v) permets d’utiliser le système de fichier de l’host (et prévoir les bonne autorisations).

Mappage UID/GID

La commande podman unshare cat permet d’afficher le mappage UID/GID :

$ podman unshare cat /proc/self/uid_map
0 1000 1 // root
1 100000 65536 // Correspondance entre le conteneur et l'host
$ podman unshare cat /proc/self/gid_map
0 1000 1 // root
1 100000 65536 // Correspondance entre le conteneur et l'host

La commande podman exec affiche l’UID et le GID de l’user mysql à l’intérieur du conteneur qui s’exécute avec le stockage non persistant :

$ podman exec -it db_01 grep mysql /etc/passwd
mysql:x:27:27:MySQL Server:/var/lib/mysql:/sbin/nologin

Stockage persistant

Création d’un répertoire sur l’host :

$ mkdir /home/projet/db_data

Mappage des UID/GID :

$ podman unshare chown 27:27 /home/projet/db_data

Afficher la mise en correspondance (27:27 -> 100026:100026) :

$ ls -l /home/projet/
total 0
drwxrwxr-x. 3 100026 100026 18 May 5 14:37 db_data
[...]

Monter le répertoire avec l’option -d de podman run -d :

$ podman run -d --name db_01 \
-e MYSQL_USER=luci \
-e MYSQL_PASSWORD=Luci3v1l \
-e MYSQL_DATABASE=dev_data \
-e MYSQL_ROOT_PASSWORD=Aw3s0m3P4SS! \
-v /home/projet/db_data:/var/lib/mysql \
my.com.pany.org/rhel8/mariadb-105

Maintenant il faut définir le contexte SELinux.

Contextes SELinux pour le stockage de conteneurs

La commande podman container logs affiche aussi les erreurs d’autorisation, ici pour /var/lib/mysql/db_data :

$ podman container logs db_01
[...]
---> 16:41:25 Initializing database ...
---> 16:41:25 Running mysql_install_db ...
mkdir: cannot create directory '/var/lib/mysql/db_data': Permission denied
Fatal error Can't create database directory '/var/lib/mysql/db_data'

Cette erreur se produit à cause du contexte SELinux défini sur /home/projet/db_data sur l’host.

Il faut définir le contexte SELinux container_file_t avant de monter le répertoire en tant que stockage persistant.

La commande podman run -v /home/projet/db_data:/var/lib/ mysql:Z défini le contexte SELinux de /home/projet/db_data quand il sera monté comme stockage persistant pour /var/lib/mysql :

$ podman run -d --name db_01 \
-e MYSQL_USER=luci \
-e MYSQL_PASSWORD=Luci3v1l \
-e MYSQL_DATABASE=dev_data \
-e MYSQL_ROOT_PASSWORD=Aw3s0m3P4SS! \
-v /home/projet/db_data:/var/lib/mysql:Z \
my.com.pany.org/rhel8/mariadb-105

Vérifier le contexte sur /home/projet/ :

$ ls -Z /home/projet/
system_u:object_r:container_file_t:s0:c81,c1009 db_data
[...]

/!\ Résumé des commandes

Commandes :

$ podman unshare cat /proc/self/uid_map
$ podman unshare cat /proc/self/gid_map
$ podman exec -it db_01 grep mysql /etc/passwd
$ podman unshare chown 27:27 /home/projet/db_data

$ podman run -d --name db_01 \
-e MYSQL_USER=luci \
-e MYSQL_PASSWORD=Luci3v1l \
-e MYSQL_DATABASE=dev_data \
-e MYSQL_ROOT_PASSWORD=Aw3s0m3P4SS! \
-v /home/projet/db_data:/var/lib/mysql \
my.com.pany.org/rhel8/mariadb-105

$ podman container logs db_01

$ podman run -d --name db_01 \
-e MYSQL_USER=luci \
-e MYSQL_PASSWORD=Luci3v1l \
-e MYSQL_DATABASE=dev_data \
-e MYSQL_ROOT_PASSWORD=Aw3s0m3P4SS! \
-v /home/projet/db_data:/var/lib/mysql:Z \
my.com.pany.org/rhel8/mariadb-105

$ ls -Z /home/projet/

Fichiers :

/proc/self/uid_map
/proc/self/gid_map

Documentation

MAN podman(1)
MAN podman-exec(1)
MAN podman-info(1)
MAN podman-network(1)
MAN podman-network-create(1)
MAN podman-network-inspect(1)
MAN podmannetwork-ls(1)
MAN podman-port(1)
MAN podman-run(1)
MAN podman-unshare(1)

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/9/html-single/building_running_and_managing_containers/assembly_working-withcontainers_building-running-and-managing-containers

> Partager <