AWS環境EC2のWindowsServerでLinuxコンテナを扱えないのか(2022/1/2時点)

#概要と結論
結論、WindowsServerではLinuxコンテナを扱えませんでした。(2022/1/2時点)

同じようにWindowsServerでLinuxコンテナを稼働させようと試みている方向けに、私の検討したことが諦める一助となればと思い記事を書いています。

**前提**
　・AWS環境を利用のEC2にて以下AMIを構築
　・以下AMIを利用しEC2を構築(WindowsServer2022 コンテナ機能付き)
　　－Windows_Server-2022-English-Full-ContainersLatest-2021.12.15

**やってみたこと**
全てNGでしたが以下を試してみました。
　・WindowsServerの機能に付随しているdocker機能でLinuxコンテナを使用してみる
　・WSL機能をインストールしdocker機能を使用してみる
　・Linux Containers on Windows(LCOW)を使ってみる
　・docker desktopを使ってみる

##WindowsServerの機能に付随しているdocker機能でLinuxコンテナを使用してみる
WindowsServerのAMIの一部にはコンテナ機能を付随したイメージがあります。WindowsServer2022の場合は「Windows_Server-2022-English-Full-ContainersLatest-2021.12.15」です。(2022/1/2時点)

このAMIをベースとしたサーバ(EC2)にログインし、Linuxコンテナを利用できるか試してみます。
まずは普通にdockerコマンドが使えるか確認してみます。
なお、以下はPowershellで実行していますがコマンドプロンプトでも実施可能です。

```powrshell
PS C:\Users\Administrator> docker --version
Docker version 20.10.7, build 40ef3b6
PS C:\Users\Administrator>
PS C:\Users\Administrator>
PS C:\Users\Administrator>
PS C:\Users\Administrator> docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
11961e4f2e13: Pull complete
d24add324b48: Pull complete
caa028ea82a4: Pull complete
Digest: sha256:2498fce14358aa50ead0cc6c19990fc6ff866ce72aeb5546e1d59caac3d0d60f
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest
PS C:\Users\Administrator> docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
hello-world   latest    9d446e6097f8   2 weeks ago   295MB
PS C:\Users\Administrator> docker run -it hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (windows-amd64, nanoserver-ltsc2022)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run a Windows Server container with:
 PS C:\> docker run -it mcr.microsoft.com/windows/servercore:ltsc2019 powershell

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

PS C:\Users\Administrator>
```
"hello-world"イメージは実行が可能でした。
当該イメージのベースOSを確認すると、Windowsであることがわかります。

```
PS C:\Users\Administrator> docker image inspect hello-world
[
    {
        "Id": "sha256:9d446e6097f89d6b11a45127c18c7844db98c5e20d93e8e9dfdc29140863a7de",
        "RepoTags": [
            "hello-world:latest"
・・・中略・・・
        "Os": "windows",
        "OsVersion": "10.0.20348.405",
```

次では本題のLinuxベースのコンテナを扱えるか確認してみます。
具体的にはイメージをpullしてみます。

```
PS C:\Users\Administrator> docker pull centos:centos7
centos7: Pulling from library/centos
no matching manifest for windows/amd64 10.0.20348 in the manifest list entries
```

エラーとなりpullできません。
次にLinuxサーバでdocke saveしたイメージ(centos-image.tar)を展開できるかを確認してみます。

```
PS C:\Users\Administrator> docker load -i C:\centos-image.tar
unsupported os linux
PS C:\Users\Administrator>
```

「Linuxはサポートされていない」とメッセージが出力され展開ができませんでした。

以上より、WindowsServerに付随するdocker機能ではLinuxコンテナを扱えません。

##WSL機能をインストールしdocker機能を使用してみる
WindowsServerにはWSLというWindowsServer上でLinuxコマンドを実行する機能です。
このWSL機能を有効化しLinuxイメージを展開することでLinuxが扱えます。
WindowsServerの「役割と機能の追加」でインストール可能なため、WSL用にソフトウェアなどは不要です。LinuxイメージはWindowsストアからダウンロードできるLinuxイメージに限られます。(Ubuntuなど、RHELは2021/1/2時点でなし。)
WSLインストールからLinuxを利用できるようになるまでは以下のQiita記事が非常に参考になりました。(ありがとうございます)
　・https://qiita.com/fararrow/items/1007c850d81022799420
Ubuntuにdockerをインストール手順は以下が参考になりました。(ありがとうございます)
　・https://www.softek.co.jp/SID/support/sidfmvm/guide/install-docker-ubuntu1804.html

wslでlinux系のdockerを扱えるか確認してみます。

```
PS C:\Users\Administrator> wsl
admin@EC2AMAZ-HARCC53:/mnt/c/Users/Administrator$ docker --version
Docker version 20.10.12, build e91ed57
admin@EC2AMAZ-HARCC53:/mnt/c/Users/Administrator$ sudo service docker start
 * Starting Docker: docker                                                                                       [ OK ]
admin@EC2AMAZ-HARCC53:/mnt/c/Users/Administrator$ sudo service docker status
 * Docker is running
admin@EC2AMAZ-HARCC53:/mnt/c/Users/Administrator$ docker image ls
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/images/json": dial unix /var/run/docker.sock: connect: permission denied
admin@EC2AMAZ-HARCC53:/mnt/c/Users/Administrator$ sudo docker image ls
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
admin@EC2AMAZ-HARCC53:/mnt/c/Users/Administrator$ sudo docker pull centos:centos7
centos7: Pulling from library/centos
2d473b07cdd5: Pull complete
Digest: sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd618426a630e0987
Status: Downloaded newer image for centos:centos7
docker.io/library/centos:centos7
admin@EC2AMAZ-HARCC53:/mnt/c/Users/Administrator$ sudo docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
centos       centos7   eeb6ee3f44bd   3 months ago   204MB
admin@EC2AMAZ-HARCC53:/mnt/c/Users/Administrator$ sudo docker run -it centos:centos7
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:722: waiting for init preliminary setup caused: EOF: unknown.
ERRO[0004] error waiting for container: context canceled
admin@EC2AMAZ-HARCC53:/mnt/c/Users/Administrator$
```

pullはできるもののrunはエラーが発生する状況となります。
WSLは「LXSS.SYS」「LXCore.SYS」というドライバで稼働し背後にはWindowsカーネルで稼働するため、dockerのようにホストのカーネルに依存する仕組みを利用する際は動作しないのでは？と考えています。
WSLの仕組みは以下が参考になります。(ありがとうございます)
　・https://atmarkit.itmedia.co.jp/ait/articles/1906/14/news019.html

結局のところWSL上で稼働するLinuxでは一部のdockerコマンドのみ利用できる、
といったことが現状です。

##Linux Containers on Windows(LCOW)を使ってみる
LCOWとはWindowsServer上でLinuxコンテナを扱うための機能です。
LCOWはGitHub上で開発がなされていますが、readme上、開発が中断しているとの記載があります。
https://github.com/linuxkit/lcow
>LCOW support was experimental and is no longer being developed. This repository is now archived.

→LCOWのサポートは実験的なものであり、現在は開発されていません。
　このリポジトリは現在アーカイブされています。

以上よりLCOWも使用できません。。

##docker desktopを使ってみる
dockerデスクトップはWindowsOS上でコンテナ開発を行うための製品です。
以下の通りシステム要件上、Windows10などのクライアントOSのみをサポートする状況です。
https://docs.docker.jp/docker-for-windows/install.html
>システム要件
>Windows 10 64 ビット：Pro、Enterprise、Education（ビルド 15063 以上）
>Hyper-V と Windows コンテナ機能の有効化が必要

EC2上のWindowsServerではHyperVの機能を有効化できないためdocker desktopが起動しませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505716/69e71169-fdc8-56bb-fb33-dd65affbc660.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/505716/492a8d16-d20a-1ced-c7af-4c12866ec02d.png)

#まとめ
現状(2022/1/2)時点では、AWS環境EC2のWindowsServerでLinuxコンテナを扱う手立てがないと考えています。
Linuxコンテナを利用する場合は素直にベースホストとしてLinux系を利用した方が良いと思います。