什么是docker
Docker 相比虛擬機的交付速度更快,資源消耗更低,Docker 采用客戶端/服務端架構,使用遠程API來管理和創建Docker容器,其可以輕松的創建一個輕量級的、可移植的、自給自足的容器,docker 的三大理念是build(構建)、ship(運輸)、 run(運行),Docker遵從aoache 2.0協議,并通過(namespace及cgroup等)來提供容器的資源隔離與安全保障等,所以Docke容器在運行時不需要類似虛擬機(空運行的虛擬機占用物理機6-8%性能)的額外資源開銷,因此可以大幅提高資源利用率,總而言之Docker是一種用了新穎方式實現的輕量級虛擬機.類似于VM但是在原理和應用上和VM的差別還是很大的,并且docker的專業叫法是應用容器(Application Container)。
Docker是CS架構,主要有兩個概念
Docker daemon: 運行在宿主機上,Docker守護進程,用戶通過Docker client(Docker命令)與Docker daemon交
Docker client: Docker 命令行工具,是用戶使用Docker的主要方式,Docker client與Docker daemon通信并將結果返回給用戶,Docker client也可以通過socket或者RESTful api訪問遠程的Docker daemon
了解了Docker的組成,再來了解一下Docker的三個主要概念:
Docker image:鏡像是只讀的,鏡像中包含有需要運行的文件。鏡像用來創建container,一個鏡像可以運行多個container;鏡像可以通過Dockerfile創建,也可以從Docker hub/registry上下載。
Docker container:容器是Docker的運行組件,啟動一個鏡像就是一個容器,容器是一個隔離環境,多個容器之間不會相互影響,保證容器中的程序運行在一個相對安全的環境中。
Docker hub/registry: 共享和管理Docker鏡像,用戶可以上傳或者下載上面的鏡像,官方地址為
https://registry.hub.docker.com/
,也可以搭建自己私有的Docker registry。
簡單歸納docker的組成
Docker 客戶端(Client):客戶端使用docker 命令或其他工具調用docker API。
Docker 服務端(Server):Docker守護進程,運行docker容器。
Docker 鏡像(Images):鏡像可以理解為創建實例使用的模板。
Docker 容器(Container): 容器是從鏡像生成對外提供服務的一個或一組服務。
Docker 倉庫(Registry): 保存鏡像的倉庫,類似于git或svn這樣的版本控制系統,官方倉庫: https://hub.docker.com/
Docker 主機(Host):一個物理機或虛擬機,用于運行Docker服務進程和容器。
image.png
Docker對比虛擬機:
資源利用率更高:一臺物理機可以運行數百個容器,但是一般只能運行數十個虛擬機。
開銷更小:不需要啟動單獨的虛擬機占用硬件資源。
啟動速度更快:可以在數秒內完成啟動。
image.png
- 使用虛擬機是為了更好的實現服務運行環境隔離,但是一個虛擬機只運行一個服務,很明顯資源利用率比較低。
Docker的優勢:
快速部署:短時間內可以部署成百上千個應用,更快速交付到線上。
高效虛擬化:不需要額外的hypervisor支持,直接基于linux 實現應用虛擬化,相比虛擬機大幅提高性能和效率。
節省開支:提高服務器利用率,降低IT 支出。
簡化配置:將運行環境打包保存至容器,使用時直接啟動即可。
快速遷移和擴展:可夸平臺運行在物理機、虛擬機、公有云等環境,良好的兼容性可以方便將應用從A宿主機遷移到B宿主機,甚至是A平臺遷移到B平臺。
Docker的缺點:
- 隔離性:各應用之間的隔離不如虛擬機。
docker(容器)的核心技術:
容器****規范:
- 除了docker之外的docker技術,還有coreOS的rkt,還有阿里的Pouch,為了保證容器生態的標志性和健康可持續發展,包括Google、Docker等公司共同成立了一個叫open container(OCI)的組織,其目的就是制定開放的標準的容器規范,目前OCI一共發布了兩個規范,分別是runtime spec和image format spec,有了這兩個規范,不通的容器公司開發的容器只要兼容這兩個規范,就可以保證容器的可移植性和相互可操作性。
容器****runtime:
runtime是真正運行容器的地方,因此為了運行不同的容器runtime需要和操作系統內核緊密合作相互在支持,以便為容器提供相應的運行環境。
-
目前主流的三種runtime:
- Lxc:linux上早期的runtime,Docker早期就是采用lxc作為runtime。
- runc:目前Docker默認的runtime,runc遵守OCI規范,因此可以兼容lxc。
- rkt:是CoreOS開發的容器runtime,也符合OCI規范,所以使用rktruntime也可以運行Docker容器。
容器****管理工具:
管理工具連接runtime與用戶,對用戶提供圖形或命令方式操作,然后管理工具將用戶操作傳遞給runtime執行。
Lxd是lxc的管理工具。
Runc的管理工具是docker engine,docker engine包含后臺deamon和cli兩部分,大家經常提到的Docker就是指的docker engine。
Rkt的管理工具是rkt cli。
容器****定義工具:
容器定義工具允許用戶定義容器的屬性和內容,以方便容器能夠被保存、共享和重建。
Docker image:是docker 容器的模板,runtime依據docker image創建容器。
Dockerfile:包含N個命令的文本文件,通過dockerfile創建出docker image。
ACI(App container image):與docker image類似,是CoreOS開發的rkt容器的鏡像格式。
Registry:
統一保存共享鏡像的地方,叫做鏡像倉庫。
Image registry:docker 官方提供的私有倉庫部署工具。
Docker hub:docker官方的公共倉庫,已經保存了大量的常用鏡像,可以方便大家直接使用。
Harbor:vmware 提供的自帶web的鏡像倉庫,目前有很多公司使用。
編排****工具:
當多個容器在多個主機運行的時候,單獨管理每個容器是相當負載而且很容易出錯,而且也無法實現某一臺主機宕機后容器自動遷移到其他主機從而實現高可用的目的,也無法實現動態伸縮的功能,因此需要有一種工具可以實現統一管理、動態伸縮、故障自愈、批量執行等功能,這就是容器編排引擎。
容器編排通常包括容器管理、調度、集群定義和服務發現等功能。
Docker swarm:docker 開發的容器編排引擎。
Kubernetes:google領導開發的容器編排引擎,內部項目為Borg,且其同時支持docker和CoreOS。
Mesos+Marathon:通用的集群組員調度平臺,mesos與marathon一起提供容器編排引擎功能。
docker(容器)的依賴技術:
容器網絡:
- docker自帶的網絡docker network僅支持管理單機上的容器網絡,當多主機運行的時候需要使用第三方開源網絡,例如calico、flannel等。
服務****發現:
- 容器的動態擴容特性決定了容器IP也會隨之變化,因此需要有一種機制開源自動識別并將用戶請求動態轉發到新創建的容器上,kubernetes自帶服務發現功能,需要結合kube-dns服務解析內部域名。
容器****監控:
- 可以通過原生命令docker ps/top/stats 查看容器運行狀態,另外也可以使heapster/ Prometheus等第三方監控工具監控容器的運行狀態。
數據****管理:
- 容器的動態遷移會導致其在不通的Host之間遷移,因此如何保證與容器相關的數據也能隨之遷移或隨時訪問,可以使用邏輯卷/存儲掛載等方式解決。
日志收集****:
- docker 原生的日志查看工具docker logs,但是容器內部的日志需要通過ELK等專門的日志收集分析和展示工具進行處理。
docker存儲引擎:
目前docker的默認存儲引擎為overlay2,需要磁盤分區支持d-type文件分層功能,因此需要系統磁盤的額外支持。
官方文檔關于存儲引擎的選擇文檔:https://docs.docker.com/storage/storagedriver/select-storage-driver
- Docker官方推薦首選存儲引擎為overlay2其次為devicemapper,但是devicemapper存在使用空間方面的一些限制,雖然可以通過后期配置解決,但是官方依然推薦使用overlay2,以下是網上查到的部分資料:https://www.cnblogs.com/youruncloud/p/5736718.html
image.png
- 如果docker數據目錄是一塊單獨的磁盤分區而且是xfs格式的,那么需要在格式化的時候加上參數-n ftype=1,否則后期在啟動容器的時候會報錯不支持d-type。
image.png
- 報錯界面:
image.png