精品国产一级在线观看,国产成人综合久久精品亚洲,免费一级欧美大片在线观看

當前位置:云計算技術專區(qū) → 正文

當我們談容器的時候,我們在談什么

責任編輯:cres 作者:鄭璐璐 |來源:企業(yè)網(wǎng)D1Net  2019-12-24 13:49:27 本文摘自:Java極客技術

Docker 在當下很火,那么,當我們談 Docker ,談容器的時候,我們在談什么?或者說,你對 Docker ,對容器了解嗎?容器,到底是怎么一回事兒?

Linux 容器

這篇文章著重來講一下 Linux 容器,為什么強調 Linux 容器,而不是 Docker ,是因為 Docker 是基于虛擬化技術來實現(xiàn)的,但是這篇文章涉及到 Linux 容器的核心實現(xiàn)方面,兩者不同,所以著重強調一下。

容器其實是一種沙盒技術。顧名思義,沙盒就是能夠像一個集裝箱一樣,把你的應用裝起來。這樣,應用與應用之間就有了邊界而不會相互干擾;同時裝在沙盒里面的應用,也可以很方便的被搬來搬去,這也是 PaaS 想要的最理想的狀態(tài)。但是說起來容易,等到真正實現(xiàn)起來的時候,就會有難度。因為容器是運行在宿主機上面的,當它運行起來的時候,需要加載到內存中,需要 CPU 完成加法操作等等。也就是說,如果想要實現(xiàn)真正意義上的容器,就要解決容器和宿主機真正隔離這樣的問題,但現(xiàn)實中這樣的問題還沒辦法解決。

既然問題還沒解決,那么我們所說的容器,是在說什么?容器的核心功能又什么?

容器核心功能

在上面已經說過,容器其實是一種沙盒技術,應用和應用之間有“邊界”。所以容器的核心功能,就是通過約束和修改進程的動態(tài)表現(xiàn),從而創(chuàng)造出一個"邊界"。

這個官方語言可能會有點兒難懂,咱們換個說法。容器用英語來說就是 Container ,而 Container 的另一個意思是集裝箱。提到集裝箱的時候,你的腦海里第一反應是不是大船停靠在岸邊,然后好多整齊劃一的箱子可以運來運去。為什么這些集裝箱可以很方便的運來運去呢?因為它們大小一致,而且是箱子,對吧?所以當我們使用 Container 來形容容器的時候,就是我們想要讓容器達到一個可以打包,符合標準的狀態(tài)。

基于以上,我覺得咱們可以達成一個共識,就是如果想要讓容器幫助我們達到一個可以打包,符合標準的狀態(tài)的話,首先要解決的是什么問題?就是將容器和容器之間隔離出來,這樣我才能對這個容器統(tǒng)一做一個操作,對不對。對于 Docker 等大多數(shù) Linux 容器來說,做到讓容器和容器之間隔離,主要是兩種技術:一種是看起來是隔離了的技術:Namespace 技術,它是用來修改進程視圖的主要方法,也就是說每個 namespace 中的應用看到的是不同的 IP 地址、用戶空間等;一種是用起來是隔離了的技術:Cgroups 技術,它是用來制造約束的主要手段,也就是說,我這臺服務器總共有 8G 的內存,都給這一個應用的話,其他的應用怎么跑起來呢?所以 Cgroups 技術就是對容器來做一個限制。

Namespace

Namespace 就是命名空間的意思,如果編程使用的是,面向對象的程序設計語言,那對于這個詞應該不是很陌生。一個團隊在一起寫代碼,難免會有相同的類,此時編譯就會沖突。如果每個功能都有自己的命名空間,那在不同的空間里面就算類名相同,也不會有啥沖突。寫程序如此,在 Linux 上跑程序也是如此。當我們在一臺 Linux 上跑多個進程時,進程有全局的進程 ID ,網(wǎng)絡也有全局的路由表。如果多個進程使用不同的路由策略,可能會導致這些進程沖突,解決辦法也很簡單,將這些進程放在一個獨立的 namespace 里面就可以了嘛。

說是這樣說,但是有一點我希望你能明確知道,進程在靜態(tài)狀態(tài)下就是程序,它只是磁盤上的二進制文件罷了。只有當它運行起來時,才成為進程。所以,當我們開始運行程序時,操作系統(tǒng)都會為進程分配一個進程編號,這個編號就是進程的唯一標識。假設我們開始運行了一個程序,它的 PID=100 。也就是說這個程序是第 100 個進程,在它前面還有 99 個進程。而現(xiàn)在,如果我們通過 Docker 把這個程序運行在一個容器當中,那么 Docker 就會在第 100 個進程創(chuàng)建時,給它施一個"障眼法",讓它永遠看不到其他 99 個進程,這樣這個程序就會誤以為自己是第 1 個進程 這種機制,其實就是對被隔離應用的進程空間做了手腳,使得這些進程只能看到重新計算過的進程編號,比如上面的第 100 個進程,經過 Docker 的"障眼法"之后,誤以為自己是第 1 個進程,但是實際上在宿主機的操作系統(tǒng)中,它還是原來的第 100 個進程。

容器限制( Cgroups )

Linux Cgroups 的全稱是 Linux Control Group 。它最主要的作用,就是限制一個進程組能夠使用的資源上限,包括 CPU ,內存,磁盤,網(wǎng)絡帶寬等。特別簡單的一句話就是,你的電腦只有 8G 內存,你會允許一個進程占用你的內存到 7G 嘛?一般情況下應該是不會吧,那樣的話,做其他事情不都卡的要死嘛,對不對。所以在 Linux 中,提供了一種技術,來控制進程組所能使用的資源。Cgroups 的有很多子系統(tǒng),每一項子系統(tǒng)都有自己獨有的資源限制能力,比如:

•blkio :為塊設備設定 I/O 限制,一般用于磁盤等設備;
•cpuset :為進程分配單獨的 CPU 核和對應的內存節(jié)點;
•memory :為進程設定內存使用的限制;
•cpu :使用調用程序為進程控制 CPU 的訪問;Linux Cgroups 的設計還是比較易用的,它就是一個子系統(tǒng)目錄加上一組資源限制文件的組合。對于 Docker 等 Linux 容器項目來說,它們只需要在每個子系統(tǒng)下面,為每個容器創(chuàng)建一個控制組(即創(chuàng)建一個新目錄),然后在啟動容器進程之后,把這個進程的 PID 填寫到對應控制組的 tasks 文件中就可以了。至于在這些控制組下面的資源文件里填什么值,那就交給用戶執(zhí)行 docker run 時的參數(shù)來指定了。

經過以上分析,我們可以了解到,容器這個聽起來玄而又玄的概念,實際上它就是操作系統(tǒng)上的一種特殊的進程而已。所以,容器本身并沒有價值,有價值的是"容器編排"。當我們在談容器的時候,其實我們在談如何更好的去編排容器。這也是為什么當下 k8s 這么火的原因。

容器與虛擬機異同

看到這里,你會不會有疑問,容器和虛擬機之間有什么不同呢?你可能看到過下面這個圖片:

在這張圖的左邊,畫出了虛擬機的工作原理,其中 Hypervisor 的軟件是虛擬機主要部分,它通過硬件虛擬化功能,將主機的 cpu ,內存, I/O 設備等虛擬出來,在這些虛擬的硬件上,安裝了一個新的操作系統(tǒng),也就是圖中的 GuestOS 。此時,用戶的應用進程就可以運行在這個虛擬的機器中,它能看到的也就只有 GuestOS 的文件和目錄,使用的也是這個機器里面的虛擬設備。這就是為什么虛擬機能夠將不同的應用進程相互隔離,因為它們所在的系統(tǒng)本來就不是同一個系統(tǒng)。

這張圖的右邊則是容器,它只由應用程序本身和它的環(huán)境依賴(庫和其他應用程序)兩部分組成,并且是直接在宿主機上運行的。當你想要啟動容器的時候,根本不需要啟動整個操作系統(tǒng),因為它本來就是在這個操作系統(tǒng)上的。而且,因為容器直接在宿主機上,所有容器都共享這個底層操作系統(tǒng),沒有另外新裝操作系統(tǒng),這就使得容器不管是在體積上,還是啟動速度方面,都會更快,開銷更小,也更加容易遷移。

還記得講容器的時候,介紹的 Namespace 技術嘛,虛擬機是真實存在的,你可以直接在自己的電腦上創(chuàng)建一個,但是容器不一樣,它沒有一個真正的“容器”運行在宿主機里面, Docker 項目幫助用戶啟動的,還是原來的應用進程,只是在創(chuàng)建這些進程時,加上了 Namespace 參數(shù)罷了,但是對于宿主機來說,本質還是進程罷了。

關鍵字:容器

本文摘自:Java極客技術

x 當我們談容器的時候,我們在談什么 掃一掃
分享本文到朋友圈
當前位置:云計算技術專區(qū) → 正文

當我們談容器的時候,我們在談什么

責任編輯:cres 作者:鄭璐璐 |來源:企業(yè)網(wǎng)D1Net  2019-12-24 13:49:27 本文摘自:Java極客技術

Docker 在當下很火,那么,當我們談 Docker ,談容器的時候,我們在談什么?或者說,你對 Docker ,對容器了解嗎?容器,到底是怎么一回事兒?

Linux 容器

這篇文章著重來講一下 Linux 容器,為什么強調 Linux 容器,而不是 Docker ,是因為 Docker 是基于虛擬化技術來實現(xiàn)的,但是這篇文章涉及到 Linux 容器的核心實現(xiàn)方面,兩者不同,所以著重強調一下。

容器其實是一種沙盒技術。顧名思義,沙盒就是能夠像一個集裝箱一樣,把你的應用裝起來。這樣,應用與應用之間就有了邊界而不會相互干擾;同時裝在沙盒里面的應用,也可以很方便的被搬來搬去,這也是 PaaS 想要的最理想的狀態(tài)。但是說起來容易,等到真正實現(xiàn)起來的時候,就會有難度。因為容器是運行在宿主機上面的,當它運行起來的時候,需要加載到內存中,需要 CPU 完成加法操作等等。也就是說,如果想要實現(xiàn)真正意義上的容器,就要解決容器和宿主機真正隔離這樣的問題,但現(xiàn)實中這樣的問題還沒辦法解決。

既然問題還沒解決,那么我們所說的容器,是在說什么?容器的核心功能又什么?

容器核心功能

在上面已經說過,容器其實是一種沙盒技術,應用和應用之間有“邊界”。所以容器的核心功能,就是通過約束和修改進程的動態(tài)表現(xiàn),從而創(chuàng)造出一個"邊界"。

這個官方語言可能會有點兒難懂,咱們換個說法。容器用英語來說就是 Container ,而 Container 的另一個意思是集裝箱。提到集裝箱的時候,你的腦海里第一反應是不是大船停靠在岸邊,然后好多整齊劃一的箱子可以運來運去。為什么這些集裝箱可以很方便的運來運去呢?因為它們大小一致,而且是箱子,對吧?所以當我們使用 Container 來形容容器的時候,就是我們想要讓容器達到一個可以打包,符合標準的狀態(tài)。

基于以上,我覺得咱們可以達成一個共識,就是如果想要讓容器幫助我們達到一個可以打包,符合標準的狀態(tài)的話,首先要解決的是什么問題?就是將容器和容器之間隔離出來,這樣我才能對這個容器統(tǒng)一做一個操作,對不對。對于 Docker 等大多數(shù) Linux 容器來說,做到讓容器和容器之間隔離,主要是兩種技術:一種是看起來是隔離了的技術:Namespace 技術,它是用來修改進程視圖的主要方法,也就是說每個 namespace 中的應用看到的是不同的 IP 地址、用戶空間等;一種是用起來是隔離了的技術:Cgroups 技術,它是用來制造約束的主要手段,也就是說,我這臺服務器總共有 8G 的內存,都給這一個應用的話,其他的應用怎么跑起來呢?所以 Cgroups 技術就是對容器來做一個限制。

Namespace

Namespace 就是命名空間的意思,如果編程使用的是,面向對象的程序設計語言,那對于這個詞應該不是很陌生。一個團隊在一起寫代碼,難免會有相同的類,此時編譯就會沖突。如果每個功能都有自己的命名空間,那在不同的空間里面就算類名相同,也不會有啥沖突。寫程序如此,在 Linux 上跑程序也是如此。當我們在一臺 Linux 上跑多個進程時,進程有全局的進程 ID ,網(wǎng)絡也有全局的路由表。如果多個進程使用不同的路由策略,可能會導致這些進程沖突,解決辦法也很簡單,將這些進程放在一個獨立的 namespace 里面就可以了嘛。

說是這樣說,但是有一點我希望你能明確知道,進程在靜態(tài)狀態(tài)下就是程序,它只是磁盤上的二進制文件罷了。只有當它運行起來時,才成為進程。所以,當我們開始運行程序時,操作系統(tǒng)都會為進程分配一個進程編號,這個編號就是進程的唯一標識。假設我們開始運行了一個程序,它的 PID=100 。也就是說這個程序是第 100 個進程,在它前面還有 99 個進程。而現(xiàn)在,如果我們通過 Docker 把這個程序運行在一個容器當中,那么 Docker 就會在第 100 個進程創(chuàng)建時,給它施一個"障眼法",讓它永遠看不到其他 99 個進程,這樣這個程序就會誤以為自己是第 1 個進程 這種機制,其實就是對被隔離應用的進程空間做了手腳,使得這些進程只能看到重新計算過的進程編號,比如上面的第 100 個進程,經過 Docker 的"障眼法"之后,誤以為自己是第 1 個進程,但是實際上在宿主機的操作系統(tǒng)中,它還是原來的第 100 個進程。

容器限制( Cgroups )

Linux Cgroups 的全稱是 Linux Control Group 。它最主要的作用,就是限制一個進程組能夠使用的資源上限,包括 CPU ,內存,磁盤,網(wǎng)絡帶寬等。特別簡單的一句話就是,你的電腦只有 8G 內存,你會允許一個進程占用你的內存到 7G 嘛?一般情況下應該是不會吧,那樣的話,做其他事情不都卡的要死嘛,對不對。所以在 Linux 中,提供了一種技術,來控制進程組所能使用的資源。Cgroups 的有很多子系統(tǒng),每一項子系統(tǒng)都有自己獨有的資源限制能力,比如:

•blkio :為塊設備設定 I/O 限制,一般用于磁盤等設備;
•cpuset :為進程分配單獨的 CPU 核和對應的內存節(jié)點;
•memory :為進程設定內存使用的限制;
•cpu :使用調用程序為進程控制 CPU 的訪問;Linux Cgroups 的設計還是比較易用的,它就是一個子系統(tǒng)目錄加上一組資源限制文件的組合。對于 Docker 等 Linux 容器項目來說,它們只需要在每個子系統(tǒng)下面,為每個容器創(chuàng)建一個控制組(即創(chuàng)建一個新目錄),然后在啟動容器進程之后,把這個進程的 PID 填寫到對應控制組的 tasks 文件中就可以了。至于在這些控制組下面的資源文件里填什么值,那就交給用戶執(zhí)行 docker run 時的參數(shù)來指定了。

經過以上分析,我們可以了解到,容器這個聽起來玄而又玄的概念,實際上它就是操作系統(tǒng)上的一種特殊的進程而已。所以,容器本身并沒有價值,有價值的是"容器編排"。當我們在談容器的時候,其實我們在談如何更好的去編排容器。這也是為什么當下 k8s 這么火的原因。

容器與虛擬機異同

看到這里,你會不會有疑問,容器和虛擬機之間有什么不同呢?你可能看到過下面這個圖片:

在這張圖的左邊,畫出了虛擬機的工作原理,其中 Hypervisor 的軟件是虛擬機主要部分,它通過硬件虛擬化功能,將主機的 cpu ,內存, I/O 設備等虛擬出來,在這些虛擬的硬件上,安裝了一個新的操作系統(tǒng),也就是圖中的 GuestOS 。此時,用戶的應用進程就可以運行在這個虛擬的機器中,它能看到的也就只有 GuestOS 的文件和目錄,使用的也是這個機器里面的虛擬設備。這就是為什么虛擬機能夠將不同的應用進程相互隔離,因為它們所在的系統(tǒng)本來就不是同一個系統(tǒng)。

這張圖的右邊則是容器,它只由應用程序本身和它的環(huán)境依賴(庫和其他應用程序)兩部分組成,并且是直接在宿主機上運行的。當你想要啟動容器的時候,根本不需要啟動整個操作系統(tǒng),因為它本來就是在這個操作系統(tǒng)上的。而且,因為容器直接在宿主機上,所有容器都共享這個底層操作系統(tǒng),沒有另外新裝操作系統(tǒng),這就使得容器不管是在體積上,還是啟動速度方面,都會更快,開銷更小,也更加容易遷移。

還記得講容器的時候,介紹的 Namespace 技術嘛,虛擬機是真實存在的,你可以直接在自己的電腦上創(chuàng)建一個,但是容器不一樣,它沒有一個真正的“容器”運行在宿主機里面, Docker 項目幫助用戶啟動的,還是原來的應用進程,只是在創(chuàng)建這些進程時,加上了 Namespace 參數(shù)罷了,但是對于宿主機來說,本質還是進程罷了。

關鍵字:容器

本文摘自:Java極客技術

電子周刊
回到頂部

關于我們聯(lián)系我們版權聲明隱私條款廣告服務友情鏈接投稿中心招賢納士

企業(yè)網(wǎng)版權所有 ©2010-2024 京ICP備09108050號-6 京公網(wǎng)安備 11010502049343號

^
  • <menuitem id="jw4sk"></menuitem>

    1. <form id="jw4sk"><tbody id="jw4sk"><dfn id="jw4sk"></dfn></tbody></form>
      主站蜘蛛池模板: 石狮市| 南城县| 高邮市| 平原县| 武义县| 元谋县| 顺昌县| 天全县| 广州市| 光山县| 修武县| 高密市| 八宿县| 普洱| 禹城市| 贺州市| 成武县| 沙洋县| 峨眉山市| 梓潼县| 玛纳斯县| 安丘市| 绥宁县| 和政县| 台南市| 襄汾县| 杭锦后旗| 商南县| 托里县| 惠来县| 安徽省| 定兴县| 湖州市| 鹿泉市| 鄯善县| 金华市| 赤壁市| 鹤山市| 新龙县| 曲沃县| 房产|