為什麼沒有檢測到我的命名空間?
我試著從家裡,然後
sudo su -
ip netns exec 5bd337503b01 ip addr show Cannot open network namespace "5bd337503b01": No such file or directory
密碼顯示
/var/run/docker/netns
為什麼?
注意:
/var/run
是一個符號連結,/run
所以下面寫的並不重要。我將用於/var/run
Docker 和./run``ip netns
ip netns
在其專用/run/netns
目錄中掛載網路命名空間。Docker 使用不同的專用目錄/var/run/docker/netns
,因此ip netns
對 Docker 相關的任何內容一無所知,反之亦然。這兩種工具都不是為了操縱使用者提供的偽文件,也不是使這些偽文件可用。使用者提供名稱或雜湊值,並且不應該直接與這些掛載點混合:這是兩個工具中的實現細節,而不是被視為公共 API 的東西。儘管如此…可以做的是“複製”(使用綁定掛載)已掛載的網路命名空間,使其也出現在其中,
/run/netns/FOO
從而使其可用於ip netns exec FOO ...
和ip -n FOO ...
一罐:
- 使用具有子命令的最新
ip netns
版本attach
使用正在執行的容器的 PID 作為參考,將 PID 的命名空間(通過 可用
/proc/PID/ns/net
)掛載到別處。下面簡單地重用與網路命名空間掛載點名稱不同的容器名稱。這可以使用docker inspect
正確的 JSON 過濾器以程式方式完成。ip netns attach containername $(docker inspect --format '{{.State.Pid}}' containername)
要使用與 Docker 命名的網路命名空間相同的名稱而不是容器的名稱,可以使用(至少今天)
.NetworkSettings.SandboxKey
其值為/var/run/docker/XXXXXXXXXXXX
.ip netns attach "$(basename "$(docker inspect --format '{{.NetworkSettings.SandboxKey}}' containername)")" $(docker inspect --format '{{.State.Pid}}' containername)
- 舊版本
ip netns
不支持attach
至少創建一次netns命名空間以完成正確的配置(例如:
/run/netns
創建為共享傳播的掛載點):[ ! -e /run/netns ] && { ip netns add dummy; ip netns delete dummy; } # for correct initial setup
創建一個空文件並從上面檢索到的 PID 引用掛載命名空間
docker inspect
:touch /run/netns/containername mount --bind /proc/$(docker inspect --format '{{.State.Pid}}' containername)/ns/net /run/netns/containername
或者使用變體來重用 Docker 網路命名空間名稱而不是容器名稱:
touch /run/netns/$(basename "$(docker inspect --format '{{.NetworkSettings.SandboxKey}}' containername)") mount --bind /proc/$(docker inspect --format '{{.State.Pid}}' containername)/ns/net /run/netns/$(basename "$(docker inspect --format '{{.NetworkSettings.SandboxKey}}' containername)")
- 或者直接不使用程序 PID 也不
docker inspect
例如,讓所有目前可見的 Docker 掛載的網路命名空間可用於
ip netns
:[ ! -e /run/netns ] && { ip netns add dummy; ip netns delete dummy; } # for correct initial setup for i in /var/run/docker/netns/*; do netnsname="$(basename "$i")" touch /run/netns/"$netnsname" mount --bind "$i" /run/netns/"$netnsname" done
在刪除來自 Docker 和(using )的引用之前,此類可用的命名空間
ip netns
不會消失。應該使用來進行適當的清理,並且不會影響此網路命名空間,因為 Docker 仍在使用它:它只是刪除對其的掛載點引用,直到刪除所有引用,什麼都不會發生。ip netns``ip netns delete somenetnsname``ip netns delete somenetnsname