云原生系列「0」容器概述
一、Docker概述
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然后發布到任何流行的Linux或Windows 機器上,也可以實現虛擬化。1.1 什么是容器?
容器技術是一種虛擬化的方案。容器虛擬化也就是操作系統級別的虛擬化,只能運行相同或相似內核的操作系統。Docker使用的容器技術依賴于Linux內核的Namespaces和Cgroups和切根(chroot),這三個技術就是為了讓操作系統資源被區隔成獨立區間。
Docker能夠將開發的應用程序自動部署到容器
NameSpace
為確保提供的是輕量級虛擬化服務,Docker使用了NameSpace。命名空間提供了系統資源的隔離,資源包括進程、網絡、文件系統等。
在同一個Namespace下的進程可以感知彼此的變化,而對其他的Namespace一無所知。讓容器置身于獨立的系統環境中。
每個運行的容器都有自己的名稱空間。這是Linux操作系統默認提供的API,包括:
·PID Namespace:不同容器就是通過pid名字空間隔離開的,不同名字空間中可以有相同的pid。
·Mount Namespace:mount允許不同名稱空間的進程看到的文件結構不同,因此不同名稱空間中的進程所看到的文件目錄就被隔離了。另外,每個名稱空間中的容器在/proc/mounts的信息只包含當前名稱的掛載點。
·IPC Namespace:容器中進程交互還是采用Linux常見的進程交互方法(interprocess communication -IPC),包括信號量、消息隊列和共享內存等。
·Network Namespace:網絡隔離是通過Net實現,每個Net有獨立的網絡設備,IP地址,路由表,/proc/net目錄。這樣每個容器的網絡就能隔離開來。
·UTS Namespace:UTS(UNIX Time-sharing System)允許每個容器擁有獨立的hostname和domain name,使其在網絡上可以被視作一個獨立的節點而非主機上的一個進程。
·User Namespace:每個容器可以有不同的用戶和組id,也就是說可以在容器內用容器內部的用戶執行程序而非主機上的用戶。
Controller groups
是一種Linux提供用于限制,控制,管理資源的機制。
cgroups的功能:
- 資源限制:子系統可為進程組設置資源使用上限。
- 優先級設定:哪些進程組使用更多的資源。
- 資源計量:計算進程組都使用了多少的系統資源。
- 資源控制:能夠將進程組掛起和恢復。
Cgroups是Linux內核提供的一種可以限制、記錄、隔離進程組的物理資源機制。因為Namespace技術只能改變進程的視覺范圍,不能真實地對資源做出限制。所以就必須采用Cgroup技術對容器進行資源限制,防止某個容器把宿主機資源全部用完導致其它容器也宕掉。在Linux的/sys/fs/cgroup目錄中,有cpu、memory、devices、net_cls等子目錄,可以根據需要修改相應的配置文件來設置某個進程ID對物理資源的最大使用率。
切根(change to root):
切根的意思就是改變一個程序運行時參考的根目錄位置,讓不同容器在不同的虛擬根目錄下工作,從而相互不直接影響。
?在同一臺機器實現了文件系統、進程、網絡的隔離
1.3 虛擬機與容器的區別
、
相比于輕量級的容器,虛擬機會讓原本只需要幾十兆的應用卻要動用幾個G的龐然大物(操作系統)去支持。虛擬機需要模擬硬件的行為,會占用更多的資源。因為容器虛擬化了操作系統而不是硬件,導致便攜性和效率更高。
docker由內到外是docker daemon(守護進程),docker client(客戶端),container(容器),image(鏡像),network(網絡),data volumes(數據卷)?
下面章節也會按照這些點進行各個突破。
Docker的基本組成有:
- Docker Client 客戶端
- Docker Daemon 守護進程
- Docker Image 鏡像
- Docker Container 容器
- Docker Registry 倉庫
基于C/S架構,簡單來說,就是Docker客戶端向守護進程發送請求,守護進程處理后會返回結果
2.2 Docker Image鏡像
Docker鏡像就是一個Linux的文件系統(Root FileSystem),這個文件系統里面包含可以運行在Linux內核的程序以及相應的數據。
一般而言, Linux分為兩個部分:Linux內核(Linux Kernel)與用戶空間,而真正的Linux操作系統,是指Linux內核,我們常用的Ubuntu、CentOS等操作系統其實是不同廠商在Linux內核基礎上添加自己的軟件與工具集(tools)形成的發布版本(Linux Distribution)。
因此,我們也可以把鏡像看成是上面所說的用戶空間,當Docker通過鏡像創建一個容器時,就是將鏡像定義好的用戶空間作為獨立隔離的進程運行在宿主機的Linux內核之上。
這里要強調一下鏡像的兩個特征:
通過下面的示意圖,我可以更好地理解Docker鏡像與Linux的關系:
?在安裝了Docker之后,我們本地并沒有任何鏡像,當然我們可以自己構建,不過更方便還是從Docker官方提供的倉庫服務Docker Hub上拉取官方或第三方已經構建好的鏡像。大的公司一般會有自己的鏡像倉庫:你必須知道的Docker鏡像倉庫的搭建 - EdisonZhou - 博客園
拉取鏡像可以使用docker image pull,其格式如下:docker?image?pull?[OPTIONS]?NAME[:TAG|@DIGEST]
當然,docker image pull有更簡潔的用法:如:
docker?pull?[OPTIONS]?NAME[:TAG|@DIGEST]
要拉取鏡像,需要指定Docker Registry的URL和端口號,默認是Docker Hub,另外還需要指定倉庫名和標簽,倉庫名和標簽唯一確定一個鏡像,而標簽是可能省略,如果省略,則默認使用latest作為標簽名,而倉庫名則由作者名和軟件名組成。
二、容器發展史
容器發展簡史 - DockOne.io
雖然現在提到容器,大家就想到docker,但事實上容器是從1979年的Chroot Jail開始的。而docker是在2013年才開始推出第一個版本。大致發展史可以參考下圖。
?主要參考:
從0開始學Docker(上) - 知乎
容器技術簡述 - 知乎
Docker的三大核心組件:鏡像、容器與倉庫 - DockOne.io
總結
以上是生活随笔為你收集整理的云原生系列「0」容器概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 「大数据概述四」数据中台建设
- 下一篇: 云原生系列「三」容器网络