Пространство имен докеров не отображается в списке ip netns
Когда я создаю новый контейнер докеров, например
docker run -it -m 560m --cpuset-cpus=1,2 ubuntu sleep 120
и проверить его пространства имен, я вижу, что новые пространства имен были созданы (пример для pid 7047).
[email protected]:~# 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]
[email protected]:~# ls /proc/self/ns -la
Когда я проверяю с помощью ip netns list
, я не вижу новое пространство имен.
[email protected]:~/docker/testroot$ ip netns list
[email protected]:~/docker/testroot$
Любая идея, почему?
Ответы
Ответ 1
Это потому, что docker не создает требуемую символическую ссылку:
# (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
Затем пространство имен net net контейнеров можно проверить с помощью ip netns ${container_id}
, например:
# e.g. show stats about eth0 inside the container
ip netns exec "${container_id}" ip -s link show eth0
Ответ 2
Как указывает @jary, команда ip netns
работает только с символическими символами пространства имен в /var/run/netns
. Однако, если у вас есть команда nsenter
, доступная (часть пакета util-linux
), вы можете выполнить то же самое, используя PID вашего контейнера докеров.
Чтобы получить PID контейнера докера, вы можете запустить:
docker inspect --format '{{.State.Pid}}' <container_name_or_Id>
Чтобы получить команду внутри пространства имен сети контейнера:
nsenter -t <contanier_pid> -n <command>
например:
$ 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: [email protected]: <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
Выше было эквивалентно запуск ip netns exec <some_namespace> ip addr show
.
Как вы можете видеть здесь, вам нужно запустить nsenter
с привилегиями root.