linux - saber - El espacio de nombres de red de la ventana acoplable no es visible en la lista de redes IP
linux resolver nombre ip (3)
Como @jary indica, el comando ip netns
solo funciona con enlaces simbólicos de espacio de nombres en /var/run/netns
. Sin embargo, si tiene el comando nsenter
disponible (parte del paquete util-linux
), puede lograr lo mismo utilizando el PID de su contenedor docker.
Para obtener el PID de un contenedor docker, puede ejecutar:
docker inspect --format ''{{.State.Pid}}'' <container_name_or_Id>
Para obtener un comando dentro del espacio de nombres de red de un contenedor:
nsenter -t <contanier_pid> -n <command>
P.ej:
$ 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
Lo anterior fue equivalente a ejecutar ip netns exec <some_namespace> ip addr show
.
Como puede ver aquí, deberá ejecutar nsenter
con privilegios de root.
Cuando creo un nuevo contenedor docker como con
docker run -it -m 560m --cpuset-cpus=1,2 ubuntu sleep 120
y verifique sus espacios de nombres, puedo ver que se han creado nuevos espacios de nombres (ejemplo para 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
Cuando ip netns list
con ip netns list
no puedo ver el nuevo espacio de nombres de red.
dude@dude2:~/docker/testroot$ ip netns list
dude@dude2:~/docker/testroot$
¿Alguna idea de por qué?
Eso es porque la ventana acoplable no está creando el enlace simbólico requerido:
# (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
Luego, el espacio de nombres de netns del contenedor se puede examinar con ip netns ${container_id}
, por ejemplo:
# e.g. show stats about eth0 inside the container
ip netns exec "${container_id}" ip -s link show eth0
Similar pero diferente con la respuesta de @Jary.
No es necesario introducir /proc/<pid>/
o netster
. Solo un movimiento abajo para lograr lo que quieres. Por lo tanto, podría operar el espacio de nombres de la red de contenedores al igual que se crean manualmente en la máquina host.
Un movimiento:
ln -s /var/run/docker/netns /var/run/netns
Resultado:
Iniciar un contenedor:
docker run -tid ubuntu:18.04
Lista de contenedores:
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
Lista de espacio de nombres de red de este contenedor:
root@Light-G:/var/run# ip netns list
733443afef58 (id: 0)
Eliminar contenedor:
root@Light-G:/var/run# docker rm -f 972909a27ea1
972909a27ea1
Listar el espacio de nombres de red de nuevo:
root@Light-G:/var/run# ip netns list
root@Light-G:/var/run#