今天先介紹關於大部分使用情境上會出現的 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 就會把這段指令發送給 Daemon,並由其執行背後程序,一個 Client 可以和一個以上的 Daemon 通訊。
Docker Desktop
照字面來看就可以猜到是一個桌面的應用程式,適用於 macOS 以及 Windows 的環境,而在今年五月 Linux 也出了桌面的 Docker 應用程式了,最大的好處就是讓你能夠輕鬆的建構和分享容器化的應用程式及微服務。
這整個組合包含了 Docker Daemon、Docker Client、Docker Compose、Docker Content Trust、Kubernetes 以及 Credential Helper,基本上是一個超級大禮包,一鍵安裝沒煩惱。
Docker Registries
這是專門儲存映像檔的倉庫,Docker Hub 是任何人都可以用的公共倉庫 ( 就像是 Github ),Docker 本身預設就是在 Docker Hub 上面尋找 Image,這在之後的章節會有詳細的解說;當然你也可以建立自己私人的倉庫,來存放一些只屬於公司內部或是自己的映像檔。
當你使用 docker pull
或是 docker container run
的指令時,所需的 Image 就會從設定好的倉庫中拉出,當你用 docker push
時,Image 就會被推送到你設置的倉庫當中,沒有設定的情況下倉庫都是會 DockerHub。
Docker 物件
映像檔 ( Image )
映像檔本身是一個唯讀的樣板搭配一長串的指令,大部分情況下,一個映像檔是基於另外一個映像檔 ( 大部分都是使用官方映像檔 ) 並加上了一些額外的參數所建立。
舉例來說,你可以建立一個基於 Ubuntu 的映像檔,在裡面利用指令安裝任何你需要的套件,像是 vim,git 等等,並打包成自己的映像檔,運行成容器時,就會擁有 vim,git 等套件的功能。
所以你當然可以製作屬於你自己的映像檔,也可以只使用那些別人建置並發佈在 DockerHub 的映像檔,但要記得挑選有認證過的映像檔,避免安全性的問題。
但如果你要建立屬於自己的映像檔,就需要撰寫 Dockerfile,這在之後的章節會有詳細的解說,可以說是整個 Docker 的基礎,只需要用簡單的語法來定義映像檔以及運行成容器所需要的步驟和工具。
容器 ( Container )
容器是映像檔的運作實體。你可以使用 Docker 的 API 來啟動、暫停、刪除容器,你也可以將一個容器連接到一個以上的虛擬網路,甚至根據其當前的狀態建置一個新的映像檔。
預設情況下,一個容器和其他容器以及主機是相對隔離的。但你可以透過控制容器的虛擬網路,來把其他容器加入這個網路,改變之間的隔離程度。
Volume
Volume 是一個非常有用的工具,用於確保容器刪除後的資料保存,Volume 是儲存在主機上的,和容器本身的生命週期無關,這讓使用者可以輕鬆地在各個容器間共享檔案系統。
虛擬網路 ( Networks )
Docker 會如此強大,有一部分原因就是可以使容器們相互溝通並將服務串連,或是將它們連接到非 Docker 的工作環境,容器本身甚至不需要知道它們是不是被部署在 Docker 上,都是靠著 Docker 的虛擬網路來達到簡單的連線。
結語
明天我們就要開始使用容器了,今天很多名詞可能一開始沒辦法理解或是不知道如何使用,但隨著鐵人賽的進行,也會逐一的介紹!
感謝大家!