Docker 是個神奇的虛擬化技術,讓你破除環境的限制,在不同機器上使用同樣的環境,協助專案開發,甚至幫助你部署(deploy)專案。

前言

標題叫為什麼要 Docker,先來講講為什麼要寫 Docker 系列文好了。雖然 Docker 已經不是什麼新技術了,但最近在寫的專案,因為要一直到不同環境 Demo,又用到兩個 Node.js 專案、mongo 當資料庫,前面再加個 nginx 當 reverse proxy,每次部署都要花好多時間,有了 Docker 以後,每次部署只需要一個指令,考試都考一百分。

不是,然後上網找了一些 Docker 指令複習一下,發現 Docker 的文章寫的都跟 Redux 的文章一樣難,所以寫個幾篇起來放,或許幾個月後的我也會需要。

什麼是 Dokcer?為什麼要用 Docker?

先想想今天你在 Ubuntu 環境上架設 MySQL,然後把 PHP 7.0 FPM + Nginx 設定好檔都寫好了,把 WordPress 解壓縮,寫完新的佈景主題後決定上線。結果發現對面主機是 CentOS,結果 apt-get: command not found,「天啊,我不會用 CentOS 啊!」

再想想今天你是個 Python 大師,Anaconda 或 virtualenv 什麼的都難不倒你。結果今天同事給你一個 Node.js 的專案,你看了官網文件半天還是不知道你到底要安裝 v8、v10 還是 v11,最後把 npm 安裝成 nvm,一天都過了你還沒裝好環境。

抑或是今天高等資料庫老師叫你跑一個 PostgreSQL 作業,搞了半天還是不知道為什麼自己的環境欄位定序就是跟作業要求的環境不一樣。

例子還有很多,或是今天你要寫的案子預計只會花一個月,卻要求你必須裝 MSSQL 等等。以上這些情況,或許開一台虛擬主機(VM)都可以解決,但開一臺 VM 需要花多少時間?需要多少資源?把你整個映像檔打包上去 Git 能看嗎?

這時 Docker 就可以幫你解決這個問題。

你可以輕鬆的在 CentOS 機器上把 Ubuntu 的 Image 抓下來用,並且不用兩分鐘就可以啟動完畢;你也可以靠 Docker Hub 上的 Mongo Image,快速開一個 Mongo 資料庫起來。每個禮拜才做一小時的作業?你隨時可以停止、或重新啟動你的容器,而且你可以很快的備份、匯入你的 Docker 容器(Container)。

什麼是 Image、Container、Docker Hub

剛剛偷渡了幾個名詞:Image(映像檔)、Container(容器)、Docker Hub。

首先類似 VM 的映像檔,Docker 也有它的 Image。不過這個 Image 有點像是基底,裡面只放最核心的檔案。目前的 Docker Hub 上的 Ubuntu Image 只有 32 MB,不會一口氣就包個幾 GB 在裡面。

而當你把 Image 抓下來並啟動後,你就新增了一個 Container。有點像是你下載一個 Windows 10 的 ISO(Image)後把它放到 VirtualBox 裡面開機,你新增的這個機器,在 Docker 裡面就是個容器(Container)。

至於 Docker Hub 呢?像是大家會把 Python 套件丟上 pip、JS 套件丟上 npm 一樣,大家寫好的 Docker Image 都會丟到 Docker Hub 上。只要執行 docker pull ubuntu 就可以把這個 Image 拉回來了。

這一系列的文章會講怎麼安裝 Docker、一些常用的指令怎麼打、怎麼寫 Dockerfile、Docker Compose、或是怎麼把你的 Node 專案弄成 Docker 容器之類的。沒意外就不去討論底層 Docker 怎麼運作了。