Hello Docker

風靈使發表於2018-08-20

這裡寫圖片描述

Docker: Build, Ship, and Run Any App, Anywhere
在任何地方構建、交付和執行任何應用

1. 引言

最近簡單的學習了下Docker,本文先簡要梳理下Docker涉及到的一些重要概念,後續在結合.NET Core探討其基本用法。

2. What’s Docker

Docker是用GO語言編寫,利用Linux核心的幾個特性來提供它的功能。Docker是一個開放平臺用於快速開發、分發和部署應用程式。它提供了一個作業系統級別的抽象。它隔離了應用程式對基礎架構(作業系統等)的依賴。解決了生產、測試、部署環境的一致性問題。

Docker提供了容器(鬆耦合且隔離的環境)去打包和執行應用程式。良好的安全性和隔離性允許我們在一個主機上執行多個容器。因為容器是直接在宿主機器的核心中執行且不需要額外的管理程式的負載(比如虛擬機器需要VMware管理程式),所以說容器是輕量級的。

3. Docker Engine

Docker Engine

從圖中可知,Client使用docker CLI(命令列工具)通過Docker REST API去和docker daemondocker的守護程式)進行互動,docker daemon負責去建立和管理Docker objects(比如映象、容器、網路和儲存卷等)。

4. Docker的適用場景

8 Dockers Use Case

快速、一致地交付應用
Docker通過使用容器(其提供應用程式和服務)來提供標準化的工作環境來精簡開發週期。容器在持續整合和持續開發(CI/CD)中十分有用。
考慮以下示例場景:

  1. 開發人員在本地編寫程式碼,並使用Docker容器與同事分享他們的工作。
  2. 開發人員使用Docker將應用程式推入測試環境,並執行自動和手動測試。當開發人員發現錯誤時,他們可以在開發環境中修復它們,並將其重新部署到測試環境進行測試和驗證。
  3. 完成測試後,將修復程式推送給客戶就如同將更新的映象推送到生產環境一樣簡單。

響應式部署和縮放

Docker的可移植性和輕量級特性也使得動態管理工作負載變得非常容易,幾乎可以實時地按業務需求對應用程式和服務進行擴充套件和收縮。

在同一硬體執行多個工作負載
Docker的輕量級及執行快速的特性,允許我們用更少的資源做更多的事情,最大化的使用計算機的資源。Docker是高密度環境和中小型部署的理想選擇。

5. Docker架構

Docker Architecture

從圖中我們可以看出,Docker是一個C/S架構。客戶端通過REST APIDocker的守護程式進行互動,守護程式從Registry(倉庫,如DockerHub)拉取映象,再構建、執行和分發容器等。

6. Docker VS Vitual Machine

首先,Docker是一種容器管理技術,而非虛擬化技術。與我們熟知的虛擬機器有著本質區別:
Docker And VM

通過上圖可知,Docker是基於Docker引擎通過共享宿主機的硬體資源,使用容器來提供獨立執行環境來執行應用程式!而VM則是基於Supervisor(虛擬機器管理程式)使用虛擬機器技術來提供隔離的虛擬機器,在虛擬機器的作業系統上提供執行環境!雖然兩者都提供了很好的資源隔離,但很明顯Docker的虛擬化開銷更低!

7. 核心術語

下面我們就來重點梳理下Docker涉及到的一些核心術語:Registry、Image、Container、Stack、Service、Swarm
Registry(倉庫)
Docker Registry 用來儲存Docker映象,比如Docker官方的Docker Hub就是一個公開的倉庫。在上面我們可以找到我們想要的映象。當然我們也可以建立私有的映象倉庫。
當我們執行Docker pullDocker run命令時,若本地無所需的映象,那麼將會從倉庫(一般為DockerHub)下載(pull)一個映象。Docker執行run方法得到一個容器,使用者在容器裡執行各種操作。Docker執行commit方法將一個容器轉化為映象。Docker利用loginpush等命令將本地映象推送(push)到倉庫。其他機器或伺服器上就可以使用該映象去生成容器,進而執行相應的應用程式。
另外,我們可以在Docker Store進行映象交易。

Image(映象)
映象是自讀的,用於建立Docker容器。我們可以基於一個映象做一些額外的自定義更改後,commit成我們自己的映象。也可以使用Dockerfilebuild成我們自己的映象。Docker使用映象分層技術,Dockerfile中的每個指令都會建立為映象中的一個層。

映象分層技術

Container(容器)
容器是docker中最重要的概念,Container是映象的執行例項,它是一個隔離的、資源受控的可移植的執行時環境,其中包含作業系統、需要執行的程式、執行程式的相關依賴、環境變數等。我們可以通過docker run <image>建立指定映象的容器,建立容器時會在映象上附加一個讀寫層。我們可以連線容器到一個或多個網路,併為其附加儲存,或基於它當前狀態建立一個新的映象。Docker使用namespace的技術來實現容器之間的隔離!對於容器的更改是暫時的,當容器停止時,相應的改動就會丟失。我們可以通過掛載volume來持久化儲存!

Docker Swarm(Docker叢集)

Docker SwarmDocker 的獨立原生叢集工具的名稱。Docker Swarm 將多個Docker主機叢集並將它們暴露為單個虛擬的Docker主機。

Service(服務)
通過服務我們可以很好進行容器擴充套件,預設情況下,服務在Swarm下的所有工作節點之間進行負載平衡。在Docker中我們通過編寫docker-compose.yml來定義、執行和擴充套件服務。

Stack(服務堆)
Stack是一組相互關聯的服務,它們可以共享依賴關係,並且可以一起協調和縮放。單個Stack能夠定義和協調整個應用程式的功能。