Windows11(WSL2)上のUbuntuにDocker EngineをインストールしてLinuxコンテナを実行してみる

Windows環境上でDockerを利用する場合は

- ① WindowsにDocker Desktopをインストールして利用する（Windowsコンテナ、LinuxコンテナはWSL2と連携）
- ②Windows上のWSL2でLinux環境を用意して、その上にDocker Engineをインストールして利用する（Linuxコンテナ）
- ③ Windows上にDocker Engineをインストール（Windowsコンテナ）

の方法がありますが、今回は②の方法でインストールを行い、Linuxコンテナを実行してみます。

## Docker Desktop有償化について

環境用意としては、Docker Desktopをインストールするのが一番簡単でてっとり早いかと思いますが、

2024年7月現在、Docker Desktopが無償利用に一定の条件があるため。
今回はDocker Desktopではなく、Docker Engineをインストールして利用してみます。

なおDockerのサブスクリプションとライセンスについては、下記のよくある質問に説明があります。

[Dockerに関するよくある質問](https://www.docker.com/ja-jp/pricing/faq/)

## 参考Webサイト

- [Windows 上の Docker エンジン](https://learn.microsoft.com/ja-jp/virtualization/windowscontainers/manage-docker/configure-docker-daemon)
- [Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)
- [Linux post-installation steps for Docker Engine](https://docs.docker.com/engine/install/linux-postinstall/)
- [Install Docker Engine from binaries　※今回は参照していないがWindowsにバイナリインストールする場合の手順について記載あり](https://docs.docker.com/engine/install/binaries/)

## 今回利用する環境

- Windows 11 23H2
- WSL2上のUbuntu 22.04
- Docker Engine - Community 27.0.3

## WSL2のインストールについて

Windows11にWSL2環境の用意については下記記事を参照して用意してください。

[Windows 11にWSL2をインストールする](https://qiita.com/SAITO_Keita/items/148f794a5b358e5cb87b)

## Docker Engineのインストールについて

[Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/)

本記事では上記手順を参照し、Ubuntu22.04にDocker Engineをインストールします。

なお、公式ドキュメントを確認するともろもろを一発でインストールしてくれるスクリプトも提供されているようですが、今回は利用しません。

[Install using the convenience script](https://docs.docker.com/engine/install/ubuntu/#install-using-the-convenience-script)

なおこのインストールスクリプトについては、本番環境での利用は非推奨となっていました。

### 古いバージョンの削除

[Uninstall old versions](https://docs.docker.com/engine/install/ubuntu/#uninstall-old-versions)


```bash
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
```

まずは上記コマンドで古いバージョンがインストールされている場合、こちらを削除するようです。

上記コマンドでは下記のパッケージがインストールされていたら削除しています。

- docker.io
- docker-compose
- docker-compose-v2
- docker-doc
- podman-docker

実施している環境は以前にDockerをインストールしていなかったため、対象はありませんでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/5abd3587-ecee-1355-8356-09c0525a8e26.png)

### Dockerエンジンのインストール

[Install using the apt repository](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository)

本記事ではaptリポジトリを利用してインストールしていきます。

#### リポジトリの登録

```bash
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
```

記載されているインストールコマンドを実行していきます。

これらのコマンドは下記を実施しています。

- Docker公式GPGキーを取得するのに必要なパッケージ（ca-certificates、curl)をインストール
- GPGキーをダウンロードして適切な権限に調整
- リポジトリを追加

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/23c6fb2b-b708-cdab-a660-db11b8120853.png)

### 最新バージョンをインストール

```bash
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

本手順では上記コマンドを実行して最新バージョンをインストールしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/c8578dba-ef67-2127-bd31-0873ef10bc01.png)

特定バージョンをインストールする場合は、別途手順があるのでそちらを参照してインストールしてください。

### hellworldを実行

```bash
sudo docker run hello-world
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/a33e4153-7661-6c73-eee7-c4ad3dd7cfef.png)

初回実行時はダウンロード処理が実行されたあとに、Hello worldなメッセージと、このメッセージがコンソールに表示されるまでの仕組みについて表示があります。

Docker ClientとDocker daemonがうまく事やって、Docker Hubからイメージをダウンロードして、コンテナを作成して実行し、コンソールに結果を表示しているようです。

## dockerコマンドを非ルートユーザーで管理する場合

[Manage Docker as a non-root user](https://docs.docker.com/engine/install/linux-postinstall/#manage-docker-as-a-non-root-user)

本手順では実施しませんが、dockerコマンドを非ルートユーザーで管理したい場合は、上記ページにドキュメントがあります。

## vscodeの拡張機能を利用してWSL2上のUbuntuにアクセスしてdocker helloworldを実行してみる

VSCodeでWSLと連携する拡張機能があったので、ここではVSCodeを利用してhelloworldコマンドを実行してみます。

[vscode - WSL](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl)

[VS Code と WSL 拡張機能をインストールする](https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-vscode#install-vs-code-and-the-wsl-extension)

まずは上記ドキュメントを参照してVSCodeに拡張機能をインストールしておきます。

その後、WSL2上のディストリビューションで`code .`と実行するか、Windows側でvscodeを起動してコマンドパレットからWSLへ接続を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/1b07af37-5c5e-7275-8dcf-45ebf0d48763.png)

接続すると左下にWSL: Ubuntuと表示され、WSL2 上のubuntuに接続できた事を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/0fe1c0c0-e3b2-155b-d8c7-c81ca3ec00a7.png)

あとはターミナル画面を開き（Ctrl+@)、そこでコマンドを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/89b2d7fe-8152-4796-86a8-054f4ba6b2ae.png)

WSL2なubuntu上でdockerのhelloworldができました。

## 今回構築した環境ではWindowsコンテナは直接実行できない

dockerコンテナを利用する場合、利用するイメージが対応しているプラットフォームと動作させるプラットフォームが一致している必要があります。

今回、Windows端末を利用していますが、実態はWSL上のLinux上のdockerを利用しているため、今回の環境ではlinux/amd64なイメージが利用できます。

環境のOS/Archについては`sudo docker version`で確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/2c3606d1-7761-3847-f511-8458843f771f.png)

### Windowsコンテナ実行をためしてみる

[Windows コンテナーを実行する](https://learn.microsoft.com/ja-jp/virtualization/windowscontainers/quick-start/run-your-first-container#run-a-windows-container)

ためしにWSL2上のUbuntuでWindowsコンテナを実行してみるとどうなるか確認してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1670622/3ab4802d-a049-b9ff-7105-850662d41762.png)

>docker: no matching manifest for linux/amd64 in the manifest list entries.

とメッセージが表示されて、今回の環境`linux/amd64`で利用できない旨が表示されています。

Windows上でWindowsコンテナとLinuxコンテナを両方利用したい場合は

- Docker Desktop for Windowsをインストールして、LinuxコンテナはWSL2との連携機能を利用する
- Windows側にもdocker Engineをバイナリインストールする

になるかと思います。

## 総評

Windows上でDocker環境を構築するには、Docker Desktop for Windowsをインストールして利用するのが一番簡単な環境構築方法かと思いますが。

無償利用に制限があるため、今回はWSL2上のUbuntuにDockerエンジンをインストールしてhelloworldを実行する方法についてまとめました。

WindowsにDockerをインストールするだけのお話ですが。

Docker Desktopのライセンスの話だったり。
コンテナイメージのOS/ARCHな話もあったり。

書き出すと補足事項が多く、何もわからんで手を出すと、少しハードルが高い気もします。