Docker架構和原理
1 Docker簡介
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後釋出到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面。2 為什麼用docker
1 更快速的交付和部署2 高效的部署和擴容
3 更高的資源利用率
4 更簡單的管理
3 docker引擎
docker引擎是一個c/s結構的應用,主要元件見下圖:
Server是一個常駐程序
REST API 實現了client和server間的互動協議
CLI 實現容器和映象的管理,為使用者提供統一的操作介面
4 Docker構架
Docker使用C/S架構,Client 通過介面與Server程序通訊實現容器的構建,執行和釋出。client和server可以執行在同一臺叢集,也可以通過跨主機實現遠端通訊。4 docke核心技術
4.1 核心技術架構
4.2 名字空間(Namespaces)
名字空間是 Linux 核心一個強大的特性。每個容器都有自己單獨的名字空間,執行在其中的應用都像是在獨立的作業系統中執行一樣。名字空間保證了容器之間彼此互不影響。1 pid 名字空間
不同使用者的程序就是通過 pid 名字空間隔離開的,且不同名字空間中可以有相同 pid。所有的 LXC 程序在Docker 中的父程序為Docker程序,每個 LXC 程序具有不同的名字空間。同時由於允許巢狀,因此可以很方便的實現巢狀的 Docker 容器。
2 net 名字空間
有了 pid 名字空間, 每個名字空間中的 pid 能夠相互隔離,但是網路埠還是共享 host 的埠。網路隔離是通過 net 名字空間實現的, 每個 net 名字空間有獨立的 網路裝置, IP 地址, 路由表, /proc/net 目錄。這樣每個容器的網路就能隔離開來。Docker 預設採用 veth 的方式,將容器中的虛擬網絡卡同 host 上的一 個Docker網橋 docker0 連線在一起。
3 ipc 名字空間
容器中程序互動還是採用了 Linux 常見的程序間互動方法(interprocess communication – IPC), 包括訊號量、訊息佇列和共享記憶體等。然而同 VM 不同的是,容器的程序間互動實際上還是 host 上具有相同 pid 名字空間中的程序間互動,因此需要在 IPC 資源申請時加入名字空間資訊,每個 IPC 資源有一個唯一的 32位 id。
4 mnt 名字空間
類似 chroot,將一個程序放到一個特定的目錄執行。mnt 名字空間允許不同名字空間的程序看到的檔案結構不同,這樣每個名字空間 中的程序所看到的檔案目錄就被隔離開了。同 chroot 不同,每個名字空間中的容器在 /proc/mounts 的資訊只包含所在名字空間的 mount point。
5 uts 名字空間
UTS(“UNIX Time-sharing System”) 名字空間允許每個容器擁有獨立的 hostname 和 domain name, 使其在網路上可以被視作一個獨立的節點而非 主機上的一個程序。
6 user 名字空間
每個容器可以有不同的使用者和組 id, 也就是說可以在容器內用容器內部的使用者執行程式而非主機上的使用者。
4.3 控制組(cgroups)
控制組(cgroups)是 Linux 核心的一個特性,主要用來對共享資源進行隔離、限制、審計等。只有能控制分配到容器的資源,才能避免當多個容器同時執行時的對系統資源的競爭。控制組技術最早是由 Google 的程式設計師 2006 年起提出,Linux 核心自 2.6.24 開始支援。
控制組可以提供對容器的記憶體、CPU、磁碟 IO 等資源的限制和審計管理。
4.4 聯合檔案系統(UnionFS)
聯合檔案系統(UnionFS)是一種分層、輕量級並且高效能的檔案系統,它支援對檔案系統的修改作為一次提交來一層層的疊加,同時可以將不同目錄掛載到同一個虛擬檔案系統下(unite several directories into asingle virtual filesystem)。聯合檔案系統是 Docker 映象的基礎。映象可以通過分層來進行繼承,基於基礎映象(沒有父映象),可以製作各種具體的應用映象。
另外,不同 Docker 容器就可以共享一些基礎的檔案系統層,同時再加上自己獨有的改動層,大大提高了儲存的效率。
Docker 中使用的 AUFS(AnotherUnionFS)就是一種聯合檔案系統。 AUFS 支援為每一個成員目錄(類似 Git 的分支)設定只讀(readonly)、讀寫(readwrite)和寫出(whiteout-able)許可權, 同時 AUFS 裡有一個類似分層的概念, 對只讀許可權的分支可以邏輯上進行增量地修改(不影響只讀部分的)。
Docker 目前支援的聯合檔案系統種類包括 AUFS, btrfs, vfs 和 DeviceMapper。
4.5 容器格式
最初,Docker 採用了 LXC 中的容器格式。自 1.20 版本開始,Docker 也開始支援新的 libcontainer 格式,並作為預設選項。對更多容器格式的支援,還在進一步的發展中。
5 參考資料
5.1 Docker安裝
1《CentsOS下安裝Docker》:https://www.cnblogs.com/wq3435/p/6479768.html5.2 Docker常用命令
1 《Docker 命令大全》:http://www.runoob.com/docker/docker-command-manual.html5.3 Docker(UnionFS)
1《深入分析Docker映象原理》:https://blog.csdn.net/xuguokun1986/article/details/792959472 《建立自己的Docker基礎映象》:http://www.cnblogs.com/cocowool/p/make_your_own_base_docker_image.html
3 《Linux檔案系統之aufs》:https://segmentfault.com/a/1190000008489207
4 《Container內不需要OS,為何需要OS的基礎映象?》:http://dockone.io/question/6
5 《淺談linux中的根檔案系統(rootfs的原理和介紹)》:https://blog.csdn.net/LEON1741/article/details/78159754
5.4 Docker原理與實現
1《Docker容器原理與實現》:https://wenku.baidu.com/view/9f5ab08df424ccbff121dd36a32d7375a417c63f.html2 《Docker 核心技術與實現原理》:https://draveness.me/docker
3《DOCKER基礎技術》:https://coolshell.cn/articles/17010.html
4 《Docker底層架構核心技術》:http://www.dockerinfo.net/698.html
5 《Docker的概念及剖析原理和特點》:http://blog.51cto.com/kangshuo/1930487