「docker」一、3分鐘快速理解什麼是docker容器

在容器技術沒有出來之前,開發運維在進行交付的時候經常出現,開發環境執行正常,生產環境部署運行出現問題,很多原因就是因為環境導致。還有部署環境太過於複雜,交付成本太高。容器技術的出現就像工業的集裝箱技術,大大提高了交付效率。

一、容器核心技術

一談到容器,我們都會想到 Docker。

Docker 現在幾乎是容器的代名詞。確實,是 Docker 將容器技術發揚光大。同時,我們也需要知道圍繞 Docker 還有一個生態系統。Docker 是這個生態系統的基石,但完善的生態系統才是保障 Docker 以及容器技術能夠真正健康發展的決定因素。

1、容器規範

容器不光是 Docker,還有其他容器,比如 CoreOS 的 rkt。為了保證容器生態的健康發展,保證不同容器之間能夠兼容,包含 Docker、CoreOS、Google在內的若干公司共同成立了一個叫 Open Container Initiative(OCI) 的組織,其目是制定開放的容器規範。

Advertisements

2、容器 runtime

runtime 是容器真正運行的地方。runtime 需要跟操作系統 kernel 緊密協作,為容器提供運行環境。

  • lxc、runc 和 rkt 是目前主流的三種容器 runtime。

  • lxc 是 Linux 上老牌的容器 runtime。Docker 最初也是用 lxc 作為 runtime。

  • runc 是 Docker 自己開發的容器 runtime,符合 oci 規範,也是現在 Docker 的默認 runtime。

  • rkt 是 CoreOS 開發的容器 runtime,符合 oci 規範,因而能夠運行 Docker 的容器。

3、容器管理工具

光有 runtime 還不夠,用戶得有工具來管理容器啊。容器管理工具對內與 runtime 交互,對外為用戶提供 interface,比如 CLI。這就好比除了 JVM,還得提供 java 命令讓用戶能夠啟停應用不是。

Advertisements

  • lxd 是 lxc 對應的管理工具。

  • runc 的管理工具是 docker engine。docker engine 包含後台 deamon 和 cli 兩個部分。我們通常提到 Docker,一般就是指的 docker engine。

  • rkt 的管理工具是 rkt cli。

4、容器定義工具

容器定義工具允許用戶定義容器的內容和屬性,這樣容器就能夠被保存,共享和重建。

  • docker image 是 docker 容器的模板,runtime 依據 docker image 創建容器。

  • dockerfile 是包含若干命令的文本文件,可以通過這些命令創建出 docker image。

  • ACI (App Container Image) 與 docker image 類似,只不過它是由 CoreOS 開發的 rkt 容器的 image 格式。

5、Registry

容器是通過 image 創建的,需要有一個倉庫來統一存放 image,這個倉庫就叫做 Registry。

  • Docker Hub(https://hub.docker.com) 是 Docker 為公眾提供的託管 Registry,上面有很多現成的 image,為 Docker 用戶提供了極大的便利。

  • Quay.io(https://quay.io/)是另一個公共託管 Registry,提供與 Docker Hub 類似的服務。

6、容器 OS

由於有容器 runtime,幾乎所有的 Linux、MAC OS 和 Windows 都可以運行容器。但這不並沒有妨礙容器 OS 的問世。

容器 OS 是專門運行容器的操作系統。與常規 OS 相比,容器 OS 通常體積更小,啟動更快。因為是為容器定製的 OS,通常它們運行容器的效率會更高。

目前已經存在不少容器 OS,CoreOS、atomic 和 ubuntu core 是其中的傑出代表。

二、說說容器

1、什麼是容器

容器是一種輕量級、可移植、自包含的軟體打包技術,使應用程序可以在幾乎任何地方以相同的方式運行。開發人員在自己筆記本上創建並測試好的容器,無需任何修改就能夠在生產系統的虛擬機、物理伺服器或公有雲主機上運行。

Containers vs. virtual machines

容器在 Host 操作系統的用戶空間中運行,與操作系統的其他進程隔離。這一點顯著區別於的虛擬機。

傳統的虛擬化技術,比如 VMWare, KVM, Xen,目標是創建完整的虛擬機。為了運行應用,除了部署應用本身及其依賴(通常幾十 MB),還得安裝整個操作系統(幾 GB)。

虛擬機和容器的區別

由於所有的容器共享同一個 Host OS,這使得容器在體積上要比虛擬機小很多。另外,啟動容器不需要啟動整個操作系統,所以容器部署和啟動速度更快,開銷更小,也更容易遷移。

2、為什麼使用容器

如今的系統在架構上較十年前已經變得非常複雜了。以前幾乎所有的應用都採用三層架構(Presentation/Application/Data),系統部署到有限的幾台物理伺服器上(Web Server/Application Server/Database Server)。

而今天,開發人員通常使用多種服務(比如 MQ,Cache,DB)構建和組裝應用,而且應用很可能會部署到不同的環境,比如虛擬伺服器,私有雲和公有雲。

一方面應用包含多種服務,這些服務有自己所依賴的庫和軟體包;另一方面存在多種部署環境,服務在運行時可能需要動態遷移到不同的環境中。這就產生了一個問題:

如何讓每種服務能夠在所有的部署環境中順利運行?

聰明的技術人員從傳統的運輸行業找到了答案。

幾十年前,運輸業面臨著類似的問題。

每一次運輸,貨主與承運方都會擔心因貨物類型的不同而導致損失,比如幾個鐵桶錯誤地壓在了一堆香蕉上。另一方面,運輸過程中需要使用不同的交通工具也讓整個過程痛苦不堪:貨物先裝上車運到碼頭,卸貨,然後裝上船,到岸后又卸下船,再裝上火車,到達目的地,最後卸貨。一半以上的時間花費在裝、卸貨上,而且搬上搬下還容易損壞貨物。

幸運的是,集裝箱的發明解決這個難題。

打一個比方,集裝箱(容器)對於遠洋運輸(應用運行)來說十分重要。集裝箱(容器)能保護貨物(應用),讓其不會相互碰撞(應用衝突)而損壞,也能保障當一些危險貨物發生規模不大的爆炸(應用崩潰)時不會波及其它貨物(應用)但是把貨物(應用)裝載在集裝箱(容器)中並不是一件簡單的事情。而出色的碼頭工人(Docker)的出現解決了這一問題。它(Docker)使得貨物裝載到集裝箱(容器)這一過程變得輕而易舉。對於遠洋運輸(應用運行)而言,用多艘小貨輪(虛擬機)代替原來的大貨輪(實體機)也能保證貨物(應用)彼此之間的安全,但是和集裝箱(容器)比,成本過高,但適合運輸某些重要貨物(應用)。

任何貨物,無論鋼琴還是保時捷,都被放到各自的集裝箱中。集裝箱在整個運輸過程中都是密封的,只有到達最終目的地才被打開。標準集裝箱可以被高效地裝卸、重疊和長途運輸。現代化的起重機可以自動在卡車、輪船和火車之間移動集裝箱。集裝箱被譽為運輸業與世界貿易最重要的發明。

Docker 將集裝箱思想運用到軟體打包上,為代碼提供了一個基於容器的標準化運輸系統。Docker 可以將任何應用及其依賴打包成一個輕量級、可移植、自包含的容器。容器可以運行在幾乎所有的操作系統上。

其實,「集裝箱」 和 「容器」 對應的英文單詞都是 「Container」。

「容器」 是國內約定俗成的叫法,可能是因為容器比集裝箱更抽象,更適合軟體領域的原故吧。

3、容器的優勢

對於開發人員

容器意味著環境隔離和可重複性。開發人員只需為應用創建一次運行環境,然後打包成容器便可在其他機器上運行。另外,容器環境與所在的 Host 環境是隔離的,就像虛擬機一樣,但更快更簡單。

對於運維人員

只需要配置好標準的 runtime 環境,伺服器就可以運行任何容器。這使得運維人員的工作變得更高效,一致和可重複。容器消除了開發、測試、生產環境的不一致性。

Advertisements

你可能會喜歡