掲載内容は個人の見解であり、所属する企業を代表するものではありません.
以前から割と気になっていたのですが Windows Server 上での LCOW : Linux Container on Windows はやり方がイマイチ安定せず、 これまでも紆余曲折を経つつ結局どうすればいいのか良くわからない状況だったと思います。 その辺の詳細は こちら などで紹介されています。
ところが、たまたま Twitter で 現実逃避 情報収集をしていたところ、下記の様な Tweet を見つけてしまいました。
これ、WSL2 に Docker インストールすればあっさり動くのでは?と思ったので試してみたら上手くいった、というのが本記事の趣旨になります。
WSL2 now in Windows Server 2022!! WSL2 will be broadly available in the June cumulative update, for those looking to get it sooner it is available today by installing the 5C update here: https://t.co/ICZLBjz47j...
— Elden Christensen (@EldenCluster) May 25, 2022
そもそも Linux コンテナなんだから Linux マシン上で動かせばいいじゃんというのは全くもってその通りなのですが、 コンテナの開発マシンを Azure 上に用意することを考えると、以下の観点でシンプルになるかなと思います。
つまり下記の様なことがしたいわけです。
開発したコンテナイメージを Azure Container Registry で管理するなら同じ Azure リージョンから Push したほうが速くて安いですし、 Azure Kubernetes Service、Web Apps for Container、Azure Functions、Azure Batch、そして先日 GA した Azure Container Apps といった各種のコンテナアプリを動かすプラットフォームでテストもしやすいでしょう。 特に Enterprise 系のシステムですとこれらのサービスは Private Endpoint や VNET Injection 等を使用して閉域化されることが多いため、同じ VNET に接続できる Azure 仮想マシンで開発からテストまでやれると便利です。
Windows Server 2022 な仮想マシンを作るところから始めます。 ポータルからポチポチやるとどのベースイメージが作られるかわかりにくいので、Azure CLI で作ってみます。
まずは利用できる VM イメージを確認してみましょう。
(実際にはもっと沢山でてきます)
なるべく最新版を選んで Windows Update と再起動の手間を省きたいものです。
本校執筆時点でも June 14, 2022—KB5014678 (OS Build 20348.768) が最新みたいなので、
上記のリストで表示されている一番新しい MicrosoftWindowsServer:WindowsServer:2022-datacenter-azure-edition:20348.768.220609
が良さそうですね。
$ az vm image list --publisher MicrosoftWindowsServer --offer WindowsServer --sku 2022-datacenter-azure-edition --all -o table
Offer Publisher Sku Urn Version
------------- ---------------------- -------------------------------------------- ------------------------------------------------------------------------------------------------------ --------------------
WindowsServer MicrosoftWindowsServer 2022-datacenter-azure-edition MicrosoftWindowsServer:WindowsServer:2022-datacenter-azure-edition:20348.469.220106 20348.469.220106
WindowsServer MicrosoftWindowsServer 2022-datacenter-azure-edition MicrosoftWindowsServer:WindowsServer:2022-datacenter-azure-edition:20348.473.220116 20348.473.220116
WindowsServer MicrosoftWindowsServer 2022-datacenter-azure-edition MicrosoftWindowsServer:WindowsServer:2022-datacenter-azure-edition:20348.524.220201 20348.524.220201
WindowsServer MicrosoftWindowsServer 2022-datacenter-azure-edition MicrosoftWindowsServer:WindowsServer:2022-datacenter-azure-edition:20348.587.220303 20348.587.220303
WindowsServer MicrosoftWindowsServer 2022-datacenter-azure-edition MicrosoftWindowsServer:WindowsServer:2022-datacenter-azure-edition:20348.643.220403 20348.643.220403
WindowsServer MicrosoftWindowsServer 2022-datacenter-azure-edition MicrosoftWindowsServer:WindowsServer:2022-datacenter-azure-edition:20348.707.220505 20348.707.220505
WindowsServer MicrosoftWindowsServer 2022-datacenter-azure-edition MicrosoftWindowsServer:WindowsServer:2022-datacenter-azure-edition:20348.768.220609 20348.768.220609
また WSL は BIOS で仮想化が有効になっていることや、CPU の機能などに一定の要件があります。
よって Azure VM なら入れ子になった仮想化(Nested Virtualization) をサポートする VM である必要があります。
各仮想マシンサイズで入れ子になった仮想化のサポート有無はこちらのドキュメントから確認できます。
例えば Dv5
シリーズなどが該当します。
では下記の様なコマンドで仮想マシンをデプロイしていきます。 管理者パスワードを聞かれるので入力してください。
$ az group create --name container-dev-rg --location japaneast
$ az vm create --name dev-vm --resource-group container-dev-rg --admin-username admin --size Standard_D2_v5 \
--image MicrosoftWindowsServer:WindowsServer:2022-datacenter-azure-edition:20348.768.220609
前述の az vm create
が正常終了すると Public IP Address が表示されているので、そちらを利用してリモートデスクトップ接続します。
> mstsc /v:198.51.100.178
ここからは接続した RDP セッション内での作業になります。
もう Internet Explorer は使わないのですが、この後の手順でインターネットアクセスする際に邪魔されることがあるので、IE ESC : Internet Explorer Enhanced Security Configuration を無効にしておきましょう。 Windows Server のデスクトップセッションに接続すると Server Manger が起動していると思いますので、そちらからすかさず無効化します。 詳細な手順はこちら などをご参照ください。
PowerShell ないしはコマンドプロンプトを起動して現在のバージョンを確認します。
もちろん winver
でも構いません。
> ver
Microsoft Windows [Version 10.0.20348.768]
次に WSL のインストールを行います。 すでに英語版の公式ドキュメント には Windows Server 2022 用の手順が記載されていました。 日本語版もそのうち対応することでしょう。
> wsl --install
Installing: Virtual Machine Platform
Virtual Machine Platform has been installed.
Installing: Windows Subsystem for Linux
Windows Subsystem for Linux has been installed.
Downloading: WSL Kernel
Installing: WSL Kernel
WSL Kernel has been installed.
Downloading: Ubuntu
The requested operation is successful. Changes will not be effective until the system is rebooted.
上記の通り既定では Linux ディストリビューションとして Ubuntu がインストールされます。 私は特に拘りがないのでこのまま進めて再起動します。
> shutdown /r /t 0
一度リモートデスクトップ接続が切れてしまいますが、少し間をおいて再接続しましょう。
すると自動的にペンギンアイコンで wsl.exe
なコンソールが起動してセットアップが始まり、
その後 Ubuntu
アイコンなコンソールが起動してセットアップが始まります。
上手くいくと Unix username と password の入力が求められますので、適宜入力してください。
また別途コマンドプロンプトないしは PowerShell から WSL のバージョンが 2 になっていることを確認しておきましょう。
> wsl.exe --list --verbose
NAME STATE VERSION
* Ubuntu Running 2
ここからは WSL2 で動作する Ubuntu コンソール上での作業です。
まず Ubuntu のバージョンを確認すると 20.04 LTS
でした。
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
対応する Linux ディストリビューション用の Docker のセットアップ手順を 公式ドキュメント から探して実行してください。 とりあえずココでは一番楽そうなヤツでインストールします。
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
このあと滅茶苦茶 docker
コマンドを打つことになるので、sudo
なしで実行できるようにしておきます。
docker
グループに自分を追加したあと、設定を反映するために一度 Ubuntu のターミナルを落とします。
$ sudo usermod -aG docker ${USER}
$ exit
再度起動した Ubuntu コンソールで docker
サービスを起動して、テスト実行してみましょう。
$ sudo service docker start
* Starting Docker: docker [ OK ]
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:80f31da1ac7b312ba29d65080fddf797dd76acfb870e677f390d5acba9741b17
Status: Downloaded newer image for hello-world:latest
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.
(amd64)
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 an Ubuntu container with:
$ docker run -it ubuntu bash
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/
ここまでで Linux コンテナの動作環境としてはセットアップが完了していますが、ここは開発環境ですので IDE が必要です。 Visual Studio Code をインストールし、 さらに Remote Development extension pack もインストールします。
Visual Studio Code の Command Palette (Ctrl+Shift+p) から Remote-WSL: Open Folder in WSL
を選択し、作業にディレクトリを指定すれば準備完了です。
もし Git リポジトリにソースコードが管理されているなら、別途 git clone
しておいたディレクトリを選ぶだけですね
昨今は Github Codespace やら vscode.dev やら Microsoft Dev Box やら、開発ワークステーションとしてのクラウドサービスも拡充していく傾向にあり楽しい限りです。 一方で好き勝手にカスタマイズ可能な仮想マシンベースの開発環境も、まだまだ捨てがたいものがあると思いますので、本記事が参考になれば幸いです。