自從 Windows 核心版本 v14393 開始,也就是 Windows Server 2016 LTSC 與 Windows 10 年度更新版,正式開始支援 Windows 容器,這意謂著企業可以開始將傳統 Windows 應用程式正式容器化,透過容器化技術隔離應用程式,最大的優勢,就是容器技術會讓應用程式不會再遇到部署環境變更導致的任何問題。不過 Windows 核心版本不斷更新,也開始出現了相容問題,本篇文章將說明各種容器相容性的解決方案。
兩種容器執行方式
Windows Containers 支援兩種容器執行方式:
- Windows Server Container
- Hyper-V Container
第一種 Windows Server Container 提供一種 程序隔離 (Process isolation) 執行模式,可以讓你直接透過 Docker Engine 存取現有 Host 主機的 Kernel 資源。直接共用 Host 主機的作業系統核心,意謂著可以得到較好的容器啟動效能,啟動時間短、執行速度快,是一種相當理想的執行模式。不過這種模式有個嚴重的問題,那就是當作業系統升級後,由於核心版本也跟著升級,因此現有的容器映像(image)將無法再使用程序隔離模式執行!
第二種 Hyper-V Container 則提供另一種 Hyper-V 隔離 (Hyper-V isolation) 執行模式,顧名思義,這些容器將會執行在一種極輕量的 Hyper-V 虛擬機中,這種類型的容器不會直接存取目前 Host 主機的作業系統核心,而是在虛擬中執行另一份輕量的 Windows 核心,讓容器直接存取這份核心。如此一來將會得到較好的隔離性,一來可以提供 SaaS 環境更好的安全性,另一方面則是可以讓你執行不同版本的 Windows 作業系統核心!
由於在 Windows Server 的環境下比較要求穩定,作業系統核心通常不會頻繁的升級,因此預設 Windows Server 作業系統預設以 程序隔離 為主。
而 Windows 10 由於是個人開發用,核心升級的機率也自然較高,因此預設 Windows 10 作業系統預設以 Hyper-V 隔離 為主。像我的 Windows 10 筆電就剛從 1809 升級到 1903,核心版本從 17763
升級到 18362
,照理說原本透過 docker build
建立出來的 images 應該是不相容的,但因為預設使用 Hyper-V 隔離的關係,所以所有 images 還是可以正常的在我的電腦執行!
不過,當你的 Windows 10 升級到新版核心後,透過 docker build
建置出來的 new images 將無法給較低核心版本的 Windows 執行,這點還是必須注意。例如 Windows 10 ver 1903 所建置出來的 images 無法在 Windows Server 2019 (LTSC) 使用,因為較低核心版本的 Windows 不能執行較高核心版本建置出來的 image!
完整說明可以參考 Windows 容器版本相容性 | Microsoft Docs 文件說明。
多重架構映像 (multi-architecture images)
目前微軟所管理的容器映像,幾乎都有提供所有核心版本的標籤(Tag),我以 Microsoft ASP.NET 為例,官方就提供了數十個不同版本、不同平台架構的容器映像。例如 mcr.microsoft.com/dotnet/framework/aspnet:4.8-20190611-windowsservercore-1903
就是支援 .NET Framework 4.8 且跑在 Windows Server Core 1903 的容器映像。另外像 mcr.microsoft.com/dotnet/framework/aspnet:4.7.2-20190611-windowsservercore-ltsc2019
則是支援 .NET Framework 4.7.2 且跑在 Windows Server Core 2019 (LTSC) 版本的容器映像。這名字實在太難記了!
Docker Engine 從 1.10 版本開始正式支援 多重架構映像 (multi-arch images) 格式,這也代表著你可以建置出一份含有支援多重架構的容器映像檔。例如可以建置出一份同時支援 x86
, amd64
, arm
等不同 CPU 架構的 Linux 容器映像,也可以建置出一份同時支援 17763
與 18362
核心版本的 Windows 容器映像。
微軟官方的容器映像,也幾乎都有支援多重架構映像的標籤,由於一個標籤可以整合多個架構平台,因此通常 Tag 名稱也會簡短許多。這也代表著,你以後可以一律使用這些簡短的 Tag 名稱,無論是 docker run
或 docker build
都可以這樣用,如此一來也可以命令列輸入也可以簡化許多!
以下我特別整理現有的 Windows Containers 常用的 Images 清單,以下列出多重架構映像的位址,以及所支援的作業系統版本:
Microsoft ASP.NET
-
ASP․NET 4.8
docker pull mcr.microsoft.com/dotnet/framework/aspnet:4.8
支援的作業系統:
- Windows Server 1909 (SAC)
- Windows Server 1903 (SAC)
- Windows Server 2019 (LTSC)
- Windows Server 1803 (SAC)
- Windows Server 2016 (LTSC)
-
ASP․NET 3.5
docker pull mcr.microsoft.com/dotnet/framework/aspnet:3.5
支援的作業系統:
- Windows Server 1909 (SAC)
- Windows Server 1903 (SAC)
- Windows Server 2019 (LTSC)
- Windows Server 1803 (SAC)
- Windows Server 2016 (LTSC)
-
ASP․NET 4.7.2
docker pull mcr.microsoft.com/dotnet/framework/aspnet:4.7.2
支援的作業系統:
- Windows Server 2019 (LTSC)
- Windows Server 2016 (LTSC)
-
相關連結
Windows IIS
Windows Communication Framework (WCF)
-
WCF on .NET Framework 4.8
docker pull mcr.microsoft.com/dotnet/framework/wcf:4.8
支援的作業系統:
- Windows Server 1909 (SAC)
- Windows Server 1903 (SAC)
- Windows Server 2019 (LTSC)
- Windows Server 1803 (SAC)
- Windows Server 2016 (LTSC)
-
WCF on .NET Framework 4.7.2
docker pull mcr.microsoft.com/dotnet/framework/wcf:4.7.2
支援的作業系統:
- Windows Server 2019 (LTSC)
- Windows Server 2016 (LTSC)
-
相關連結
.NET Framework Runtime
.NET Framework SDK
-
.NET Framework 4.8
docker pull mcr.microsoft.com/dotnet/framework/sdk:4.8
支援的作業系統:
- Windows Server 1909 (SAC)
- Windows Server 1903 (SAC)
- Windows Server 2019 (LTSC)
- Windows Server 1803 (SAC)
- Windows Server 2016 (LTSC)
-
.NET Framework 4.7.2
docker pull mcr.microsoft.com/dotnet/framework/sdk:4.7.2
支援的作業系統:
- Windows Server 2019 (LTSC)
- Windows Server 2016 (LTSC)
-
.NET Framework 4.7.1
docker pull mcr.microsoft.com/dotnet/framework/sdk:4.7.1
支援的作業系統:
- Windows Server 2016 (LTSC)
-
.NET Framework 3.5
docker pull mcr.microsoft.com/dotnet/framework/sdk:3.5
支援的作業系統:
- Windows Server 1909 (SAC)
- Windows Server 1903 (SAC)
- Windows Server 2019 (LTSC)
- Windows Server 1803 (SAC)
- Windows Server 2016 (LTSC)
-
相關連結
.NET Framework Samples
-
dotnetapp
docker pull mcr.microsoft.com/dotnet/framework/samples:dotnetapp
支援的作業系統:
- Windows Server 1909 (SAC)
- Windows Server 1903 (SAC)
- Windows Server 2019 (LTSC)
- Windows Server 1803 (SAC)
- Windows Server 2016 (LTSC)
-
aspnetapp
docker pull mcr.microsoft.com/dotnet/framework/samples:aspnetapp
支援的作業系統:
- Windows Server 1909 (SAC)
- Windows Server 1903 (SAC)
- Windows Server 2019 (LTSC)
- Windows Server 1803 (SAC)
- Windows Server 2016 (LTSC)
-
wcfservice
docker pull mcr.microsoft.com/dotnet/framework/samples:wcfservice
支援的作業系統:
- Windows Server 1909 (SAC)
- Windows Server 1903 (SAC)
- Windows Server 2019 (LTSC)
- Windows Server 1803 (SAC)
- Windows Server 2016 (LTSC)
-
wcfclient
docker pull mcr.microsoft.com/dotnet/framework/samples:wcfclient
支援的作業系統:
- Windows Server 1909 (SAC)
- Windows Server 1903 (SAC)
- Windows Server 2019 (LTSC)
- Windows Server 1803 (SAC)
- Windows Server 2016 (LTSC)
-
相關連結
Microsoft SQL Server Developer for Windows Server 2016
Microsoft SQL Server Developer for Windows Server 2019, 1903
批次下載所有 Images
Windows Server, 1903 (SAC)
docker pull mcr.microsoft.com/dotnet/framework/aspnet:4.8
docker pull mcr.microsoft.com/dotnet/framework/aspnet:3.5
docker pull mcr.microsoft.com/dotnet/framework/aspnet:4.7.2
docker pull mcr.microsoft.com/dotnet/framework/wcf:4.8
docker pull mcr.microsoft.com/dotnet/framework/wcf:4.7.2
docker pull mcr.microsoft.com/dotnet/framework/runtime:4.8
docker pull mcr.microsoft.com/dotnet/framework/runtime:3.5
docker pull mcr.microsoft.com/dotnet/framework/sdk:4.8
docker pull mcr.microsoft.com/dotnet/framework/sdk:4.7.2
docker pull mcr.microsoft.com/dotnet/framework/sdk:4.7.1
docker pull mcr.microsoft.com/dotnet/framework/sdk:3.5
docker pull mcr.microsoft.com/dotnet/framework/samples:dotnetapp
docker pull mcr.microsoft.com/dotnet/framework/samples:aspnetapp
docker pull mcr.microsoft.com/dotnet/framework/samples:wcfservice
docker pull mcr.microsoft.com/dotnet/framework/samples:wcfclient
docker pull mcr.microsoft.com/windows/servercore/iis:windowsservercore
docker pull willh/mssql-server-windows-developer:1903
Windows Server 2019 (LTSC)
docker pull mcr.microsoft.com/dotnet/framework/aspnet:4.8
docker pull mcr.microsoft.com/dotnet/framework/aspnet:3.5
docker pull mcr.microsoft.com/dotnet/framework/aspnet:4.7.2
docker pull mcr.microsoft.com/dotnet/framework/wcf:4.8
docker pull mcr.microsoft.com/dotnet/framework/wcf:4.7.2
docker pull mcr.microsoft.com/dotnet/framework/runtime:4.8
docker pull mcr.microsoft.com/dotnet/framework/runtime:3.5
docker pull mcr.microsoft.com/dotnet/framework/sdk:4.8
docker pull mcr.microsoft.com/dotnet/framework/sdk:4.7.2
docker pull mcr.microsoft.com/dotnet/framework/sdk:4.7.1
docker pull mcr.microsoft.com/dotnet/framework/sdk:3.5
docker pull mcr.microsoft.com/dotnet/framework/samples:dotnetapp
docker pull mcr.microsoft.com/dotnet/framework/samples:aspnetapp
docker pull mcr.microsoft.com/dotnet/framework/samples:wcfservice
docker pull mcr.microsoft.com/dotnet/framework/samples:wcfclient
docker pull mcr.microsoft.com/windows/servercore/iis:windowsservercore
docker pull willh/mssql-server-windows-developer:1809
Windows Server, 1803 (SAC)
docker pull mcr.microsoft.com/dotnet/framework/aspnet:4.8
docker pull mcr.microsoft.com/dotnet/framework/aspnet:3.5
docker pull mcr.microsoft.com/dotnet/framework/aspnet:4.7.2
docker pull mcr.microsoft.com/dotnet/framework/wcf:4.8
docker pull mcr.microsoft.com/dotnet/framework/wcf:4.7.2
docker pull mcr.microsoft.com/dotnet/framework/runtime:4.8
docker pull mcr.microsoft.com/dotnet/framework/runtime:3.5
docker pull mcr.microsoft.com/dotnet/framework/sdk:4.8
docker pull mcr.microsoft.com/dotnet/framework/sdk:4.7.2
docker pull mcr.microsoft.com/dotnet/framework/sdk:4.7.1
docker pull mcr.microsoft.com/dotnet/framework/sdk:3.5
docker pull mcr.microsoft.com/dotnet/framework/samples:dotnetapp
docker pull mcr.microsoft.com/dotnet/framework/samples:aspnetapp
docker pull mcr.microsoft.com/dotnet/framework/samples:wcfservice
docker pull mcr.microsoft.com/dotnet/framework/samples:wcfclient
docker pull mcr.microsoft.com/windows/servercore/iis:windowsservercore
Windows Server 2016 (LTSC)
docker pull mcr.microsoft.com/dotnet/framework/aspnet:4.8
docker pull mcr.microsoft.com/dotnet/framework/aspnet:3.5
docker pull mcr.microsoft.com/dotnet/framework/aspnet:4.7.2
docker pull mcr.microsoft.com/dotnet/framework/wcf:4.8
docker pull mcr.microsoft.com/dotnet/framework/wcf:4.7.2
docker pull mcr.microsoft.com/dotnet/framework/runtime:4.8
docker pull mcr.microsoft.com/dotnet/framework/runtime:3.5
docker pull mcr.microsoft.com/dotnet/framework/sdk:4.8
docker pull mcr.microsoft.com/dotnet/framework/sdk:4.7.2
docker pull mcr.microsoft.com/dotnet/framework/sdk:4.7.1
docker pull mcr.microsoft.com/dotnet/framework/sdk:3.5
docker pull mcr.microsoft.com/dotnet/framework/samples:dotnetapp
docker pull mcr.microsoft.com/dotnet/framework/samples:aspnetapp
docker pull mcr.microsoft.com/dotnet/framework/samples:wcfservice
docker pull mcr.microsoft.com/dotnet/framework/samples:wcfclient
docker pull mcr.microsoft.com/windows/servercore/iis:windowsservercore
docker pull microsoft/mssql-server-windows-developer
容器映像相關連結
- .NET Framework:
- .NET Core:
- Windows
相關連結