web-dev-qa-db-fra.com

espace de noms réseau docker non visible dans la liste ip netns

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?

27
christian

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
37
jary

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.

31
larsks

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#
2
Light.G