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