當前位置:編程學習大全網 - 圖片素材 - 微服務架構之「 容器技術 」

微服務架構之「 容器技術 」

現在壹聊到容器技術,大家就默認是指 Docker 了。但事實上,在 Docker 出現之前,PaaS社區早就有容器技術了,以 Cloud Foundry、OpenShift 為代表的就是當時的主流。

那為啥最終還是 Docker 火起來了呢?

因為傳統的PaaS技術雖然也可以壹鍵將本地應用部署到雲上,並且也是采用隔離環境(容器)的形式去部署,但是其兼容性非常的不好。因為其主要原理就是將本地應用程序和啟停腳本壹同打包,然後上傳到雲服務器上,然後再在雲服務器裏通過腳本啟動這個應用程序。

這樣的做法,看起來很理想。但是在實際情況下,由於本地與雲端的環境差異,導致上傳到雲端的應用經常各種報錯、運行不起來,需要各種修改配置和參數來做兼容。甚至在項目叠代過程中不同的版本代碼都需要重新去做適配,非常耗費精力。

然而 Docker 卻通過壹個小創新完美的解決了這個問題。在 Docker 的方案中,它不僅打包了本地應用程序,而且還將本地環境(操作系統的壹部分)也打包了,組成壹個叫做「 Docker鏡像 」的文件包。所以這個「 Docker鏡像 」就包含了應用運行所需的全部依賴,我們可以直接基於這個「 Docker鏡像 」在本地進行開發與測試,完成之後,再直接將這個「 Docker鏡像 」壹鍵上傳到雲端運行即可。

Docker 實現了本地與雲端的環境完全壹致,做到了真正的壹次開發隨處運行。

壹、容器到底是什麽?

容器到底是什麽呢?也許對於容器不太了解,但我們對虛擬機熟悉啊,那麽我們就先來看壹下容器與虛擬機的對比區別:

上圖的左側是虛擬機的原理,右側是Docker容器的原理。

虛擬機是在宿主機上基於 Hypervisor 軟件虛擬出壹套操作系統所需的硬件設備,再在這些虛擬硬件上安裝操作系統 Guest OS,然後不同的應用程序就可以運行在不同的 Guest OS 上,應用之間也就相互獨立、資源隔離了,但是由於需要 Hypervisor 來創建虛擬機,且每個虛擬機裏需要完整的運行壹套操作系統 Guest OS,因此這個方式會帶來很多額外資源的開銷。

而 Docker容器 中卻沒有 Hypervisor 這壹層,雖然它需要在宿主機中運行 Docker Engine,但它的原理卻完全不同於 Hypervisor,它並沒有虛擬出硬件設備,更沒有獨立部署全套的操作系統 Guest OS。

Docker容器沒有那麽復雜的實現原理,它其實就是壹個普通進程而已,只不過它是壹種經過特殊處理過的普通進程。

我們啟動容器的時候(docker run …),Docker Engine 只不過是啟動了壹個進程,這個進程就運行著我們容器裏的應用。但 Docker Engine 對這個進程做了壹些特殊處理,通過這些特殊處理之後,這個進程所看到的外部環境就不再是宿主機的那個環境了(它看不到宿主機中的其它進程了,以為自己是當前操作系統唯壹壹個進程),並且 Docker Engine 還對這個進程所使用得資源進行了限制,防止它對宿主機資源的無限使用。

那 Docker Engine 具體是做了哪些特殊處理才有這麽神奇的效果呢?

二、容器是如何做到資源隔離和限制的?

Docker容器對這個進程的隔離主要采用2個技術點:

弄清楚了這兩個技術點對理解容器的原理非常重要,它們是容器技術的核心。

下面來詳細解釋壹下:

三、容器的鏡像是什麽?

壹個基礎的容器鏡像其實就是壹個 rootfs,它包含操作系統的文件系統(文件和目錄),但並不包含操作系統的內核。

rootfs 是在容器裏根目錄上掛載的壹個全新的文件系統,此文件系統與宿主機的文件系統無關,是壹個完全獨立的,用於給容器進行提供環境的文件系統。

對於壹個Docker容器而言,需要基於 pivot_root 指令,將容器內的系統根目錄切換到rootfs上,這樣,有了這個 rootfs,容器就能夠為進程構建出壹個完整的文件系統,且實現了與宿主機的環境隔離,也正是有了rootfs,才能實現基於容器的本地應用與雲端應用運行環境的壹致。

另外,為了方便鏡像的復用,Docker 在鏡像中引入了層(Layer)的概念,可以將不同的鏡像壹層壹層的叠在壹起。這樣,如果我們要做壹個新的鏡像,就可以基於之前已經做好的某個鏡像的基礎上繼續做。

如上圖,這個例子中最底層是操作系統引導,往上壹層就是基礎鏡像層(Linux的文件系統),再往上就是我們需要的各種應用鏡像,Docker 會把這些鏡像聯合掛載在壹個掛載點上,這些鏡像層都是只讀的。只有最上面的容器層是可讀可寫的。

這種分層的方案其實是基於 聯合文件系統UnionFS(Union File System)的技術實現的。它可以將不同的目錄全部掛載在同壹個目錄下。舉個例子,假如有文件夾 test1 和 test2 ,這兩個文件夾裏面的文件 有相同的,也有不同的。然後我們可以采用聯合掛載的方式,將這兩個文件夾掛載到 test3 上,那麽 test3 目錄裏就有了 test1 和 test2 的所有文件(相同的文件有去重,不同的文件都保留)。

這個原理應用在Docker鏡像中,比如有2個同學,同學A已經做好了壹個基於Linux的Java環境的鏡像,同學S想搭建壹個Java Web環境,那麽他就不必再去做Java環境的鏡像了,可以直接基於同學A的鏡像在上面增加Tomcat後生成新鏡像即可。

以上,就是對微服務架構之「 容器技術 」的壹些思考。

碼字不易啊,喜歡的話不妨轉發朋友,或點擊文章右下角的“在看”吧。

  • 上一篇:為什麽電視裏最後的格格是艾雲香,那宣統帝的姐妹算什麽啊
  • 下一篇:站長之家-站長工具中seo綜合查詢中,哪個指數代表是網站的排名?
  • copyright 2024編程學習大全網