跳至主要内容

1.5 Docker 的基礎架構

下方為整個 Docker 的基礎架構:

Docker 架構圖

Docker 本身使用的是主從式架構 ( Client - Server ),Docker Client 與 Docker Daemon 進行對話,後者負責組織整個 Docker 物件運行的重任。

基礎的 Docker Client 以及 Docker Daemon 是運作在同個作業系統上,當然也可以將 Docker Client 連接到遠端的 Docker Daemon。

Docker Client 和 Docker Daemon 之間使用的是 REST API,透過 UNIX 的 socket 以及網路介面進行通訊,另一個 Docker Client 是之後會提到的 Docker Compose,他可以讓你簡單管理由不同容器所組成的應用程式。

Docker Daemon​

負責監聽 Docker API 的請求並且管理 Docker 的物件,像是映像檔( Image )、容器 ( Container )、虛擬網路 ( Network ) 以及 Volume,還可以和其他的 Daemon 進行通訊,管理 Docker 整體服務。

Docker Client​

是大部分用戶和 Docker 互動的主要方式,當你使用 docker container run 的指令時,Client 就會將這段指令透過 REST API 發送給 Docker Daemon,並由其執行背後程序,一個 Client 可以和一個以上的 Daemon 通訊。

Docker Registries​

Docker Registry

Docker Registry 是專門儲存映像檔的倉庫,DockerHub 則是任何人都可以用的公共倉庫 ( 像是 Github ),Docker 本身預設就是在 DockerHub 上面尋找映像檔,這在之後的 Docker 映像檔篇 會有詳細的解說。

您也可以建立屬於自己的私人倉庫,來存放一些只屬於公司內部或是自己的映像檔。

當您使用 docker pull 或是 docker container run 的指令時,所需的映像檔就會從設定好的倉庫中拉出,當你用 docker push 時,映像檔就會被推送到您設置的倉庫當中,沒有設定的情況下倉庫都預設為 DockerHub。

Docker 物件​

接著就是我們在整本書中最常使用到的幾個 Docker 物件,至於『 物件 』這個詞,我自己非常喜歡,因為 Docker 使用起來就像是樂高積木一樣,可以自由的操控每一個物件的組裝。

而在接下來的書中,盡量都會用中文的方式來解釋 Docker 的物件。

例如:映像檔 ( Image ) 在之後的文章中就不再以 Image 出現,而是用映像檔;而像是 Volume ( 容積 ) 翻譯後閱讀起來不順暢的字詞,就會改用英文來呈現。

映像檔 ( Image )​

映像檔本身是一個唯讀的樣板搭配一長串的指令,大部分情況下,一個映像檔是基於另外一個映像檔 ( 大部分都是使用官方映像檔 ) 並加上了一些額外的參數所建立。

舉例來說,你可以建立一個基於 Ubuntu 的映像檔,在裡面利用指令安裝任何你需要的套件,像是 vim,git 等等,並打包成自己的映像檔,運行成容器時,就會擁有 vim,git 等套件的功能。

您當然可以製作屬於自己的映像檔,也可以使用那些別人建置並發佈在 DockerHub 的映像檔,但要記得挑選有認證過的映像檔,就可以大幅度地避開安全性的考量。

但如果您要建立屬於自己的映像檔,就需要撰寫 Dockerfile,這在 Docker 映像檔篇 會有詳細的解說,可以說是上手 Docker 的基礎,只需要用簡單的語法來定義映像檔以及運行成容器所需的步驟以及工具。

容器 ( Container )​

容器是映像檔的運作實體,可以使用 Docker Client 發送 API 來啟動、暫停、刪除容器,你也可以將一個容器連接到一個以上的虛擬網路,甚至根據其當前的狀態建置一個新的映像檔。

預設情況下,一個容器和其他容器以及主機是相對隔離的。但可以透過控制容器的虛擬網路,來把其他容器加入相同的網路,改變之間的隔離程度。

Volume ( 容積 )​

Volume 是一個非常重要的物件,本身運作於容器之外,確保容器刪除後的資料保存。

Volume 是儲存在主機上的,和容器本身的生命週期無關,這讓使用者可以輕鬆地在各個容器間共享檔案系統。

而 Volume 有兩種不同的使用方式,分別是 Volume 以及 Bind Mount ( 掛載 ), 這在 Docker Volume 篇 也會有詳細的介紹。

虛擬網路 ( Networks )​

Docker 之所以如此強大,有一部分原因就是可以使容器們相互溝通並將服務串連,亦或是將它們連接到非 Docker 的執行環境。

容器本身甚至不需要知道自己是否被部署在 Docker 上,都是靠著 Docker 的虛擬網路輕鬆地來達到連線的功能。