Windows11上にDocker EngineをインストールしてWindowsコンテナを実行してみる

[Windows11(WSL2)上のUbuntuにDocker EngineをインストールしてLinuxコンテナを実行してみる](https://qiita.com/SAITO_Keita/items/069715dde090f6584c33)

前回、Windows11（WSL2)上にDocker EngineをインストールしてLinuxコンテナを実行してみましたが、本記事ではWindows11上にDoker EngineをインストールしてWindowsコンテナ実行についてまとめます。

## Docker Desktop有償化について

Windows上でWindowsコンテナを実行する方法については、下記の2パータンかと思いますが、Doker Desktopが無償利用に制限があるため今回は②パターンを選択。

① WindowsにDocker Desktopをインストールして利用する
② Windows上にDocker Engineをインストール

## ドキュメント

[Install server and client binaries on Windows](https://docs.docker.com/engine/install/binaries/#install-server-and-client-binaries-on-windows)

[作業の開始:コンテナー用の Windows を準備する](https://learn.microsoft.com/ja-jp/virtualization/windowscontainers/quick-start/set-up-environment?tabs=dockerce)

## バイナリのダウンロード

[Index of win/static/stable/x86_64/](https://download.docker.com/win/static/stable/x86_64/)

バイナリダウンロードサイトから最新版のバイナリをダウンロードします。
今回利用するのは、docker-27.0.3.zipとなります。

## バイナリのインストールとサービス登録

ドキュメントを参照するとPowerShellでzipファイルの展開とインストールを進めるようです。

下記はダウンロードしたzipファイルを`c:\qiita\docker\docker-27.0.3.zip`に配置してインストールした例。

なおドキュメントにある手順ではprogram files直下にファイルを展開しているため、PowerShellは管理者で実行してください。

```powershell
# Program Filesにアーカイブを展開
Expand-Archive "C:\qiita\docker\docker-27.0.3.zip" -DestinationPath $Env:ProgramFiles

# サービス登録
&$Env:ProgramFiles\Docker\dockerd --register-service

# サービス起動
Start-Service docker

# サービス確認
Get-Service docker
```

コマンド実行後、dockerサービスが起動している事を確認できました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/4fa24a1b-0e33-a24c-e06e-e421588fdd4e.png)

なお下記のようなサービスが登録されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/24d4bb38-9c4e-a932-e518-823c28b2df04.png)

### Windows機能からHyper-Vとコンテナ機能を有効化

ドキュメントに従い、dockerサービスをインストール後、dockerのhelloworldを実行した所、下記のようなエラーが発生しました。

>docker: Error response from daemon: hcs::CreateComputeSystem f74c737d4e2360dc2332da72036c801d1a4d28ed4f9a928f54c78fdd6d9edbe1: The request is not supported.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/b7e104c0-9bdb-83ea-ec8f-318ae0893ab1.png)

調べてみると、Windows機能でHyper-Vとコンテナが無効化されていない場合や、BIOSで仮想化機能が無効化されている事が原因のようです。

確認してみると、実行端末ではどちらもDisabledとなっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/79b6946d-cfe9-9be8-659c-e5a3753f4044.png)

```powershell
# Hyper-Vが有効化されているか確認（管理者実行）
Get-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V

# コンテナが有効化されているか確認（管理者実行）
Get-WindowsOptionalFeature -Online -FeatureName containers
```

上記コマンドで確認を行い、機能がDisabledの場合は下記コマンドを実行して、Hyper-Vとコンテナ機能を有効化します。

なお有効化には管理者実行が必須となり、有効化時に再起動を求められます。

```powershell
# Hyper-Vを有効化（管理者実行）
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V –All

# コンテナを有効化（管理者実行）
Enable-WindowsOptionalFeature -Online -FeatureName containers –All
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/30fc6891-cd9c-bc4a-ac61-4c8fddc289f5.png)

## helloworldイメージを実行

```powershell
&$Env:ProgramFiles\Docker\docker run hello-world:nanoserver
```

上記コマンドにてnanoserverでhelloworldを実行しています。
初回実行時はダウンロードが発生するのでしばらく待ちます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/e39e2b32-eb8b-f9f2-53b6-3f09255a6d51.png)

実行されました。

Linuxコンテナの時と同様に、どのような仕組みでterminalにhelloworldが表示されているかについて記載があります。

## 公式ではDocker Desktopのインストールが推奨されている

[Install Docker Engine from binaries](https://docs.docker.com/engine/install/binaries/#install-server-and-client-binaries-on-windows)

バイナリインストールでは自動更新等がされないなど、公式としては推奨はされていないインストール方法となるようです。
（あくまでDocker Desktopを利用するのが推奨）

## 総評

Windows上でDocker Desktopを利用しないLinuxコンテナ実行環境構築に続き、Windowsコンテナの実行環境構築についてもまとめてみました。