前言
簡單來說,「Docker」本來是 dotCloud 公司內部的一個業餘專案,並採用 Google 的 Go 語言進行實作的產品。後來 dotCloud 公司將此專案加入 Linux 基金會並在 GitHub 上進行維護,迅速受到開發人員的喜愛,甚至 dotCloud 公司改名為 Docker Inc。有關 Docker 的一些歷史及觀念介紹因為《Docker — 從入門到實踐》已經很清楚的說明,在此便不再贅述。此外,有時間也可以看一些相關影片:
雖然,在 Windows 作業系統中導入 Docker / Container 容器環境,但是整個實作技術跟 Linux 是完全不同的。簡單來說,Linux Image 是無法運作在 Windows Server Container 當中的,而 Windows Image 也無法運作在 Linux Container 容器環境,因為是採用「不同 API (Windows API vs Linux API)」運作環境,那麼我們來看看有哪些根本上的不同:
Linux Container
Windows Container
Windows Server Container vs Hyper-V Container
微軟設計 2 種不同的 Container 容器環境,以便因應不同的環境的運作需求。同時,不同的 Windows 作業系統版本支援不同的 Container 容器環境 (例如,Windows 10 並不支援 Windows Server Container,所以用 Windows 10 玩的話必須要先安裝 Hyper-V 功能才行)。
那麼,我們概略了解一下 Windows Server Container 及 Hyper-V Container 有哪些不同:
為了方便進行 Docker 環境的測試作業,我採用 Microsoft Azure 建立 Windows Server 2016 Datacenter 虛擬主機。因為本文並非要討論 Microsoft Azure 所以如何建立 Windows 虛擬主機就不多說明了。😁
裝好 Docker 容器環境並重新啟動後,便會發現多出「vEthernet (HNS Internal NIC)」 網段就是 172.x.x.x / 255.255.240.0,後續在討論 Docker Network 時再來深入了解這部分。
透過「docker version」指令,馬上確認目前 Docker 容器環境的 Client / Server 版本。
同樣的,此時可以透過「docker images」指令查看已經下載的 Docker 映像檔資訊。
在 Windows 運作環境中的容器基礎映像的部分,目前有「Windows Server Core (9.56 GB)」及「Nano Server (925 MB)」。可以透過下列指令從 Docker Hub 下載
- Docker for Windows Server 2016 - YouTube
- Webinar: Containerization for the Virtualization Admin - Docker Blog
- Containers in Windows Server 2016 | The Windows Server Channel | Channel 9
- Free ebook: Containerized Docker Application Lifecycle with Microsoft Tools and Platform – Microsoft Press blog
雖然,在 Windows 作業系統中導入 Docker / Container 容器環境,但是整個實作技術跟 Linux 是完全不同的。簡單來說,Linux Image 是無法運作在 Windows Server Container 當中的,而 Windows Image 也無法運作在 Linux Container 容器環境,因為是採用「不同 API (Windows API vs Linux API)」運作環境,那麼我們來看看有哪些根本上的不同:
Linux Container
- Control Group: 控制群組,針對共享資源進行隔離並管控硬體資源的使用 (例如,管理記憶體、檔案快取、CPU、磁碟 I/O…等使用率)。
- Namespaces: 命名空間,確保每個容器都有單獨的命名空間,讓容器之間的運作互相不受影響。
- AUFS: 檔案系統,不同容器可以共享基礎的檔案系統層,同時實現分層功能並將不同目錄掛載到同一個虛擬檔案系統中。
Windows Container
- Job Objects: 類似 Linux 的控制群組機制。
- Object Namespace、Process Table、Networking: 類似 Linux 的命名空間機制。
- Compute Service: 作業系統層級的運算服務層。
- NTFS: 每個運作的容器各自擁有 1 份 NTFS 分區表,並搭配虛擬區塊儲存裝置來建立容器多層式檔案系統,接著再利用 Symlink 運作機制把不同層的檔案對應到 Host 環境檔案系統內的實際檔案,以便減少虛擬區塊儲存裝置所占用的儲存空間。
Windows Server Container vs Hyper-V Container
微軟設計 2 種不同的 Container 容器環境,以便因應不同的環境的運作需求。同時,不同的 Windows 作業系統版本支援不同的 Container 容器環境 (例如,Windows 10 並不支援 Windows Server Container,所以用 Windows 10 玩的話必須要先安裝 Hyper-V 功能才行)。
那麼,我們概略了解一下 Windows Server Container 及 Hyper-V Container 有哪些不同:
- Windows Server Container: 共用系統核心資源 (與 Linux Container 類似)。
- Hyper-V Container: 獨立系統核心資源。Hyper-V 容器並非傳統的 Hyper-V VM 虛擬主機,而是運作 Windows Server Container 的特殊虛擬主機器,並且具備獨立的系統核心、Guest 運算服務、基礎系統執行程序……等。
為了方便進行 Docker 環境的測試作業,我採用 Microsoft Azure 建立 Windows Server 2016 Datacenter 虛擬主機。因為本文並非要討論 Microsoft Azure 所以如何建立 Windows 虛擬主機就不多說明了。😁
安裝 Docker 容器環境
首先,我們安裝 OneGet Provider PowerShell 模組,然後使用 OneGet 安裝最新版的 Docker (包含安裝 Windows Feature 中的 Container),當 PowerShell 詢問是否要信任封裝來源 'DockerDefault' 時,輸入 Y 或 A 以便繼續安裝程序。當安裝作業完成後,系統也提示你應該重新啟動電腦以便套用生效。Install-Module -Name DockerMsftProvider -Repository PSGallery -Force
Install-Package -Name docker -ProviderName DockerMsftProvider
Restart-Computer -Force
裝好 Docker 容器環境並重新啟動後,便會發現多出「vEthernet (HNS Internal NIC)」 網段就是 172.x.x.x / 255.255.240.0,後續在討論 Docker Network 時再來深入了解這部分。
基礎操作
安裝好 Windows Server Container 容器環境後,便可以透過「docker info」指令查看 Docker 容器環境的運作資訊:透過「docker version」指令,馬上確認目前 Docker 容器環境的 Client / Server 版本。
永遠的範例 Hello-World
那麼,讓我們開始使用 Docker 容器環境吧,不免俗的第 1 個範例就是透過 Docker 容器環境執行列出字串「Welcome to using .NET Core!」吧。在這項練習中,您將從 Docker Hub 登錄下載預先建立的 .NET 範例映像,並部署執行 .Net Hello World 應用程式的簡單容器。docker run microsoft/dotnet-samples:dotnetapp-nanoserver
同樣的,此時可以透過「docker images」指令查看已經下載的 Docker 映像檔資訊。
在 Windows 運作環境中的容器基礎映像的部分,目前有「Windows Server Core (9.56 GB)」及「Nano Server (925 MB)」。可以透過下列指令從 Docker Hub 下載
docker pull microsoft/windowsservercore
docker pull microsoft/nanoserver
參考資源
- Windows Server 上的 Windows 容器 | Microsoft Docs
- Windows 容器文件 | Microsoft Docs
- Windows 容器技術大剖析 | iThome
- 10 個 Q&A 快速認識 Docker | iThome
- Will 保哥 - 開發人員不可不知的 Windows Container 容器技術預覽
- Will 保哥 - 快速上手 Windows Containers 容器技術 (Docker Taipei)
- Get started with Docker for Windows - Docker
- A Brief History of Containers: From 1970s chroot to Docker 2016 (說明 Container 的歷史背景)
- Getting started with containers and Docker on Windows Server 2016 Technical Preview 5 – Julien Corioland – Technical Evangelist @ Microsoft