20分鐘極簡入門Docker
有錯誤請指出~
什麼是Docker
首先來介紹一下什麼是Docker,Docker是早於2013年釋出的開源專案,它藉助作業系統的虛擬化技術來實現應用間的資源隔離,從而應用能更加快速方便地打包和部署在任何地方。根據官網描述,Docker是一個藉助容器進行開發,部署和執行應用的工具,通俗來說,Docker容器好比一個集裝箱一樣,裡面存放了應用所需要的檔案和依賴,這種把應用標準化的過程被叫做為“容器化”。
Docker適合做什麼
對於開發人員來說,容器技術為應用的部署提供了沙盒環境,開發者可以在獨立的容器執行和管理應用程式程序,Docker提供的抽象層使得開發人員之間可以保持開發環境相對的一致,因此Docker適合用於應用隔離,搭建沙箱環境,此外,由於Docker容器的輕量化,它也被適用於進行持續整合和持續部署。
Container VS VM
人們經常用虛擬機器和容器來做比較,那麼它們兩之間有什麼區別呢?其實它們最核心的區別在於虛擬化資源的層面不一樣,虛擬機器是在硬體層之上實現虛擬化的,而容器則直接在作業系統之上實現虛擬化,從圖中可以看出,每個虛擬機器都需要在一個Guest OS之上,而容器則可以都處在同一個宿主機之上。
因為容器沒有虛擬機器造成的額外損耗,所以與虛擬機器對比,容器不僅執行效率更高,而且部署速度也更快。
Docker Engine
Docker Engine是用於執行和編排容器的基礎設施工具,我們平時說到的Docker大多數指的是Docker Engine,也就是在命令列和Docker進行互動的時候打交道的後臺程序。
這是Docker Engine目前的架構,Docker客戶端通過REST API與Docker Daemon來進行互動,Daemon把命令下發給containerd,containerd負責容器的生命週期管理以及映象管理等,而runc負責建立容器。
Docker首次釋出時,Docker Engine由兩個核心元件構成:LXC和Docker Daemon。Docker Daemon是單一的二進位制檔案,包含諸如 Docker客戶端、Docker API、容器執行時、映象構建等。LXC提供了對Namespace(資源隔離)和CGroup(資源限制)等基礎工具的操作能力,它們是基於Linux核心的容器虛擬化技術。
安裝Docker
安裝好Docker後,可以執行兩條命令檢視Docker環境以及版本資訊:
docker version
docker info
Docker映象
如果說Docker容器本質上是一個執行的程序以及它需要的一些依賴,而Docker映象則是定義容器的一個"模版",容器則是映象執行的一個例項。映象是一個打包好的檔案,裡面包含了應用程式執行所需的所有庫、配置和依賴。
Docker映象結構
所有的Docker映象都起始於一個基礎映象層,當進行修改或增加新的內容時,就會在當前映象層之上,建立新的映象層。以Dockerfile為例,每一行指令都產生一個新層。
映象由一個或多個只讀的映象層構建而成,每個映象層擁有獨立的雜湊值,Docker在拉取或推送映象時,會判斷哪幾層在本地或遠端已存在,避免不必要的操作。
Docker映象命令
我們可以通過下面這些命令進行一些Docker映象相關的基本操作。
Docker容器
容器是映象的一個執行的例項,使用者可以從單個映象上啟動一個或多個容器。
Docker容器的生命週期
容器在建立時進入Created狀態,執行後進入Running狀態,接著會進入到Pause狀態或Exited狀態,對已經退出的容器執行重啟操作會使容器進入Restarting狀態,隨後轉為Running狀態。
Docker容器操作
建立一個Docker容器https://www.zhihu.com/video/1166455714251264000
Dockerfile
Dockerfile是一個用以構建映象的文字檔案,它包括了一系列的執行用來表示當前應用的描述、依賴以及該如何執行這個應用,Docker Engine通過解析Dockerfile裡的指令,來構建一個Docker映象。
執行docker build命令會從頂層開始解析Dockerfile中的指令並逐行執行。而對每一條指令,Docker都會檢查快取中是否已經有與該指令對應的映象層。
編寫一個Dockerfilehttps://www.zhihu.com/video/1166455944463732736
多階段構建
當Dockerfile中包含多個FROM語句時,觸發多階段構建。使用多階段構建可以檔案從另一個階段複製到另一個階段,生成的映象將會是最後一個階段構建的結果。
這個功能在某些情況下會十分有用,比如我們在編譯應用時需要用到許多依賴,但想要保持映象儘可能地小,這時候就可以通過買二手QQ平臺地圖多階段構建來將編譯環境和執行環境分離,在最終生成的映象中只保留編譯好的可執行檔案。
Dockerfile多階段構建https://www.zhihu.com/video/1166456122667143168
應用容器化
這時候歸納一下應用容器化的過程:
- 首先獲取和編寫應用程式碼
- 為應用編寫Dockerfile
- 通過Dockerfile來構建應用的映象
- 將映象交付到物理機和雲端
- 最終測試和執行容器化應用。
Docker Registry
Docker Registry是映象儲存和分發的倉庫,以完成映象的搜尋、拉取和推送等操作。
推送一個映象:
- docker push ubuntu(http://docker.io)
- docker push myregistrydomain:port/foo/bar(myregistrydomain:port)
拉取一個映象:
- docker pull ubuntu(http://docker.io)
- docker pull myregistrydomain:port/foo/bar(myregistrydomain:port)
Docker資料管理
下面介紹一下Docker是怎麼管理和儲存資料的,Docker提供了3種方法將資料從宿主機掛載到容器:volumes,bind mounts和tmpfs mounts。其中volume適合在不同的容器中共享資料和資料遷移,bind mount適合宿主機與容器之間共享配置和程式碼,tmpfs適合不需要持久化資料的場景。
Docker網路
Docker基於CNM實現了網路模型,CNM模型由三個部分組成:Sandbox,Endpoint,Network。
Docker內建了以下幾種網路驅動,其中bridge橋接網路是Docker預設的網路驅動,在這種模式下,連線到同一個網橋的容器會使用同一個DNS解析服務,容器間可以使用這個解析服務來相互通訊,而overlay是swarm模式下預設的網路驅動。
Docker DNShttps://www.zhihu.com/video/1166460676783669248
Docker Machine
Docker Machine是一個用來在虛擬機器安裝Docker Engine的工具,以及通過命令列來管理和登入這些主機。
Docker Compose
Docker Compose是一個定義和執行多容器應用的工具,通過編寫Compose檔案來定義和配置應用,只需要用docker-compose一條命令就可以一次把所有定義好的服務啟動起來。
Docker Compose部署應用https://www.zhihu.com/video/1166457477158903808
Docker Swarm
Docker Swarm是Docker原生的叢集管理和排程工具,它把多個Docker主機抽象成單個虛擬的系統,開發者方便地可以通過Docker Swarm在多個主機上來排程和部署Docker容器。
在Swarm中有幾個概念,Node代表著Swarm叢集中的一個Docker主機,其中每個主機可以是Manager或者Worker兩個角色,他們分別代表管理節點和工作節點。Task可以理解為一個Docker容器以及其執行的命令,Service是一組Task的集合與定義,即執行在Node上的服務。
Docker Swarm提供了多種排程策略,來按需選擇將容器分配到不同的節點上。
使用Swarm部署應用https://www.zhihu.com/video/1166463996525010944
好了,希望看到這後你對Docker可以有一個瞭解。