Some questions about docker
這裡主要記錄一下在我學習docker的過程中給我造成困惑的問題以及最後我的理解。所以下面的內容很有可能有錯誤。
關於docker的學習,我主要參考的是docker官網上的文件。對於初學者來說,已經足夠。
最後感嘆一句,看英文文件真的很折磨,並且學習的過程當中某一節、某一段都有可能反反覆覆看好幾遍。
Any way,堅持。
Questions 1: Container和image到底是什麼關係?
首先,container是個docker之前就已經有的概念。從字面意思上理解,它是“箱子”的意思。那麼我們就可以想象,它是放在“computer”裡的一個箱子,這個箱子裡可以裝一些我們需要的東西,並且與箱子外部有一定的隔離作用。同樣具有箱子作用的還有virtual machine。Docker官網中也對docker和vm做了比較。所以container就是為開發的程式提供了一個可供執行的環境。它是相對獨立的。
Image翻譯成中文是“映象”。官網上對image的解釋是:
- An image is a read-only template with instructions for creating a Docker container
首先我們可以理解的是,image是製作container的模板,沒有image就不可能有container。這類似於面向物件程式設計中的類與物件的關係。可是我還是迷惑,到底image是什麼樣的結構,它由什麼組成呢?既然container“繼承”了image的特性,它又有什麼樣的結構呢?於是我通過網路,得到以下答案:
- Docker映象是由多個檔案系統(只讀層)疊加而成。當我們啟動一個容器的時候,Docker會載入只讀映象層並在其上(譯者注:映象棧頂部)新增一個讀寫層。如果執行中的容器修改了現有的一個已經存在的檔案,那該檔案將會從讀寫層下面的只讀層複製到讀寫層,該檔案的只讀版本仍然存在,只是已經被讀寫層中該檔案的副本所隱藏。當刪除Docker容器,並通過該映象重新啟動時,之前的更改將會丟失。在Docker中,只讀層及在頂部的讀寫層的組合被稱為Union File System(聯合檔案系統)。
綜上所述,image是一個分層的檔案系統,並且每一層都是隻讀的。但是contain是可以讀寫的。
Questions 2: Container, image, daemon, service, swarms, stack, docker machine, docker compose之間各自有什麼聯絡?
Container和image的關係第一個問題已經解釋了。Daemon就是docker的後端守護程式,是docker的server端。一般來說一臺機器都會只安裝一個版本的docker,那麼這一個docker裡面就只有一個daemon。一臺機器上所有的container和image都由它控制。
如果一個程式只需要在一個container裡面啟動就可以執行,那麼以上的幾個概念瞭解了就足夠了。但是如果開發的是一個分散式的應用程式,它就需要幾個獨立的執行環境。那麼既然是不同的執行環境,一個container是不夠的。Services,stacks和swarms就是用來解決開發分散式應用程式的問題的。
在docker裡,如果要部署一個分散式的應用程式,也就意味著需要不同的image來建立不同的container,那麼就需要用到docker-compose.yml這樣的一個檔案。這個檔案有什麼作用呢?
在這個檔案裡
,可以定義不同的"service",這些不同的service就代表著分散式系統的每一個獨立的部分。一個service對應到docker裡面又具體是什麼呢?其實它的本質上就是由一個image創建出來的一個或多個container。並且每一個service只能包含一個image,但是這一個image可以執行多個container。在每一個service裡除了定義image和container的個數,還可以對埠進行對映。所以綜上所述,一個service就是多個container,那麼一個stack就是多個service。
接下來說swarms。前面都沒有提到我們有多少host,也就是我們部署的環境是在一臺機器上還是多臺機器上。不管是什麼樣的應用程式,理論上來說應該完全可以部署在一臺機器上。可是docker也提供了一種可能,使得應用程式可以部署在多個主機上,這些主機可以是物理上的主機,也可以是虛擬的,或者是在雲上的。所以swarms和service,stack,container沒有直接的關係,它只是用來管理container在不同的機器上執行的。
前面說的都是docker裡的一些概念。Docker machine和docker compose其實是一種工具。只有安裝了docker compose,才可以定義docker-compose.yml檔案去部署應用。只有安裝了docker machine,才可以把應用部署到不同的機器上。如果只安裝了docker,是不具備這些功能的。
GOOD LUCK TO EVERYBODY
THANKS