1、Docker 簡介
Docker
啥是docker?
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的 Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。
起源
Docker 是 PaaS 提供商 dotCloud 開源的一個基於 LXC 的高級容器引擎,源代碼托管在 Github 上,基於go語言並遵從Apache2.0協議開源。
Docker自2013年以來非常火熱,無論是從 github 上的代碼活躍度,還是Redhat在RHEL6.5中集成對Docker的支持,就連 Google 的 Compute Engine 也支持 docker 在其之上運行。
Docker 架構
Docker 使用客戶端-服務器 (C/S) 架構模式,使用遠程API來管理和創建Docker容器。Docker 容器通過 Docker鏡像來創建。容器與鏡像的關系類似於面向對象編程中的對象與類。
Docker | 面向對象 |
---|---|
容器 | 對象 |
鏡像 | 類 |
Docker采用 C/S架構
Docker daemon
作為服務端接受來自客戶的請求,並處理這些請求(創建、運行、分發容器)。客戶端和服務端既可以運行在一個機器上,也可通過socket
或者RESTful API
來進行通信。
Docker daemon
一般在宿主主機後臺運行,等待接收來自客戶端的消息。Docker
客戶端則為用戶提供一系列可執行命令,用戶用這些命令實現跟Docker daemon
交互。
特性
在docker的網站上提到了docker的典型場景:
- Automating the packaging and deployment of applications(使應用的打包與部署自動化)
- Creation of lightweight, private PAAS environments(創建輕量、私密的PAAS環境)
- Automated testing and continuous integration/deployment(實現自動化測試和持續的集成/部署)
- Deploying and scaling web apps, databases and backend services(部署與擴展webapp、數據庫和後臺服務)
由於其基於LXC的輕量級虛擬化的特點,docker相比KVM之類最明顯的特點就是啟動快,資源占用小。因此對於構建隔離的標準化的運行環境,輕量級的PaaS(如dokku),構建自動化測試和持續集成環境,以及一切可以橫向擴展的應用(尤其是需要快速啟停來應對峰谷的web應用)。
- 構建標準化的運行環境,現有的方案大多是在一個baseOS上運行一套puppet/chef,或者一個image文件,其缺點是前者需要base OS許多前提條件,後者幾乎不可以修改(因為copy on write 的文件格式在運行時rootfs是read only的)。並且後者文件體積大,環境管理和版本控制本身也是一個問題。
- PaaS環境是不言而喻的,其設計之初和dotcloud的案例都是將其作為PaaS產品的環境基礎
- 因為其標準化構建方法(buildfile)和良好的REST API,自動化測試和持續集成/部署能夠很好的集成進來
- 因為LXC輕量級的特點,其啟動快,而且docker能夠只加載每個container變化的部分,這樣資源占用小,能夠在單機環境下與KVM之類的虛擬化方案相比能夠更加快速和占用更少資源
局限
Docker並不是全能的,設計之初也不是KVM之類虛擬化手段的替代品,簡單總結幾點:
- Docker是基於Linux 64bit的,無法在32bit的linux/Windows/unix環境下使用
- LXC是基於cgroup等linux kernel功能的,因此container的guest系統只能是linux base的
- 隔離性相比KVM之類的虛擬化方案還是有些欠缺,所有container公用一部分的運行庫
- 網絡管理相對簡單,主要是基於namespace隔離
- cgroup的cpu和cpuset提供的cpu功能相比KVM的等虛擬化方案相比難以度量(所以dotcloud主要是按內存收費)
- Docker對disk的管理比較有限
- container隨著用戶進程的停止而銷毀,container中的log等用戶數據不便收集
原理
Docker核心解決的問題是利用LXC來實現類似VM的功能,從而利用更加節省的硬件資源提供給用戶更多的計算資源。同VM的方式不同,LXC其並不是一套硬件虛擬化方法-無法歸屬到全虛擬化、部分虛擬化和半虛擬化中的任意一個,而是一個操作系統級虛擬化方法, 理解起來可能並不像VM那樣直觀。所以我們從虛擬化到docker要解決的問題出發,看看他是怎麽滿足用戶虛擬化需求的。
用戶需要考慮虛擬化方法,尤其是硬件虛擬化方法,需要借助其解決的主要是以下4個問題:
- 隔離性 - 每個用戶實例之間相互隔離, 互不影響。 硬件虛擬化方法給出的方法是VM, LXC給出的方法是container,更細一點是kernel namespace
- 可配額/可度量 - 每個用戶實例可以按需提供其計算資源,所使用的資源可以被計量。硬件虛擬化方法因為虛擬了CPU, memory可以方便實現, LXC則主要是利用cgroups來控制資源
- 移動性 - 用戶的實例可以很方便地復制、移動和重建。硬件虛擬化方法提供snapshot和image來實現,docker(主要)利用AUFS實現
- 安全性 - 這個話題比較大,這裏強調是host主機的角度盡量保護container。硬件虛擬化的方法因為虛擬化的水平比較高,用戶進程都是在KVM等虛擬機容器中翻譯運行的, 然而對於LXC, 用戶的進程是lxc-start進程的子進程, 只是在Kernel的namespace中隔離的, 因此需要一些kernel的patch來保證用戶的運行環境不會受到來自host主機的惡意入侵, dotcloud(主要是)利用kernel grsec patch解決的.
Docker
組成:
- Docker Client
- Docker Server
組件:
- 鏡像(Image)
- 容器(Container)
- 倉庫(Repository)
Docker 與 OpenStack 對比:
類別 | Docker | OpenStack |
---|---|---|
部署難度 | 非常簡單 | 組件多,部署復雜 |
啟動速度 | 秒級 | 分鐘級 |
執行性能 | 和物理系統幾乎一致 | VM會占用一些資源 |
鏡像體積 | 鏡像是MB級別 | 虛擬機鏡像GB級別 |
管理效率 | 管理簡單 | 組件相互依賴,管理復雜 |
隔離性 | 隔離性高 | 徹底隔離 |
客觀理性 | 但僅此鞥、不建議啟動SSH | 完全的系統管理 |
網絡連接 | 畢竟弱 | 借助Neutron可以靈活組件各類架構 |
Docker 能做什麽:
- 簡化配置
- 提高開發效率,減少構建開發環境的時間
- 服務器資源的整合,提高服務器的利用率
- 多租戶的環境下進行使用,給每個用戶使用不同的容器使用
- 快速部署,以此構建,到處運行
- 代碼流水線管理
- 開發調試調試工作
1、Docker 簡介