Quand je crée un nouveau conteneur de docker comme avec
docker run -it -m 560m --cpuset-cpus=1,2 ubuntu sleep 120
et vérifiez ses espaces de noms, je peux voir que de nouveaux espaces de noms ont été créés (exemple pour le pid 7047).
root@dude2:~# ls /proc/7047/ns -la
total 0
dr-x--x--x 2 root root 0 Jul 7 12:17 .
dr-xr-xr-x 9 root root 0 Jul 7 12:16 ..
lrwxrwxrwx 1 root root 0 Jul 7 12:17 ipc -> ipc:[4026532465]
lrwxrwxrwx 1 root root 0 Jul 7 12:17 mnt -> mnt:[4026532463]
lrwxrwxrwx 1 root root 0 Jul 7 12:17 net -> net:[4026532299]
lrwxrwxrwx 1 root root 0 Jul 7 12:17 pid -> pid:[4026532466]
lrwxrwxrwx 1 root root 0 Jul 7 12:17 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Jul 7 12:17 uts -> uts:[4026532464]
root@dude2:~# ls /proc/self/ns -la
Lorsque je vérifie avec ip netns list
, je ne peux pas voir le nouvel espace de noms net.
dude@dude2:~/docker/testroot$ ip netns list
dude@dude2:~/docker/testroot$
Une idée pourquoi?
En effet, docker ne crée pas le lien symbolique requis:
# (as root)
pid=$(docker inspect -f '{{.State.Pid}}' ${container_id})
mkdir -p /var/run/netns/
ln -sfT /proc/$pid/ns/net /var/run/netns/$container_id
Ensuite, l’espace de noms netns du conteneur peut être examiné avec ip netns ${container_id}
, par exemple:
# e.g. show stats about eth0 inside the container
ip netns exec "${container_id}" ip -s link show eth0
Comme @jary l'indique, la commande ip netns
ne fonctionne qu'avec les liens symboliques d'espace de nom dans /var/run/netns
. Cependant, si vous avez la commande nsenter
disponible (dans le package util-linux
), vous pouvez effectuer la même chose en utilisant le PID de votre conteneur de menu fixe.
Pour obtenir le PID d'un conteneur de menu fixe, vous pouvez exécuter:
docker inspect --format '{{.State.Pid}}' <container_name_or_Id>
Pour obtenir une commande à l'intérieur de l'espace de noms réseau d'un conteneur:
nsenter -t <contanier_pid> -n <command>
Par exemple:
$ docker inspect --format '{{.State.Pid}}' weechat
4432
$ Sudo nsenter -t 4432 -n ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope Host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope Host
valid_lft forever preferred_lft forever
75: eth0@if76: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:1b brd ff:ff:ff:ff:ff:ff
inet 172.17.0.27/16 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::42:acff:fe11:1b/64 scope link
valid_lft forever preferred_lft forever
Ce qui précède équivaut à exécuter ip netns exec <some_namespace> ip addr show
.
Comme vous pouvez le voir ici, vous devrez exécuter nsenter
avec les privilèges root.
Similaire mais différent avec la réponse de @ jary.
Il n’est pas nécessaire d’introduire /proc/<pid>/
ou netster
. Un seul mouvement ci-dessous pour atteindre ce que vous voulez. Ainsi, vous pouvez utiliser l’espace de noms réseau des conteneurs de la même manière qu’ils sont créés manuellement sur la machine hôte.
Un mouvement:
ln -s /var/run/docker/netns /var/run/netns
Résultat:
Démarrer un conteneur:
docker run -tid ubuntu:18.04
Liste conteneur:
root@Light-G:/var/run# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
972909a27ea1 ubuntu:18.04 "/bin/bash" 19 seconds ago Up 18 seconds peaceful_easley
Répertoriez l'espace de noms réseau de ce conteneur:
root@Light-G:/var/run# ip netns list
733443afef58 (id: 0)
Supprimer le conteneur:
root@Light-G:/var/run# docker rm -f 972909a27ea1
972909a27ea1
Répéter la liste des espaces de noms réseau:
root@Light-G:/var/run# ip netns list
root@Light-G:/var/run#