Docker

為什麼沒有檢測到我的命名空間?

  • August 26, 2022

我試著從家裡,然後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/runDocker 和./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

引用自:https://unix.stackexchange.com/questions/714951