你應該知道的Docker基礎知識

Docker 是一個應用程序開發、部署、運行的平臺,使用 go 語言開發。相較於傳統的主機虛擬化,Docker 提供了輕量級的應用隔離方案,並且為我們提供了應用程序快速擴容、縮容的能力。

Docker Engine

先來看一下 Docker Engine 的結構,它是一個Client-Server應用程序,包含了三個主要部分:dockerd守護進程、REST API接口層、cli接口層(管理容器、鏡像、網絡、存儲等等)。

你應該知道的Docker基礎知識

Docker分層

image

Docker 架構

Docker採用的是CS架構,docker client 通過Unix套接字或者網絡接口訪問 docker daemon,從而完成容器、鏡像等內容的管理。

你應該知道的Docker基礎知識

image

Docker Daemon

Docker的守護進程監聽對於API的請求,並且管理Docker對象,包括容器、鏡像、網絡、存儲等。不同守護進程之間可以互相通信,從而構成集群服務。

Docker Client

Docker 客戶端 docker 命令是與Docker交互的主要方式。

Docker 倉庫

Docker倉庫保存Docker鏡像,可以通過docker pull以及docker push來下載、上傳鏡像文件。

Docker 對象

1. 鏡像

鏡像是一個用來構建容器的只讀模版,通常一個鏡像會依賴其他的鏡像。例如我們編寫的一個Node程序需要依賴Node環境,那在構建這個應用鏡像時就需要依賴基礎的Node鏡像。

我們可以創建自己的鏡像,也可以使用倉庫中已經創建好的鏡像。創建鏡像需要創建一個 Dockerfile 文件。每個Dockerfile定義鏡像文件中的一層,當定義發生變化的時候,只需要更新著一層的文件即可。

2. 容器

容器是一個運行時狀態下的鏡像,通過docker命令我們可以創建、啟動、停止、刪除容器。例如以下命令:

$ docker run -i -t ubuntu /bin/bash

實際上經過了6個步驟:1、如果本地沒有 ubuntu 鏡像,那麼首先執行 docker pull ubuntu鏡像文件到本地;2、自動創建一個容器,相當於命令 dock container create;3、Docker分配一塊文件系統給容器;4、Docker創建網絡接口、分配網絡地址;5、啟動容器,並且執行/bin/bash命令;6、我們可以在bash中執行命令,執行exit後,退出ubuntu的命令行,同時容器關閉。

3. 網絡

Docker的網絡子系統是可插拔的,支持bridge、host、overlay、macvlan、none等網絡模式。熟悉虛擬機的同學可能對這些有概念,想要了解更多參考這裡。

4. 存儲

默認情況下,容器中的應用生成的所有文件都存放在一個可寫的容器層,意味著這些數據的生命週期和容器保持一致,一旦容器重啟數據就丟了。另外,這些文件與容器高度關聯,想要將這些文件分享給其他的容器或者設備非常困難。

為此,Docker提供了兩種方案解決數據問題:Volumes、bind mount。不管使用哪種方式,容器內看起來都是一樣的,或者作為一個文件夾存在、或者作為一個文件存在。

上圖說明了不同方式的區別,Volumes 是存在本地文件系統中的一部分,其他應用程序不能對這個文件系統進行修改,Linux下在/var/lib/docker/volumes。這是數據持久化的最好方案。Bind Mount 允許將主機中任何位置的數據掛載,這些數據的讀寫沒有收到保護。tmps是存儲在主機內存中的數據。

技術依賴

Docker 嚴重依賴操作系統的虛擬化特性,主要包括以下幾點。

namespaces

Control Groups

Control Groups 也稱 cgroups,主要是解決Linux系統中進程間的資源隔離與權限訪問的相關問題。

Union file Systems

container format

容器格式是結合了namespace、cgroups、UnionFS在內的一個封裝。

本文為作者原創,如果您覺得本文對您有幫助,請隨意打賞,您的支持將鼓勵我繼續創作。


分享到:


相關文章: