# Windows Container 版本相容性與多重架構容器映像介紹

自從 Windows 核心版本 v14393 開始，也就是 Windows Server 2016 LTSC 與 Windows 10 年度更新版，正式開始支援 Windows 容器，這意謂著企業可以開始將傳統 Windows 應用程式正式容器化，透過容器化技術隔離應用程式，最大的優勢，就是容器技術會讓應用程式不會再遇到部署環境變更導致的任何問題。不過 Windows 核心版本不斷更新，也開始出現了相容問題，本篇文章將說明各種容器相容性的解決方案。

![](https://stwillblogassets.blob.core.windows.net/files/images/external/user-images.githubusercontent.com/718cc058d580e376eacb-72683225-62b89180-3b10-11ea-84c1-207d618c9070.jpg)

### 兩種容器執行方式

Windows Containers 支援兩種容器執行方式：

1.  Windows Server Container
2.  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](https://learn.microsoft.com/zh-tw/virtualization/windowscontainers/deploy-containers/version-compatibility) 文件說明。

### 多重架構映像 (multi-architecture images)

目前微軟所管理的容器映像，幾乎都有提供所有核心版本的標籤(Tag)，我以 [Microsoft ASP.NET](https://hub.docker.com/_/microsoft-dotnet-framework-aspnet) 為例，官方就提供了數十個不同版本、不同平台架構的容器映像。例如 `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](https://hub.docker.com/_/microsoft-dotnet-framework-aspnet)**

-   ASP․NET 4.8
    
    ```powershell
    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
    
    ```powershell
    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
    
    ```powershell
    docker pull mcr.microsoft.com/dotnet/framework/aspnet:4.7.2
    ```
    
    支援的作業系統：
    
    -   Windows Server 2019 (LTSC)
    -   Windows Server 2016 (LTSC)
-   相關連結
    
    -   [Dockerfiles for ASP.NET](https://github.com/microsoft/aspnet-docker)
    -   [Microsoft ASP.NET 所有可用的 Tags 清單](https://mcr.microsoft.com/v2/dotnet/framework/aspnet/tags/list)

**[Windows IIS](https://hub.docker.com/_/microsoft-windows-servercore-iis/)**

-   IIS
    
    ```powershell
    docker pull mcr.microsoft.com/windows/servercore/iis:windowsservercore
    ```
    
    支援的作業系統：
    
    -   Windows Server 1909 (SAC)
    -   Windows Server 1903 (SAC)
    -   Windows Server 2019 (LTSC)
    -   Windows Server 1803 (SAC)
    -   Windows Server 2016 (LTSC)
-   相關連結
    
    -   [Dockerfile for IIS](https://github.com/microsoft/iis-docker)
    -   [Microsoft IIS 所有可用的 Tags 清單](https://mcr.microsoft.com/v2/windows/servercore/iis/tags/list)

**[Windows Communication Framework (WCF)](https://hub.docker.com/_/microsoft-dotnet-framework-wcf)**

-   WCF on .NET Framework 4.8
    
    ```powershell
    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
    
    ```powershell
    docker pull mcr.microsoft.com/dotnet/framework/wcf:4.7.2
    ```
    
    支援的作業系統：
    
    -   Windows Server 2019 (LTSC)
    -   Windows Server 2016 (LTSC)
-   相關連結
    
    -   [Dockerfile for WCF](https://github.com/microsoft/wcf-docker/)
    -   [Microsoft WCF 所有可用的 Tags 清單](https://mcr.microsoft.com/v2/dotnet/framework/wcf/tags/list)

**[.NET Framework Runtime](https://hub.docker.com/_/microsoft-dotnet-framework-runtime/)**

-   .NET Framework 4.8
    
    ```powershell
    docker pull mcr.microsoft.com/dotnet/framework/runtime:4.8
    ```
    
    支援的作業系統：
    
    -   Windows Server 1909 (SAC)
    -   Windows Server 1903 (SAC)
    -   Windows Server 2019 (LTSC)
    -   Windows Server 1803 (SAC)
    -   Windows Server 2016 (LTSC)
-   .NET Framework 3.5
    
    ```powershell
    docker pull mcr.microsoft.com/dotnet/framework/runtime:3.5
    ```
    
    支援的作業系統：
    
    -   Windows Server 1909 (SAC)
    -   Windows Server 1903 (SAC)
    -   Windows Server 2019 (LTSC)
    -   Windows Server 1803 (SAC)
    -   Windows Server 2016 (LTSC)
-   相關連結
    
    -   [The repo for the official docker images for .NET Framework on Windows Server Core.](https://github.com/microsoft/dotnet-framework-docker/)
    -   [Microsoft ASP.NET 所有可用的 Tags 清單](https://mcr.microsoft.com/v2/dotnet/framework/runtime/tags/list)

**[.NET Framework SDK](https://hub.docker.com/_/microsoft-dotnet-framework-sdk/)**

-   .NET Framework 4.8
    
    ```powershell
    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
    
    ```powershell
    docker pull mcr.microsoft.com/dotnet/framework/sdk:4.7.2
    ```
    
    支援的作業系統：
    
    -   Windows Server 2019 (LTSC)
    -   Windows Server 2016 (LTSC)
-   .NET Framework 4.7.1
    
    ```powershell
    docker pull mcr.microsoft.com/dotnet/framework/sdk:4.7.1
    ```
    
    支援的作業系統：
    
    -   Windows Server 2016 (LTSC)
-   .NET Framework 3.5
    
    ```powershell
    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)
-   相關連結
    
    -   [The repo for the official docker images for .NET Framework on Windows Server Core.](https://github.com/microsoft/dotnet-framework-docker/)
    -   [.NET Framework SDK 所有可用的 Tags 清單](https://mcr.microsoft.com/v2/dotnet/framework/sdk/tags/list)

**[.NET Framework Samples](https://hub.docker.com/_/microsoft-dotnet-framework-samples/)**

-   dotnetapp
    
    ```powershell
    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
    
    ```powershell
    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
    
    ```powershell
    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
    
    ```powershell
    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)
-   相關連結
    
    -   [The repo for the official docker images for .NET Framework on Windows Server Core.](https://github.com/microsoft/dotnet-framework-docker/)
    -   [.NET Framework Samples 所有可用的 Tags 清單](https://mcr.microsoft.com/v2/dotnet/framework/samples/tags/list)

**[Microsoft SQL Server Developer for Windows Server 2016](https://mcr.microsoft.com/en-us/artifact/mar/mssql/server/about)**

-   SQL Server 2017
    
    ```powershell
    docker pull microsoft/mssql-server-windows-developer:latest
    docker pull microsoft/mssql-server-windows-developer:2017-CU1
    docker pull microsoft/mssql-server-windows-developer:2017-GA
    ```
    
    支援的作業系統：
    
    -   Windows Server 2016 (LTSC)
-   相關連結
    
    -   [Dockerfiles for SQL Server Developer Edition](https://github.com/microsoft/mssql-docker/tree/master/windows/mssql-server-windows-developer)

**[Microsoft SQL Server Developer for Windows Server 2019, 1903](https://hub.docker.com/r/willh/mssql-server-windows-developer)**

-   SQL Server 2017
    
    ```powershell
    docker pull willh/mssql-server-windows-developer:1909
    docker pull willh/mssql-server-windows-developer:1903
    docker pull willh/mssql-server-windows-developer:1809
    ```
    
    支援的作業系統：
    
    -   Windows Server 1909 (SAC)
    -   Windows Server 1903 (SAC)
    -   Windows Server 2019 (LTSC)
-   相關連結
    
    -   [Dockerfiles for SQL Server Developer Edition](https://github.com/doggy8088/mssql-docker)

### 批次下載所有 Images

****Windows Server, 1903 (SAC)****

```powershell
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)**

```powershell
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)**

```powershell
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)**

```powershell
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:
    -   [dotnet/framework/sdk](https://hub.docker.com/_/microsoft-dotnet-framework-sdk/): .NET Framework SDK
    -   [dotnet/framework/aspnet](https://hub.docker.com/_/microsoft-dotnet-framework-aspnet): ASP.NET Web Forms and MVC
    -   [dotnet/framework/runtime](https://hub.docker.com/_/microsoft-dotnet-framework-runtime/): .NET Framework Runtime
    -   [dotnet/framework/samples](https://hub.docker.com/_/microsoft-dotnet-framework-samples/): .NET Framework, ASP.NET and WCF Samples
    -   [dotnet/framework/wcf](https://hub.docker.com/_/microsoft-dotnet-framework-wcf/): Windows Communication Framework (WCF)
-   .NET Core:
    -   [dotnet/core](https://hub.docker.com/r/microsoft/dotnet): .NET Core
    -   [dotnet/core-nightly](https://mcr.microsoft.com/en-us/artifact/mar/dotnet/nightly/sdk): .NET Core (Preview)
    -   [dotnet/core/samples](https://hub.docker.com/r/microsoft/dotnet-samples): .NET Core Samples
-   Windows
    -   [windows](https://hub.docker.com/_/microsoft-windows): Windows base OS container image
    -   windows/iotcore: Windows IoT Core base OS container image
    -   [windows/nanoserver](https://store.docker.com/images/microsoft-windows-nanoserver/): Nano Server base OS container image
    -   [windows/servercore](https://store.docker.com/images/microsoft-windows-servercore/): Windows Server Core base OS container image
    -   [windows/servercore/iis](https://hub.docker.com/_/microsoft-windows-servercore-iis): Windows IIS on Windows Server Core

### 相關連結

-   [Windows Container Version Compatibility | Microsoft Docs](https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility)
-   [徹底釐清 Windows 10 與 Windows Server 的版本編號 | The Will Will Web](/post/2019/04/02/Understanding-Windows-OS-versioning)
-   [Building Multi-Arch Images for Arm and x86 with Docker Desktop - Docker Engineering Blog](https://engineering.docker.com/2019/04/multi-arch-images/)
-   [Multi-arch All The Things - Docker Blog](https://blog.docker.com/2017/11/multi-arch-all-the-things/)
-   [A big step towards multi-platform Docker images – Integrated Code](https://integratedcode.us/2016/04/22/a-step-towards-multi-platform-docker-images/)
-   [Create and use multi-architecture docker images - Linux on IBM Power](https://web.archive.org/web/20200611075051/https://developer.ibm.com/linuxonpower/2017/07/27/create-multi-architecture-docker-image/)
-   [Image Manifest Version 2, Schema 2](https://github.com/distribution/distribution/blob/main/docs/content/spec/manifest-v2-2.md)
