Podman - Gestion du réseau

Mappage de port sur des conteneurs

La commande podman run -p permet de faire un mappage de port, ici entre le port 13306 de l’hôte et le port 3306 du conteneur db_client_2 :

$ podman run -d --name db_client_2 \
-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/mysql

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

$ podman port -a
ec32e4a48dbb    3306/tcp -> 0.0.0.0:13306
118b924660ad 5000/tcp -> 0.0.0.0:5000
fd4b2f451f70 8000/tcp -> 0.0.0.0:8000
f0acf0898c92 3306/tcp -> 0.0.0.0:3306

En ciblant un conteneur en particulier ;

$ podman port db_client_2
3306/tcp -> 0.0.0.0:13306

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

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

Note :

  • Pour mapper un port sur l’hôte 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’hôte du conteneur vers un port privilégié sur le conteneur, même en rootless

Configuration DNS dans un conteneur

Podman prend en charge 2 réseaux backend 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 determines what network driver will be used to set up and tear down container networks.
# Valid values are "cni" and "netavark".
network_backend = "netavark"

La commande podman network create créer un réseau compatible DNS.

Création d’un réseau appelé db_network en spécifiant le sous-réseau 10.87.0.0/24 et la passerelle 10.87.0.1 :

$ podman network create --gateway 10.87.0.1 --subnet 10.87.0.0/24 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",
"id": "770aaa8e0ad5ec1b8f8f6da50d19124e33ba60fdbe3a36522bb398ca6a60ac07",
"driver": "bridge",
"network_interface": "podman2",
"created": "2024-10-29T12:10:00.667978633Z",
"subnets": [
{
"subnet": "10.87.0.0/24",
"gateway": "10.87.0.1"
}
],
"ipv6_enabled": false,
"internal": false,
"dns_enabled": true,
"ipam_options": {
"driver": "host-local"
}
}
]

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

$ podman run -d --name db_client_2 \
-e MYSQL_USER=luci \
-e MYSQL_PASSWORD=Luci3v1l \
-e MYSQL_DATABASE=dev_data \
-e MYSQL_ROOT_PASSWORD=Aw3s0m3P4SS! \
-v /home/aline/database:/var/lib/mysql:Z \
-p 13306:3306 \
--network db_network \
localhost:5000/mysql

Lancement du conteneur ;

$ podman run -d --name siteweb01 --network db_network localhost:5000/ubi9/ubi:latest sleep infinity

Utilitaires

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

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

Test de la résolution DNS avec la commande podman exec entre 2 conteneurs.

Du conteneur db_client_2 vers siteweb01 :

$ podman exec -it db_client_2 ping -c3 siteweb01
PING siteweb01.dns.podman (10.87.0.3) 56(84) bytes of data.
64 bytes from 10.87.0.3 (10.87.0.3): icmp_seq=1 ttl=64 time=0.025 ms
[...]

--- siteweb01.dns.podman ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2013ms
rtt min/avg/max/mdev = 0.025/0.063/0.088/0.027 ms

Du conteneur siteweb01 vers db_client_2 :

$ podman exec -it siteweb01 ping -c3 db_client_2
PING db_client_2.dns.podman (10.87.0.4) 56(84) bytes of data.
64 bytes from 10.87.0.4 (10.87.0.4): icmp_seq=1 ttl=64 time=0.024 ms
[...]

--- db_client_2.dns.podman ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2020ms
rtt min/avg/max/mdev = 0.024/0.053/0.084/0.024 ms

Vérification des adresses IP de chaque conteneur et la résolution DNS.

Conteneur db_client_2 :

$  podman exec -it db_client_2 ip a | grep 10.8
inet 10.87.0.4/24 brd 10.87.0.255 scope global eth0

Conteneur siteweb01 :

$  podman exec -it siteweb01 ip a | grep 10.8
inet 10.87.0.3/24 brd 10.87.0.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
05fa01084711 backend bridge
fe680efc5276 db_network bridge
b76756e77385 db_client_2 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",
"id": "05fa01084711adabc4d419211c6cc6e4c8596eb6bb20d47b07fbccf0ef05e62b",
"driver": "bridge",
"network_interface": "podman3",
"created": "2024-10-29T12:53:28.127500475Z",
"subnets": [
{
"subnet": "10.89.0.0/24",
"gateway": "10.89.0.1"
}
],
"ipv6_enabled": false,
"internal": false,
"dns_enabled": true,
"ipam_options": {
"driver": "host-local"
}
}
]

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_client_2
$ 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.

Pour le conteneur db_client_2 :

$ podman inspect db_client_2
"NetworkSettings": {
[...]
"Networks": {
"backend": {
"EndpointID": "",
"Gateway": "10.89.0.1",
"IPAddress": "10.89.0.2",
[...]
},
"db_network": {
"EndpointID": "",
"Gateway": "10.87.0.1",
"IPAddress": "10.87.0.4",
[...]
}
}
},

Pour le conteneur siteweb01 :

$ podman inspect siteweb01
"NetworkSettings": {
[...]
"Networks": {
"backend": {
"EndpointID": "",
"Gateway": "10.89.0.1",
"IPAddress": "10.89.0.3",
[...]
},
"db_network": {
"EndpointID": "",
"Gateway": "10.87.0.1",
"IPAddress": "10.87.0.3",
[...]
]
}
}
},

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

La commande podman exec effectue un ping sur les deux réseaux sur les conteneurs db_client_2 et siteweb01.

Depuis siteweb01 vers l‘@IP de db_client_2 et de son @IP dans le backend :

$ podman exec -it siteweb01 ping -c3 10.87.0.4
PING 10.87.0.4 (10.87.0.4) 56(84) bytes of data.
64 bytes from 10.87.0.4: icmp_seq=1 ttl=64 time=0.081 ms
[..]

--- 10.87.0.4 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2071ms
rtt min/avg/max/mdev = 0.081/0.091/0.105/0.010 ms
$ podman exec -it siteweb01 ping -c3 10.89.0.2
PING 10.89.0.2 (10.89.0.2) 56(84) bytes of data.
64 bytes from 10.89.0.2: icmp_seq=1 ttl=64 time=0.125 ms
[..]

--- 10.89.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2041ms
rtt min/avg/max/mdev = 0.081/0.114/0.137/0.024 ms

Depuis db_client_2 vers l‘@IP de siteweb01 et de son @IP dans le backend :

$ podman exec -it db_client_2 ping -c3 10.87.0.3
PING 10.87.0.3 (10.87.0.3) 56(84) bytes of data.
64 bytes from 10.87.0.3: icmp_seq=1 ttl=64 time=0.057 ms
[..]
--- 10.87.0.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2054ms
rtt min/avg/max/mdev = 0.057/0.090/0.135/0.032 ms
$ podman exec -it db_client_2 ping -c3 10.89.0.3
PING 10.89.0.3 (10.89.0.3) 56(84) bytes of data.
64 bytes from 10.89.0.3: icmp_seq=1 ttl=64 time=0.106 ms
[..]

--- 10.89.0.3 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2078ms
rtt min/avg/max/mdev = 0.106/0.124/0.138/0.013 ms

/!\ Résumé des commandes

Commandes :

$ podman port -a
$ podman port db_client_2

# 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_client_2

$ podman exec -it db_client_2 dnf install -y iputils iproute
$ podman exec -it db_client_2 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'

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 <