次のような新しいdockerコンテナを作成すると
docker run -it -m 560m --cpuset-cpus=1,2 ubuntu sleep 120
その名前空間を確認すると、新しい名前空間が作成されていることがわかります(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
ip netns list
で確認すると、新しいネット名前空間が表示されません。
dude@dude2:~/docker/testroot$ ip netns list
dude@dude2:~/docker/testroot$
理由は何ですか?
これは、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
次に、コンテナのnetns名前空間をip netns ${container_id}
で調べることができます。例:
# e.g. show stats about eth0 inside the container
ip netns exec "${container_id}" ip -s link show eth0
@jaryが示すように、ip netns
コマンドは/var/run/netns
の名前空間シンボリックリンクでのみ機能します。ただし、nsenter
コマンド(util-linux
パッケージの一部)を使用できる場合は、DockerコンテナのPIDを使用して同じことを実現できます。
Dockerコンテナの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: 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
上記はip netns exec <some_namespace> ip addr show
の実行と同等でした。
ここでわかるように、nsenter
をルート権限で実行する必要があります。
@jaryの回答と似ていますが異なります。
紹介する必要はありません/proc/<pid>/
またはnetster
。あなたが望むものを達成するために1つ下に移動します。したがって、コンテナのネットワーク名前空間は、ホストマシンで手動で作成されるのと同じように操作できます。
ワンムーブ:
ln -s /var/run/docker/netns /var/run/netns
結果:
コンテナを開始します。
docker run -tid ubuntu:18.04
リストコンテナ:
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
このコンテナのネットワーク名前空間をリストします。
root@Light-G:/var/run# ip netns list
733443afef58 (id: 0)
コンテナを削除:
root@Light-G:/var/run# docker rm -f 972909a27ea1
972909a27ea1
ネットワーク名前空間を再度リストします。
root@Light-G:/var/run# ip netns list
root@Light-G:/var/run#