1. 程式人生 > 其它 >20分鐘極簡入門Docker

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

應用容器化

這時候歸納一下應用容器化的過程:

  1. 首先獲取和編寫應用程式碼
  2. 為應用編寫Dockerfile
  3. 通過Dockerfile來構建應用的映象
  4. 將映象交付到物理機和雲端
  5. 最終測試和執行容器化應用。

Docker Registry

Docker Registry是映象儲存和分發的倉庫,以完成映象的搜尋、拉取和推送等操作。

推送一個映象:

  • docker push ubuntu(
  • docker push myregistrydomain:port/foo/bar(myregistrydomain:port)

拉取一個映象:

  • docker pull ubuntu(
  • 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可以有一個瞭解。