您好,登錄后才能下訂單哦!
Docker的底層原理是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
Docker 能實現(xiàn)這些功能,依賴于 chroot、namespace、cgroup 等三種老技術。我們本篇文章,就先聊一下 namespace 方面的東西。畢竟隔離是容器的第一要素。
Linux 的內核,提供了多達8種類型的 Namespace。在這些獨立的 Namespace 中,資源互不影響,隔離措施做的非常好。
1. 8種類型
我們先來看一下,Linux都支持哪些Namespace??梢酝ㄟ^ unshare 命令來觀察到這些細節(jié)。在終端執(zhí)行 man unshare,將會出現(xiàn)這些 Namespace 的介紹。
Mount(mnt) 隔離掛載點
Process ID (pid) 隔離進程 ID
Network (net) 隔離網絡設備,端口號等
Interprocess Communication (ipc) 隔離 System V IPC 和 POSIX message queues
UTS Namespace(uts) 隔離主機名和域名
User Namespace (user) 隔離用戶和用戶組
另外,Linux 在 4.6 版本,5.6 版本,分別加入了 cgroups 和 Time 兩種隔離類型,加起來就有8種。
Control group (cgroup) Namespace 隔離 Cgroups 根目錄 (4.6版本加入)
Time Namespace 隔離系統(tǒng)時間 (5.6版本加入)
2. 1個例子
通過unshare命令,可以快速建立一些隔離的例子,我們拿最簡單直觀的pid namespace來看一下它的效果。
眾所周知,Linux 進程號為1的,叫做systemd進程。但在 Docker 中,我們通過執(zhí)行ps命令,卻只能看到非常少的進程列表。
執(zhí)行下面的命令,進入隔離環(huán)境,并將 bash 作為根進程:
unshare --pid --fork --mount-proc /bin/bash
效果如圖所示??梢钥吹?,我們的 bash,已經成為了1號進程,而宿主機和其他隔離環(huán)境的進程信息,在這里是不可見的。
先在隔離環(huán)境中,執(zhí)行sleep 1000。再開一個終端,在宿主機上執(zhí)行pstree,我們將會看到這個隔離環(huán)境的進行信息。
接下來,在宿主機上,把 sleep 對應進程的命名空間信息,和宿主機的命名空間信息作一下對比??梢钥吹?,它們的pid namespace,對應的數(shù)值是不同的。
下面給出其他 namespace 的實驗性命令,你可以實際操作一下。
3. 試驗一下
unshare --mount --fork /bin/bash
創(chuàng)建mount namespace,并在每個不同的環(huán)境中,使用不同的掛載目錄。
unshare --uts --fork /bin/bash
uts 可以用來隔離主機名稱,允許每個 namespace 擁有一個獨立的主機名,你可以通過hostname命令進行修改。
unshare --ipc --fork /bin/bash
IPC Namespace 主要是用來隔離進程間通信的。Linux 的進程間通信,有管道、信號、報文、共享內存、信號量、套接口等方式。使用了 IPC 命名空間,意味著跨 Namespace 的這些通信方式將全部失效!不過,這也正是我們所希望的到的。
unshare --user -r /bin/bash
用戶命名空間,就非常好理解了。我們可以在一個 Namespace 中建立 xjjdog 賬號,也可以在另外一個 Namespace 中建立 xjjdog 賬號,而且它們是相互不影響的。
unshare --net --fork /bin/bash
net namespace,這個就非常有用了。它可以用來隔離網絡設備、IP 地址和端口等信息。
End
可以看到,通過各種 Namespace,Linux 能夠對各種資源進行精細化的隔離。Docker本身也是一個新瓶裝舊酒的玩具。Docker 的創(chuàng)新之處,在于它加入了一個中央倉庫,并封裝了很多易用的命令。
你可能會發(fā)現(xiàn),到目前為止,我們并沒有對 Cpu和內存的資源使用進行隔離,也沒有對應的 Namespace 來解決這些問題。
資源限制的功能,是使用Cgroups進行限額配置來完成的,和Namespace沒什么關系。我們將在后面的文章,介紹 Cgroups 這項技術。
最后,附上 Docker 的一張生命周期圖。來源(http://docker-saigon.github.io/post/Docker-Internals/ )。
看完上述內容,你們掌握Docker的底層原理是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。