從 傳統部署 到 Docker容器部署。html
Docker的原理
LXC,Linux原生支持的容器,追溯到2009年,源於 cgroup(資源限制) 和 namespaces(NS隔離)在Linux內核方面的發展。node
Linux Container容器是一種內核虛擬化技術,能夠提供輕量級的虛擬化,以便隔離進程和資源。linux
2013年,Docker橫空出世,Docker是啥呢? 就是一個基於LXC 的高級容器引擎。git
靖爺強調:Docker並非一項新技術,它是多項舊技術組合的能力。github
namespaces 隔離
- UTS (uname)
主要是用來進行hostname的資源隔離,在不一樣的UTS 的namespace 裏面hostname 能夠名字同樣,相互之間透明、不衝突;web
- PID(進程pid)
主要是用來進行進程資源的隔離,在不一樣的PID的namespace 裏面pid 相同的2個進程能夠存在,並且相互之間透明、不衝突docker
- IPC(inter-process-connection 進程之間通訊)
主要是用來進行進程直接通訊的隔離的,這個主要的做用是?(如今還不肯定:本身理解是隔離進程直接通訊,二用容器或者pod 來通訊)ubuntu
- NS(mnt) 文件系統隔離
容器在chroot 以後限制了進程只能讀寫指定的目錄,NS的namespace 則是文件的掛載和卸載只跟namespace 有關係,跟其餘的namespace 是透明的。網絡
- NET 網絡隔離
藉助namespace 能夠進行網絡接口的隔離,達到一個容器單獨一個「網卡」的效果;不一樣的namespace 的網卡的帶寬相互不影響架構
- 用戶權限(額外)
住宿機 Docker用戶 映射 Docker容器中的Root用戶。
目前須要較新的ubuntu版本支持。
舉例:
在宿主機中運行的C進程,經過visual studio遠程編譯到Linux上
使用namespace進行隔離,試演示主機名UTS、進程號PID等的隔離狀況
Dockerfile
NS(mnt) 文件系統隔離,將主機上的某個目錄與容器的某個目錄(稱爲掛載點、或者叫卷)關聯起來,容器上的掛載點下的內容就是主機的這個目錄下的內容,這相似linux系統下mount的機制。
Dockerfile分層文件系統
經過Dockerfile模擬製做出一個鏡像。
鏡像:
cms['./run.sh']
volume /data
add run.sh
from ubumtu:14.04
注:原理相似git的模式,均有一個提交id,分層次拉取有 變化 的鏡像內部文件。
舉例:
容器和宿主機中的 ps 與 top查看, 經過mount隔離 /proc 文件來實現。
Docker的四種網絡模式
- Host模式
這個容器將不會得到一個獨立的Network Namespace,而是和宿主機共用一個Network Namespace
- Container模式
這個模式指定新建立的容器和已經存在的一個容器共享一個 Network Namespace,而不是和宿主機共享。新建立的容器不會建立本身的網卡,配置本身的 IP,而是和一個指定的容器共享 IP、端口範圍等。一樣,兩個容器除了網絡方面,其餘的如文件系統、進程列表等仍是隔離的。兩個容器的進程能夠經過 lo 網卡設備通訊。
- None模式
使用none模式,Docker容器擁有本身的Network Namespace,可是,並不爲Docker容器進行任何網絡配置。也就是說,這個Docker容器沒有網卡、IP、路由等信息。須要咱們本身爲Docker容器添加網卡、配置IP等。
- Bridge模式
當Docker進程啓動時,會在主機上建立一個名爲docker0的虛擬網橋,此主機上啓動的Docker容器會鏈接到這個虛擬網橋上。虛擬網橋的工做方式和物理 交換機 相似,這樣主機上的全部容器就經過交換機連在了一個二層網絡中。(vethpair虛擬網卡)
CGroup 資源限制
Cgroups是control groups的縮寫,是Linux內核提供的一種能夠限制、記錄、隔離進程組(process groups)所使用的物理資源(如:CPU, Memory, IO等)的機制。
K8S(Kubernetes)原理
Google開源的容器集羣管理系統
架構圖解析
master APIs
node 節點(馬仔機)
scheduler 調度器,調度每一個馬仔機的kubectl
K8S的網絡
Flanrel
flannel使用etcd來維護分配的子網到實際的ip地址之間的映射。對於數據路徑,flannel 使用udp來封裝ip數據報,轉發到遠程主機。缺點是發包沒法跨路由器。
Calice
一個純三層的協議,爲OpenStack和Docker容器提供多主機間通訊。Calico不使用重疊網絡,使用虛擬路由代替虛擬交換,每一臺虛擬路由經過BGP協議傳播可達信息(路由)到剩餘數據中心。
參考資料
炒個冷飯LXC,試問Docker你憑啥這麼火?
http://www.techweb.com.cn/network/virtual/2016-03-01/2287475.shtml
在kubernetes中實現藍綠髮布
http://shareinto.github.io/2017/04/24/%E5%9F%BA%E4%BA%8Ekubernetes%E7%9A%84canary-deployment/