Docker 介紹

Docker

隔離的概念

在過去,我們使用電腦的時候,如果不小心打開了一封帶有惡意軟體的郵件,整台電腦可能就會中毒。這時候我們能做的,通常就是重灌整台系統,把所有東西清空,重新來過,才能確保我們接下來的工作是在一個「乾淨」的環境下進行。

但這個方法有個問題:太花時間了! 想像一下,如果你經常從網路上下載一些不確定是否安全的程式,又或是常常收到一些可疑的郵件,那你可能三天兩頭就要重灌電腦。這不只浪費時間,也會打斷工作流程,非常不方便。

這時候,「虛擬機(Virtual Machine)」的概念就出現了。虛擬機的作用是什麼呢? 簡單來說,它就像是在你的主機裡,再開一台假的電腦。你可以在這台虛擬的電腦裡面操作、安裝軟體、甚至打開那些可疑的郵件或程式。 如果真的中毒了,受影響的只有虛擬機本身,你的主機不會受到任何波及。你只需要刪除虛擬機、重新建立一個乾淨的虛擬環境就好,不用碰主系統,節省非常多時間。

但是,虛擬機還是有缺點──它很重、啟動慢、資源吃得多。每開一個虛擬機,就像真的多開一台完整的電腦一樣。

這時候就輪到 Docker 上場了。

Docker 是什麼?

Docker 可以被想像成是一種輕量級的虛擬機,但它和傳統虛擬機最大的不同在於: Docker 不需要模擬整個作業系統,而是共用主機的核心(Kernel),只在應用層做出隔離。

這代表什麼?代表 Docker:

  • 啟動速度非常快,通常是「秒」級別
  • 占用資源非常小
  • 可以同時跑很多個「容器(Container)」彼此隔離又不互相干擾

你可以把 Docker 想像成是「虛擬機的極簡版」,但它仍然保有環境隔離的特性。

所以,現在如果你要執行一個你不確定會不會讓你的設備被有害的應用程式威脅,或是想快速測試一些東西,你不再需要重灌電腦、也不必花時間建立一台虛擬機,只需要在 Docker 中啟動一個容器,執行完就刪掉,乾淨又安全,而且非常快速。

從網頁工程師的角度認識 Docker

作為一個網頁工程師,我們在開發網站的時候,通常都需要一個伺服器環境來提供網頁內容──比如一台跑著 Nginx 或 Apache 的伺服器,或是一個能跑 Node.js、PHP、Python Flask 等框架的後端環境。

在沒有 Docker 的時代,我們可能需要:

  • 自己在本機安裝伺服器軟體
  • 配置好版本、路徑、權限
  • 如果換一台電腦,就要重新配置一次

但現在,我們可以直接用 Docker 來建立這個開發環境。 你可以把 Docker 想像成一台假的伺服器──我們在 Docker 中建立一個「容器(Container)」,讓它扮演伺服器的角色。這個容器可以搭好你所需要的 Web 環境,我們甚至可以連進這個容器裡面,直接編輯或調整程式碼,或是把自己的專案掛載(mount)進容器,讓開發變得更模組化、更不受主機環境限制。

這樣的好處是什麼?

  • 環境一致性:團隊中每個人都跑一模一樣的容器,不再有「我的可以跑、你的不行」的問題
  • 快速啟動:只要一行指令,就能在任何地方啟動一個乾淨的 Web 環境
  • 容易重複使用:你可以把整個網站環境包成一個 Image,以後只要拿來用就好

要如何生成 Docker Container

Image2Container.png 請參考上圖:

  • Public Image Repository(公開的映像檔倉庫):就像是「Docker 的 App Store」儲存了許多別人已經打包好的 Docker Image
  • Image(映像檔):Image 是一個「執行環境的模板」,裡面包含:精簡版的作業系統、安裝好的軟體、設定檔、環境變數等等
  • Dockerfile:一個純文字檔,定義「如何建構一個 Image」,通常會從一個現有的 Image 開始(用 FROM 指令指定 base image),會寫上你要安裝什麼、複製哪些檔案、執行什麼指令,寫好後用 docker build 就會產出新的 Image
  • Container(容器):Container 是「執行中的實體(instance)」是從 Image 產生出來的,但它是可寫的(你可以在裡面執行指令、寫入資料)像是從「模板」Image 印出來的一份拷貝,拿來實際運作

我們可以透過兩種方式建立容器,但是大體來説他們是的差距就是自己有沒有想要客制化的區別而已:

  • 直接使用 Public Image Repository 現有的 Image,把這個 Image 啟動成一個 Container。可以參考上圖將 Image 從公開的映像檔倉庫 Pull 下來(紅色的箭頭),然後直接 Run 成容器(藍色箭頭)
  • 自訂 Dockerfile 建構自己的 Image:從 Public Image Repository 拿一個 base image,用 Dockerfile 定義你要加上哪些東西。可以參考上圖中將 Image 從公開的映像檔倉庫 Pull 下來(紅色的箭頭)作為基底,接著在 Dockerfile 裏面進行自訂的一些設定(綠色箭頭),接著我們把他 Build(建構)映像檔(紫色箭頭),最後 Run 成容器(藍色箭頭)

如果你的團隊正在維護一個專案,將所需要安裝以及設定的内容提前在 Dockerfile 裏面寫好,再讓團隊中其他人存取該 Dockerfile,儘管在不同的架構的機器上都能夠生成相同的環境,就不會有 「我的可以跑、你的不行」的問題發生了。

下一篇 Docker 常見指令以及 run 一個容器