本篇是 Docker 容器的基本觀念與操作教學,敘述如何自行建立 Docker 影像檔。

相較於傳統的虛擬機器(例如 VirtualBox 與 VMWare 等),Docker 是一個輕量級的容器,只包含特定程式執行所需要的必要元件,不像虛擬機器要包含整個作業系統,所以大小會比較小,執行效能也會比較高。


以下是關於 Docker 的一些基本觀念,以及簡單的應用程式包裝與佈署步驟。

基本觀念

Docker 的影像(image)是一個可以獨立執行的輕量級套件,其包含所有執行程式所需要的函式庫、環境變數與設定檔等,而容器(container)則是一個影像(image)的執行實體,就是將影像(image)載入至記憶體中執行之後的環境。

預設的情況下,容器(container)是一個與 host 機器環境分開的獨立執行環境,但其程式卻可以在原生 host 機器的核心中運行,因此 Docker 的執行效能會比傳統虛擬機器更好。

以下兩張圖是傳統虛擬機器與 Docker 的比較,虛擬機器(VM)除了包含程式與函式庫之外,還要加上整個作業系統(Guest OS)。

虛擬機器架構

在 Docker 容器的架構下,容器只需要包含程式與其所需要的函式庫,剩下的部份則由 Docker 容器來處理,所有的程式都共用同一個 host 系統核心。

Docker 容器架構

安裝 Docker 環境

在開始使用 Docker 之前,請先在系統上安裝 Docker 的環境,大部分的作業系統 Docker 都有直接支援,這裡示範在 Ubuntu Linux 中的安裝步驟,若使用 CentOS Linux 的人可參考 CentOS Linux 安裝 Docker 的教學,或是 Docker 官方的文件

首先移除舊版的 Docker 套件,官方的建議指令是:

sudo apt-get remove docker docker-engine

我自己的 Ubuntu Linux 中舊版的 Docker 套件是 docker.io

sudo apt-get remove docker.io

安裝 linux-image-extra-* 套件,讓 Docker 可以使用 aufs 儲存驅動程式:

sudo apt-get install \
    linux-image-extra-$(uname -r) \
    linux-image-extra-virtual

安裝基本套件:

sudo apt-get install \
  apt-transport-https \
  ca-certificates \
  curl \
  software-properties-common

加入 Docker 的 GPG 金鑰:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

加入 Docker 套件庫:

sudo add-apt-repository \
  "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) \
  stable"

更新套件庫:

sudo apt-get update

安裝 Docker CE(Community Edition):

sudo apt-get install docker-ce

檢查 Docker 是否可以正常運作:

sudo docker run hello-world

正常來說,執行之後就會輸出類似這樣的訊息:

Docker hello-world 輸出訊息

如果要以一般的使用者的權限執行 Docker,要先在系統中加入 docker 群組:

sudo groupadd docker

在將要執行 Docker 的使用者加入至 docker 群組內:

sudo usermod -aG docker $USER

這樣就完成了。如果沒有把使用者加入 docker 群組的話,使用時就會出現類似這樣的錯誤訊息:

docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.27/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.

如果要設定 Docker 的服務是否要在開機時自動啟動,可透過 systemd 的控制介面:

sudo systemctl enable docker  # 啟動 Docker 服務
sudo systemctl disable docker # 關閉 Docker 服務

最後檢查一下 Docker 的版本。

docker --version
Docker version 17.03.1-ce, build c6d412e

接下來的教學內容適用於 1.13 或更新版的 Docker 環境。

將 Docker 的執行環境準備好之後,接下來要介紹如何在 Docker 環境中開發與佈署應用程式,請繼續閱讀下一頁。