「容器」無疑是近年IT業界的buzzword,不過,在不一樣語境下,它對不一樣的人有不一樣的含義。在本文中,我將從Linux容器、容器鏡像、寫時複製等方面來闡釋容器的具體含義。git
Linux容器github
傳統意義上的Linux容器實際上只是Linux系統上的普通進程。這些進程組使用資源約束(控制組,即[cgroups])、Linux安全約束(Unix權限、功能、SELinux、AppArmor、seccomp等)和命名空間(PID、網絡、掛載等)與其餘進程組隔離開來。web
若是你啓動一個Linux系統而且查看使用cat /proc/PID/cgroup的任意進程,你將看到在cgroup中的某一進程。若是你查看 /proc/PID/status,則會看到其功能。若是你查看/ proc / self / attr / current,你將會獲取SELinux的標籤們。若是你查看/proc/PID/ns,你會在其中看到一系列命名空間的進程。安全
因此,若是你將容器定義爲具備資源限制、Linux安全約束以及命名空間的進程,那麼根據這必定義,Linux系統上的每一個進程都運行在容器中。這就是爲何有人說「Linux即容器,容器即Linux」。而容器運行時則是修改這些資源限制、安全約束以及命名空間,而且能夠啓動容器的程序。網絡
容器鏡像架構
Docker引入了容器鏡像的概念,這是一個標準的TAR文件,它包含了:app
Rootfs (容器根文件系統):在操做系統上帶有根目錄(/)標識的目錄,例如:/usr 、/var 、 /home 等等。框架
JSON文件(容器配置):JSON文件會來規定如何運行rootfs,例如:當容器啓動時應該在rootfs中運行什麼指令或entrypoint,應該爲容器設置什麼樣的環境變量,容器的工做目錄是什麼等等。工具
Docker基礎鏡像由根文件系統和JSON文件組成,能夠經過在基礎鏡像的根文件系統中安裝所需的內容,以更新JSON文件,而且新建一個鏡像層,經過這種方式能夠製做一個新的鏡像。學習
容器鏡像的定義最終由Open Container Initiative(OCI)標準化爲OCI鏡像規範。
用於構建容器鏡像的工具被稱爲容器鏡像構建器(如Dockerfile),有時容器引擎也可以完成構建容器鏡像的工做,固然也可使用一些能夠構建容器鏡像的獨立工具。
Docker獲取了這些容器鏡像(tarballs)而後將他們上傳到一個web服務中,你能夠從中拉取他們。而後Docker會開發一個協議以便你順利拉取這些鏡像,而這一web服務便被稱爲容器鏡像倉庫。
容器引擎能夠從容器鏡像倉庫中拉取鏡像,而後將其重組到容器存儲上。此外,容器引擎也能啓動容器運行時(以下圖)。
Copy On Write(COW)
容器存儲一般是一個寫時複製(COW)分層文件系統。當你從鏡像倉庫中拉取一個鏡像時,首先,你要從鏡像中提取rootfs而且將其放到磁盤上。若是你的鏡像由多層組成,那麼在COW文件系統中須要將下載的每一層鏡像文件儲存在不一樣的層中。COW文件系統容許每一層分開存儲,這將分層鏡像的共享最大化了。容器引擎一般支持不一樣類型的容器存儲,如overlay、devicemapper、 btrfs、 aufs和 zfs等。
容器運行時
容器引擎將容器鏡像下載到容器存儲中後,它須要建立一個容器運行時的配置文件。這一配置文件結合了來自調用程序/用戶的輸入以及容器鏡像規範的內容。舉個例子,調用程序可能想要對正在運行的容器進行指定的安全性修改、添加環境變量或者將volumes掛載到容器上,這些都是調用程序輸入的內容。
容器運行時配置和分解的rootfs一樣也被OCI標準化爲OCI運行時規範。
最後,容器引擎啓動讀取運行時規範的容器運行時,修改Linux cgroup、Linux安全約束以及命名空間,而且啓動容器命令以建立PID1(Process ID1)。此時,容器引擎能夠將stdin / stdout傳回調用程序並控制容器(如,中止、啓動、附加等)。
請注意,許多新的容器運行時正在讓Linux的不一樣部分來隔離容器。人們先可使用KVM分離(如迷你虛擬機)運行容器,或者可使用其餘hypervisor策略(例如,攔截容器進程中的全部系統調用)。既然咱們已經擁有一個標準的運行時規範,那麼就可以經過相同的容器引擎啓動這些工具。甚至Windows也可使用OCI運行時規範來啓動Windows容器。
容器編排引擎
容器編排引擎,相比其餘容器工具而言,則處於更高的級別。容器編排是用於協調多個不一樣節點上的容器執行工具。容器編排引擎能夠經過與容器引擎通訊以管理容器,如啓動容器而且將其網絡鏈接在一塊兒。它還可以監控容器以及在負載增長時啓動其餘容器。
Kubernetes是目前使用最爲普遍的容器編排引擎,被大量的中小型企業用戶用於開發或生產環境,而且已經成爲業界公認的容器編排管理的標準框架。可是原生的Kubernetes因其學習曲線陡峭對於大多數開發人員而言很難直接上手使用。Rancher做爲一個開源的企業級Kubernetes容器管理平臺,其簡潔直觀的界面風格和操做體驗能夠極大程度地解決這一問題。而且Rancher實現了Kubernetes集羣在混合雲+本地數據中心的集中部署與管理,能統一納管位於不一樣基礎架構上的Kubernetes集羣。此外,Rancher也將用戶的安全問題放在首位。Kubernetes於8月6日發佈新的補丁版本以後,Rancher反應迅速,在1天以後發佈了全新版本Rancher 2.2.7,修復了新近的CVE並支持Kubernetes新版本。
訪問Rancher Github主頁,瞭解更多新版本信息: