如何查看 Docker 新版本中容器的名字空間
熟悉 Linux 技術的人都知道,容器只是利用名字空間進行隔離的進程而已,Docker 在容器實現上也是利用了 Linux 自身的技術。
有時候,我們需要在宿主機上對容器內進行一些操作,當然,這種繞過 Docker 的操作方式并不推薦。
如果你使用的是比較新的 Docker 版本,會尷尬的發現,直接使用系統命令,會無法訪問到容器名字空間。
這里,首先介紹下“ ip netns” 系列命令。這些命令負責操作系統中的網絡名字空間。
首先,我們使用 “add” 命令創建一個臨時的網絡名字空間。
- ip netns add test
然后,使用 show 命令來查看系統中的網絡名字空間,會看到剛創建的 test 名字空間。
- ip netns show
- test
另外,一個很有用的命令是 exec,會在對應名字空間內執行命令。例如
- ip netns exec test ifconfig
使用 del 命令刪除剛創建的 test 名字空間。
- ip netns del test
接下來運行一個 Docker 容器,例如
- docker run -it ubuntu
再次執行 ip netns show命令。很遺憾,這里什么輸出都沒有。
原因在于,Docker 啟動容器后仍然會以進程號創建新的名字空間,但在較新的版本里面,默認刪除了系統中的名字空間信息文件。
網絡名字空間文件位于 /var/run/netns 下面,比如我們之前創建的 test 名字空間,則在這個目錄下有一個 test 文件。諸如 netns 類似的系統命令依靠這些文件才能獲得名字空間的信息。
在容器啟動后,查看這個目錄,會發現什么都沒有。
OK,那讓我們手動重建它。
首先,使用下面的命令查看容器進程信息,比如這里的1234。
- docker inspect --format='{{. State.Pid}} ' container_id
- 1234
接下來,在 /proc 目錄(保存進程的所有相關信息)下,把對應的網絡名字空間文件鏈接到 /var/run/netns 下面
- ln -s /proc/1234/ns/net /var/run/netns/
然后,就可以通過正常的系統命令來查看或訪問容器的名字空間了。例如
- ip netns show
- 1234
- ip netns exec 1234 ifconfig eth0 172.16.0.10/16...