Docker 是什麼
是一個能建構應用程式環境和部署應用程式到容器的開源引擎。
我們可以簡單地将它了解為一個可以通過設計鏡像自動地建構虛拟環境(容器)的工具。
在學習 docker 的運作原理時,我們先了解一些概念:
Docker 的關鍵元件
容器(作為虛拟環境運作)
鏡像(用來建立容器)
倉庫(repository,用來存放鏡像)
registry(登記處、注冊地,用來存放倉庫)
這四個概念我用遞進的形式列舉出來,友善大家了解它們之間的關系。
倉庫和 registry 是最好了解的,registry 就類似于 GitHub 那樣的代碼托管平台,GitHub 托管代碼,而 registry 則托管鏡像,GitHub 一般都是一個項目放在一個倉庫,而 docker 的 registry 則是同系列的鏡像放在一個倉庫,比如 Ubuntu,Ubuntu 有很多個版本,我們就把這些不同版本的 Ubuntu 鏡像都放在一個倉庫。
容器則好像一個虛拟機,但又比虛拟機要精裝很多,不需要虛拟機管理系統和虛拟機作業系統,僅僅包含了我們自己想要的應用程式運作環境,并在 docker 的加持下直接可運作。
鏡像又是怎麼樣的?比如我們現在有一個 Django 的網站應用,部署到伺服器上需要的環境和依賴假設有這些:CentOS7、python3.7、Django、uwsgi、nginx、mysql,我們可以在本地通過 docker 建立并運作一個基于 CentOS 鏡像的容器,并在該容器中安裝 python3.7、Django、uwsgi、nginx、mysql,安裝完這些後,再儲存該容器為一個新的鏡像,該鏡像就好像我們平時安裝作業系統的那個鏡像一樣,可以被移植到其他電腦中建立基于該鏡像的容器。
而鏡像的建構則為 docker 中比較核心的内容。因為 docker 的主要功能之一就是構造出一個個我們想要的鏡像,然後釋出出來供其他人使用即可實作應用程式環境的自動搭建。
是以很有必要說一下 docker 的牛逼之處——鏡像的建構過程:
就拿上面那個 Django 網站應用的例子來說,剛開始,是基于 CentOS鏡像建立了一個容器,其實這個容器是分為了兩部分,一部分是容器,一部分是鏡像,而我們外部看來隻是同一個東西——容器。
為什麼這樣呢?因為在 docker 中,鏡像是隻讀的,也就是不可以修改,要修改鏡像裡面的内容,則會把鏡像裡對應的内容複制到容器中,在容器中修改,并在下次通路鏡像中該内容前先檢查容器中有沒有該内容,如果有,則使用容器中的,沒有則使用鏡像中的,也就等于是容器中的内容覆寫了鏡像中的對應内容。這就是大名鼎鼎的——寫時複制。
然後我們為該容器安裝新的應用 python、Django、uwsgi、nginx、mysql等,其實都是在往我們的容器疊加這些程式的鏡像,假如修改 nginx 的配置,其實就是複制了 nginx 鏡像中有關配置資訊的内容到容器後,再在容器中進行修改和引用。是以,我們看到的容器,其實就是一堆不同程式的鏡像疊加在一起并加上一個記錄我們的修改資訊的可寫容器。
有了這個容器,我們就可以在容器中運作應用程式。如果想要把這個運作環境移植到其他電腦上,則把這個容器送出為一個鏡像(往哪裡送出?往 docker 送出就行了,docker 有個守護程序在處理這些工作),再把該鏡像儲存到某個可以供别人下載下傳的地方即可,比如 docker hub 上的倉庫。
除了直接下載下傳這個鏡像,docker 還提供了通過 Dockerfile 的方式建立鏡像。因為我們在上述建立鏡像的過程中,無非就是一行一行的指令使得環境搭建起來了,而我們可以把這些指令寫到一個檔案——Dockerfile 中,讓 docker 再自動按序執行這個 Dockerfile 中的指令就可以建構相同的鏡像了。
以上便是 docker 及其使用的最簡單的描述。如果某些地方不能了解的,歡迎留言,後續我會補充。
了解 docker 的大緻原理後,我們便要開始下載下傳安裝 docker 和 學習基本的使用指令了。
下載下傳安裝都很簡單,看官方文檔或者看菜鳥教程就可以了,菜鳥教程差不多就是官方文檔的中文版了。