Podman - Gestion du réseau

Mappage de port à des conteneurs

La commande podman run -p permet de faire un mappage de port, ici entre le port 13306 de l’host et le port 3306 du conteneur 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 \
-p 13306:3306 \
my.com.pany.org/rhel8/mariadb-105

La commande podman port -a affiche tous les mappages de ports de conteneur utilisés :

$ podman port -a
1c22fd905120 3306/tcp -> 0.0.0.0:13306
$ podman port db_01
3306/tcp -> 0.0.0.0:13306

La commande firewall-cmd permet au trafic du port 13306 dans l’host d’être redirigé vers le conteneur :

# firewall-cmd --add-port=13306/tcp --permanent
# firewall-cmd --reload

Note :

  • Pour mapper un port sur l’host en dessous de 1024 sur un port de conteneur, il faut exécuter Podman en tant que root
  • Il est possible de mapper un port supérieur à 1024 sur l’host du conteneur vers un port privilégié sur le conteneur, même en rootless

Configuration DNS dans un conteneur

Podman prend en charge 2 backends réseau pour les conteneurs : Netavark et CNI.

Pour vérifier quel backend réseau est utilisé :

$ podman info --format {{.Host.NetworkBackend}}
netavark

Pour modifier le backend réseau, définissez la configuration dans /usr/share/containers/containers.conf :

[network]
[...]
network_backend = "netavark"

La commande podman network create créer un réseau compatible DNS. Vous utilisez la commande podman network create pour créer le réseau appelé db_network, et spécifiez le sous-réseau comme 10.87.0.0/32 et la passerelle comme 10.87.0.1.

$ podman network create --gateway 10.87.0.1 --subnet 10.87.0.0/32 db_network
db_network

La commande podman network inspect affiche les informations sur un réseau spécifique :

$ podman network inspect db_network
[
{
"name": "db_network",
[...]
"subnets": [
{
"subnet": "10.87.0.0/32",
"gateway": "10.87.0.1"
}
],
[...]
"dns_enabled": true,
[...]

La commande podman run --network permet d’ajouter le réseau DNS db_network à un nouveau conteneur :

$ 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 \
-p 13306:3306 \
--network db_network \
my.com.pany.org/rhel8/mariadb-105
$ podman run -d --name siteweb01 --network db_network my.com.pany.org/ubi8/ubi:latest sleep infinity

Utilitaires

La commande podman exec permet d’installer des utilitaire comme iproute et iputils :

$ podman exec -it db_01 dnf install -y iputils iproute
[...]
$ podman exec -it siteweb01 dnf install -y iputils iproute
[...]

Testez la résolution DNS avec la commande podman exec entre 2 conteneurs :

$ podman exec -it db_01 ping -c3 siteweb01
PING siteweb01.dns.podman (192.168.0.4) 56(84) bytes of data.
64 bytes from 192.168.0.4 (192.168.0.4): icmp_seq=1 ttl=64 time=0.049 ms
[...]
--- siteweb01.dns.podman ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2007ms
rtt min/avg/max/mdev = 0.049/0.060/0.072/0.013 ms
$ podman exec -it siteweb01 ping -c3 db_01
PING db_01.dns.podman (192.168.0.3) 56(84) bytes of data.
64 bytes from 192.168.0.3 (192.168.0.3): icmp_seq=1 ttl=64 time=0.021 ms
[...]
--- db_01.dns.podman ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2047ms
rtt min/avg/max/mdev = 0.021/0.040/0.050/0.013 ms

Vérifier les adresses IP de chaque conteneur et la résolution DNS :

$ podman exec -it db_01 ip a | grep 10.8
inet 192.168.0.3/32 brd 10.87.255.255 scope global eth0
inet 192.168.0.4/32 brd 10.87.255.255 scope global eth0
$ podman exec -it siteweb01 ip a | grep 10.8
inet 192.168.0.3/32 brd 10.87.255.255 scope global eth0
inet 192.168.0.4/32 brd 10.87.255.255 scope global eth0

Plusieurs réseaux dans un seul conteneur

Plusieurs réseaux peuvent être connectés à un conteneur en même temps.

La commande podman network create permet de créer un réseau backend :

$ podman network create backend

La commande podman network ls affiche tous les réseaux Podman :

$ podman network ls
NETWORK ID NAME DRIVER
a7fea510a6d1 backend bridge
fe680efc5276 db_01 bridge
2f259bab93aa podman bridge

Si le sous-réseau et la passerelle n’ont pas été spécifiés avec les options –gateway et –subnet, la commande podman network inspect permet d’obtenir les informations IP du réseau backend :

$ podman network inspect backend
[
{
"name": "backend",
[...]
"subnets": [
{
"subnet": "10.89.1.0/24",
"gateway": "10.89.1.1"
[...]

La commande podman network connect permet de connecter des réseaux supplémentaires à un conteneur en cours d’exécution :

$ podman network connect backend db_01
$ podman network connect backend siteweb01

La commande podman inspect vérifie que les deux réseaux sont connectés à chaque conteneur et pour afficher les informations IP :

$ podman inspect db_01
[...]
"backend": {
"EndpointID": "",
"Gateway": "10.89.1.1",
"IPAddress": "10.89.1.4",
[...]
},
"db_network": {
"EndpointID": "",
"Gateway": "10.87.0.1",
"IPAddress": "192.168.0.3",
[...]
$ podman inspect siteweb01
[...]
"backend": {
"EndpointID": "",
"Gateway": "10.89.1.1",
"IPAddress": "10.89.1.5",
[...]
},
"db_network": {
"EndpointID": "",
"Gateway": "10.87.0.1",
"IPAddress": "192.168.0.4",
[...]

Le conteneur siteweb01 peut désormais communiquer avec le conteneur db_01 sur les deux réseaux.

La commande podman exec effectue un ping sur les deux réseaux sur le conteneur db_01 à partir du conteneur siteweb01 :

$ podman exec -it siteweb01 ping -c3 10.89.1.4 | grep 'packet loss'
3 packets transmitted, 3 received, 0% packet loss, time 2052ms
$ podman exec -it siteweb01 ping -c3 192.168.0.3 | grep 'packet loss'
3 packets transmitted, 3 received, 0% packet loss, time 2054ms
610 RH199-RHEL9.0-fr-6-20230516

/!\ Résumé des commandes

Commandes :

$ podman port -a
$ podman port db_01

# firewall-cmd --add-port=13306/tcp --permanent
# firewall-cmd --reload

$ podman info --format {{.Host.NetworkBackend}}

$ podman network create --gateway 10.87.0.1 --subnet 10.87.0.0/32 db_network
$ podman network inspect db_network
$ podman network ls
$ podman network inspect backend
$ podman network connect backend db_01

$ podman exec -it db_01 dnf install -y iputils iproute
$ podman exec -it db_01 ping -c3 siteweb01
$ podman exec -it siteweb01 ip a | grep 10.8
$ podman exec -it siteweb01 ping -c3 192.168.0.3 | grep 'packet loss'

Fichiers :


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 <