Docker for Windows 10

Docker 虛擬化容器(Container)技術簡介與入門實作

Ken Huang
13 min readOct 28, 2020

前言

Docker 這個名詞我其實已經聽過不下 20 次了,但一直都沒有自己去實際使用。最近剛好有點空檔,看實驗室的學長也都有在用,就來學習一下,順手把過程紀錄下來。

以下我會假設自己不知道什麼是虛擬化、容器,也從來沒聽過這些名詞的狀況,來對這些名詞做一點簡介之後,再開始安裝、使用 Docker。如果你已經有這些概念了,可以透過下方的目錄跳去你想看的部分。

虛擬化技術(Virtualization)簡介

虛擬化技術是透過軟體將硬體資源轉換為可分割、組合的環境,以利更有效率的資源分配,讓使用者可以不受到地域、物理限制來使用電腦的計算、儲存能力。

這技術與近年雲端運算普及有滿大的關係,畢竟許多企業逐步將原本私有伺服器的做法改為建置私有雲或使用科技龍頭的公有雲(像是 Google GCP、Amazon AWS、Microsoft Azure),這時如何靈活運用、管理硬體資源就變得非常重要了。

虛擬化技術從電腦硬體到軟體可依抽象程度分成這五個類別:

其中常見的是「Hardware abstraction level」、「Operating system level」。

比較傳統的是「Hardware abstraction level」,這層級會以硬體資源為主體,將作業系統虛擬化,讓使用者可自由分配、管理硬體資源。

作業系統虛擬化

這個層級的硬體資源會稱做「主體機器(Host Machine)」,再透過像是 VMware、Virutal Box、Hyper-V 這類稱為 Hypervisor 的軟體來創建「客體作業系統(Guest OS)」,也就是常聽到的「虛擬機(Virutal Machine,VM)」。這時的 Host 與 Guest 的關係可參考下方比較圖說。

這麼做除了能有效分配硬體資源外,對開發者而言,若有前後版次差異的軟體開發,也能靈活運用此做法來創建符合特定條件的環境來進行後續開發、維護和測試。

另外一個常見的是「Hardware abstraction level」,近年逐漸被廣泛應用。這層級會將軟體相關的 Code、Library、Environment setting 封裝起來,藉此達到比較輕量的虛擬化。

軟體環境虛擬化

這個層級比起作業系統虛擬化的做法,少了客體作業系統(Guest OS),所以執行效率較佳、硬碟使用量也大幅降低,常用來做這種虛擬化的軟體正是後文要介紹的 Docker,另外還有 LXC、OpenVZ。

這種以應用程式為主體來做相依性資源封裝並隔離的機制又稱為「容器(Container)」,透過下方示意圖應該更能理解 Container 與 Virutal Machine 之間的差異:

當然你要把 Container 塞進 VM 的 Guest OS 裡來應用也是可以的,這種作法在雲端也上應該滿常見,這邊就不繼續探討。那有了這些基本概念之後,我們就可以聚焦在 Docker 來看了。

Docker 簡介

Docker Icon by Icon Mafia

看到 Docker Icon 的那些「貨櫃」了嗎?

再看看 Docker 的 slogan :

「Build, Ship and Run Any App, Anywhere」

Docker 的初衷就是讓軟體的執行環境可以像貨櫃一樣被「移動」與「再利用」,而其中一個貨櫃的使用或內容物並不會影響到其他貨櫃的使用,這就是「容器(Container)」的概念,讓軟體執行時能有不被影響的獨立環境

如果你對 Docker 的前世今生很有興趣可以參考這篇文章,但這邊我想介紹實作所需的知識即可。

在使用 Docker 之前必須先了解幾個名詞與整個虛擬化容器在運作的流程,這邊先用一張流程示意圖把這些名詞代入,下方再一一說明。

Icons made by Freepik from www.flaticon.com

大致上有四個名詞需要了解一下:

  • Image:映像檔,像是一個樣板,可以被重複用來生成容器(Container)實體(Instance)。
  • Container:如同前面虛擬化技術介紹提到的,是一個可以被啟動、停止、刪除的虛擬化軟體環境,每個容器能獨立運作,不受彼此影響。可以說是被映像檔(Image)產生的實體(Instance)。
  • Repository:Docker Hub 類似 GitHub,但專門給 Docker 用,是個大型、公開的倉庫,可以在上面找到各式各樣現成的映像檔(Image),然後 Pull 下來本地端使用,當然也可以把自己創建出來的映像檔 Push 上去。
  • Docker file:以 YAML 語法撰寫的純文字檔,內容為打包程式及相依資源的指令,透過這個檔案可以產生映像檔(Image)需要的內容和要執行的命令。其語法大致如下:
### Dockerfile
# Use an official Python runtime as a parent image
FROM python:3.7.3-stretch
# Set the working directory to /test
WORKDIR /test
COPY requirements.txt ./RUN pip install — trusted-host pypi.python.org -r requirements.txt \

那接下來我們可以開始安裝 Docker 了

安裝 Docker 於 Windows 10

要在 Windows 10 上安裝 Docker,首先要確定 3 件事情:

1. Windows 10 要是 64 位元版本,且要是「專業版(Pro)」或「企業版(Enterprise)」或「教育版(Education)」,要查詢自己的 Win 10 可以按Win + R,會彈出這視窗:

然後輸入 winver 之後按 Enter,就會出現:

這邊還要確定一下紅色框的部分,OS組建版本要 16299 以上(以後可能會要求更新的版本)。

如果是 Windows 家用版,版本要求是 1903 (紅色框左邊),然後透過這篇Microsoft的安裝教學啟用 WSL 2,啟用後要記得 update Linux kernel

2. 「專業版(Pro)」或「企業版(Enterprise)」或「教育版(Education)」必須啟用 Windows 的「Hyper-V」和「容器」功能,同樣透過 Win + R 叫出執行視窗,再輸入 control,畫面如下:

接著進入「程式集」:

然後點選「開啟或關閉 Windows 功能」:

會彈出以下視窗,要把「Hyper-V」和「容器」功能做勾選後按確定。

3. 硬體需求:64 bit 的處理器,且須支援 Second Level Address Translation(SLAT,處理器的虛擬化技術),檢查方式一樣透過 Win + R 開啟執行視窗,再輸入 msinfo32:

就會彈出系統資訊視窗,從系統摘要裏頭可以看到最下方有「Hyper-V」相關資訊,如果系統已經有 Hypervisor 就代表支援 SLAT,畫面如下:

否則要看到這樣的資訊:

才代表有支援 SLAT。

硬體資源的部分還須具備 4GB 的 RAM 以及 支援虛擬化技術的 BIOS(記得去檢查 BIOS 設定內是否開啟這個選項,這邊每個廠的 BIOS 介面都不太一樣,就不附上圖說了,要根據自己的主機板去查一下)。

再來就可以去官方網站下載安裝檔案:

進入安裝程序:

稍微等一下安裝程序

安裝完畢的介面:

如果你也跟我一樣不小心關掉了新手教學,那畫面是這樣的:

這樣就安裝完成了。還是想確認一下的話,可以在 Terminal 打 docker --version 應該會出現類似這樣的畫面:

當然版本號會因人而異,但有看到版本號就代表安裝成功,接下來就是如何使用的部分了。

如何在 Windows 使用 Docker

一開始先用簡單的方法習慣 Container 的運作流程,先從 Pull 別人的 Image 檔開始練習。除了剛剛用過的 docker --version 之外,還有三個指令可以先試一下,這樣稍後我們 Pull 了 Image 並生成 Container 之後就能比對差異。

  1. docker images 或是 docker images指令可以查看當下的 docker engine 裡有哪些 Image
以目前我們甚麼事都沒做的狀況來說,就是什麼也沒有,很正常

2. docker ps這指令可以查看當下正在運作的 Container 有哪些

連映像檔都沒有,當然不會有Container在運作,正常

再來我們用一個 Ubuntu Image 來熟悉一下 docker 指令:

以現成的 Image 啟動 Container

docker run -it ubuntu bash

這邊的 run 指令就是要 docker 去依照一個 Image 產生 Container Instance,後面帶的-it 其實是兩個參數-i-t

-i 是讓標 STDIN 維持在打開的狀態

-t 則是替 Container 配置一個虛擬的終端機

這兩個指令通常綁在一起用,讓使用者在啟動 Container 之後直接進入使用

這邊我們會發現當 docker 察覺你本地端沒有這個映像檔就會上到 Docker Hub 去 Pull 下來之後生成 Container,當你看到使用者變成 root 就代表已經進入到 Container 內了,我們先開另一個 Terminal 來用前面講過的 docker imagesdocker ps 確認一下:

可見剛才run 的指令成功了,目前已經有一個 Container 在運作,如果我們回 GUI 上也會看到:

回到我們剛剛成功進入的 Container,學會啟動也要學會如何關閉,這時如果用Linux指令的 exit 或是 Ctrl + D 就會直接把 Container 關閉

這邊我可以在docker ps 後面加上 -a 參數,就可查看已經關閉的 Container

那如果要再重新啟動這個 Container 的話可以使用這個指令:

重新啟動 Container

docker start [id]

id 是 Docker 自動對 Container 生成的一個序號,以這例子來說是 6f6dd048f38c:

再次透過 docker ps -a 就可以查看 Container 又回到啟動狀態

這時候會發現我們沒有進入 Container ,這個狀態稱為 detach,剛剛第一次那種可直接跟 Container 互動的狀態叫做 attach ,那我們如何回到 attach 狀態做使用呢?可以用這個指令:

從 detach 進入 attach

docker exec -it [id] bash

我多打了 ls -l 確認已經進入 Container

這次如果我們只是想暫時離開這個 Container,可能晚點就會繼續使用,那可以使用:

從 attach 進入 detach

先按 Ctrl + P 再按 Ctrl + Q,讓 Container 回到背景運作,不要直接關閉

再次透過 docker ps -a 確認 Container 保持著啟動狀態

剛剛是透過 Ubuntu 的 exit 指令讓 Container 關閉,這次我們使用 Docker的指令來中止 Container 運作:

中止 Container 運作

docker stop [id]

透過 docker ps -a 確認 Container 已經被 stop 指令關閉

接著是如果這 Container 或 Image 再也用不到的話,如何刪除?

刪除 Container

docker rm [id]

這時一樣可用 docker ps -a 確認關閉後的 Container 已經被刪除

刪除 Image

docker rmi [id]

先用 docker images 指令確認要刪除的 Image 的 ID,再執行刪除指令
再用 docker images 指令確認剛才輸入 ID 的 Image 已經被刪除

到目前為止,這些指令已經可以讓我們使用現成的映像檔來創建、刪除 Container ,並且觀察 Container 的運作狀態。下篇文章我會換用 Docker file 的做法來建立 Container,連結在這邊

--

--

Ken Huang

在網路上自學的過程中,體會到開放式資源的美好,希望藉由撰寫文章記錄研究所的學習過程,同時作為回饋網路世界的一種方式。Email : kenhuang2019iii@gmail.com ,如果有任何問題都歡迎與我聯繫。