程式設計 Docker開發完全自學手冊

2021-09-25 03:42:46 字數 3218 閱讀 5005

docker 是 paas 提供商 dotcloud 開源的乙個基於 lxc 的高階容器引擎,源**託管在 github 上, 基於go語言並遵從apache2.0協議開源。docker 是乙個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到乙個可移植的容器中,然後發布到任何流行的linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何介面。

乙個完整的docker有以下幾個部分組成:

詳細了解可以參考docker自學教程:docker完全自學手冊

docker核心解決的問題是利用lxc來實現類似vm的功能,從而利用更加節省的硬體資源提供給使用者更多的計算資源。同vm的方式不同, lxc 其並不是一套硬體虛擬化方法 - 無法歸屬到全虛擬化、部分虛擬化和半虛擬化中的任意乙個,而是乙個作業系統級虛擬化方法, 理解起來可能並不像vm那樣直觀。所以我們從虛擬化到docker要解決的問題出發,看看他是怎麼滿足使用者虛擬化需求的。

使用者需要考慮虛擬化方法,尤其是硬體虛擬化方法,需要借助其解決的主要是以下4個問題:

docker 使用客戶端-伺服器 (c/s) 架構模式,使用遠端api來管理和建立docker容器。docker 容器通過 docker 映象來建立。容器與映象的關係類似於物件導向程式設計中的物件與類形 

docker

物件導向

容器物件映象類

docker採用 c/s架構 docker daemon 作為服務端接受來自客戶的請求,並處理這些請求(建立、執行、分發容器)。 客戶端和服務端既可以執行在乙個機器上,也可通過 socket 或者restful api 來進行通訊。

docker daemon 一般在宿主主機後台執行,等待接收來自客戶端的訊息。 docker 客戶端則為使用者提供一系列可執行命令,使用者用這些命令實現跟 docker daemon 互動。 

creation of lightweight, private paas environments(建立輕量、私密的paas環境)

automated testing and continuous integration/deployment(實現自動化測試和持續的整合/部署)

由於其基於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等使用者資料不便收集

針對1-2,有windows base應用的需求的基本可以pass了; 3-5主要是看使用者的需求,到底是需要乙個container還是乙個vm, 同時也決定了docker作為 iaas 不太可行。

針對6,7雖然是docker本身不支援的功能,但是可以通過其他手段解決(disk quota, mount --bind)。總之,選用container還是vm, 就是在隔離性和資源復用性上做權衡。

另外即便docker 0.7能夠支援非aufs的檔案系統,但是由於其功能還不穩定,商業應用或許會存在問題,而aufs的穩定版需要kernel 3.8, 所以如果想複製dotcloud的成功案例,可能需要考慮公升級kernel或者換用ubuntu的server版本(後者提供deb更新)。這也是為什麼開源界更傾向於支援ubuntu的原因(kernel版本)

docker並非適合所有應用場景,docker只能虛擬基於linux的服務。windows azure 服務能夠執行docker例項,但到目前為止windows服務還不能被虛擬化。

可能最大的障礙在於管理例項之間的互動。由於所有應用元件被拆分到不同的容器中,所有的伺服器需要以一致的方式彼此通訊。這意味著任何人如果選擇複雜的基礎設施,那麼必須掌握應用程式設計介面管理以及集群工具,比如swarm、mesos或者kubernets以確保機器按照預期運轉並支援故障切換。

docker在本質上是乙個附加系統。使用檔案系統的不同層構建乙個應用是有可能的。每個元件被新增到之前已經建立的元件之上,可以比作為乙個檔案系統更明智。分層架構帶來另一方面的效率提公升,當你重建存在變化的docker映象時,不需要重建整個docker映象,只需要重建變化的部分。

可能更為重要的是,docker旨在用於彈性計算。每個docker例項的運營生命週期有限,例項數量根據需求增減。在乙個管理適度的系統中,這些例項生而平等,不再需要時便各自消亡了。

針對docker環境存在的不足,意味著在開始部署docker前需要考慮如下幾個問題。首先,docker例項是無狀態的。這意味著它們不應該承載任何交易資料,所有資料應該儲存在資料庫伺服器中。

其次,開發docker例項並不像建立一台虛擬機器、新增應用然後轉殖那樣簡單。為成功建立並使用docker基礎設施,管理員需要對系統管理的各個方面有乙個全面的理解,包括linux管理、編排及配置工具比如puppet、chef以及salt。這些工具生來就基於命令列以及指令碼。

fota空中公升級開發完全入門

問題 分割槽是怎麼掛載上去的?怎麼對於分割槽進行公升級和擦除 1.fota的分布拆分,具體的任務計畫 2.課程學習,學習總結 3.分割槽,檔案系統和啟動流程 啟動項 1 at指令的加入,以及at指令執行之後如何呼叫執行fota公升級 2 系統的啟動項 系統的啟動過程是什麼樣的?1 開機啟動的方式 參...

嵌入式Linux應用開發完全手冊

嵌入式linux應用開發完全手冊 真正完整版,我共享的別人的,追究責任本人概不負責!2010年10月19日更新!第乙個 http download.csdn.net source 2766528 第二個 http download.csdn.net source 2766532 第三個 http d...

嵌入式linux應用開發完全手冊(一)

第一篇 嵌入式linux開發環境構建 1.1.2 嵌入式發展 1.2 基於arm處理器的嵌入式linux系統 1.2.2 嵌入式作業系統 2.1 pc和嵌入式裝置交叉開發模式 在主機上編譯bootloader,然後通過jtag燒入單板 在主機上編譯嵌入式linux核心,通過bootloader燒入單...