Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。當(dāng)用 docker run 啟動一個容器時,在后臺 Docker 為容器創(chuàng)建了一個獨立的名字空間和控制組集合。
名字空間提供了最基礎(chǔ)也是最直接的隔離,在容器中運行的進程不會被運行在主機上的進程和其它容器發(fā)現(xiàn)和作用。
每個容器都有自己獨有的網(wǎng)絡(luò)棧,意味著它們不能訪問其他容器的 sockets 或接口。不過,如果主機系統(tǒng)上做了相應(yīng)的設(shè)置,容器可以像跟主機交互一樣的和其他容器交互。當(dāng)指定公共端口或使用 links 來連接 2 個容器時,容器就可以相互通信了(可以根據(jù)配置來限制通信的策略)。
從網(wǎng)絡(luò)架構(gòu)的角度來看,所有的容器通過本地主機的網(wǎng)橋接口相互通信,就像物理機器通過物理交換機通信一樣。
那么,內(nèi)核中實現(xiàn)名字空間和私有網(wǎng)絡(luò)的代碼是否足夠成熟?
內(nèi)核名字空間從 2.6.15 版本(2008 年 7 月發(fā)布)之后被引入,數(shù)年間,這些機制的可靠性在諸多大型生產(chǎn)系統(tǒng)中被實踐驗證。
實際上,名字空間的想法和設(shè)計提出的時間要更早,最初是為了在內(nèi)核中引入一種機制來實現(xiàn) OpenVZ 的特性。 而 OpenVZ 項目早在 2005 年就發(fā)布了,其設(shè)計和實現(xiàn)都已經(jīng)十分成熟。