ENGINEER BLOG

ENGINEER BLOG

WSL2でDockerを動かしてみる

こんにちは。イノベーション本部の若林です。

みなさん、WSL使ってますか?
私はといえば、もうWSL無しで開発するのが考えられないくらいバリバリ活用しております。

そんな便利なWSLですが、昨年5月に従来のWSL(以降、WSL1)の新バージョンであるWSL2が正式リリースされましたね。
WSL2の目玉は、なんといってもWSL上でDockerが動くことではないでしょうか?

ということで、今回はWSL2へDocker環境を作ってみようと思います?

WSL2でなぜDockerが動くのか

環境を作っていく前に、WSL2でDockerが動く仕組みを少しお勉強してみたいと思います。
(そもそも「WSL is 何?」なお話は今回は割愛させていただきます?‍♂️)

WSL2でなぜDockerが動くのか、逆に言えばWSL1ではなぜDocker(正確にはDocker Engine)が動かないのかは、それぞれのアーキテクチャの違いに理由があります。

WSL1のアーキテクチャ

WSLはWindows Subsystem for Linuxの略称ですが、そもそもLinuxってなんでしょう??
Linuxとは、狭義にはLinuxの心臓部であるLinuxカーネル自体のことを、広義にはLinuxカーネルをカーネルとして利用しているOSのことを指します。
いずれにしても、LinuxというからにはLinuxカーネルの存在が重要というわけです。

ところが、実はWSL1にはLinuxカーネルが存在しません。

WSL1でシェルコマンドを叩くと、LXCore/LXSSというドライバによってLinuxシステムコールがWindows NTシステムコールへ変換され、Windows NTカーネルへ到達します。
WSL1で最終的に会話している相手は、LinuxカーネルではなくWindow NTカーネルだったんですね?

WSL2のアーキテクチャ

一方、WSL2はハイパーバイザのWSL専用仮想マシン上で動いています。
この仮想マシンにはMicrosoftがチューニングしているホンモノのLinuxカーネルが載っています。

WSL2でシェルコマンドを叩くと、WSL1とは異なり、ちゃんとLinuxカーネルと会話することができます。

01
引用:完全なLinuxがWindows 10上で稼働する? 「WSL 2」とは

WSL2でDockerが動く理由(WSL1で動かない理由)

Dockerを動かすにあたってもLinuxカーネルの存在が重要です。
Dockerはコンテナ内部からDocker Engineを介してホストOSのLinuxカーネルを利用して動作しています。

前述の通り、WSL1にはLinuxカーネルは存在していません。
このためWSL1ではDockerを動かすことができないというわけです?

一方、WSL2にはホンモノのLinuxカーネルが搭載されています。
よって、WSL2であればDockerはちゃんと動いてくれます?

WSL2環境構築

さて、ある程度WSL2の仕組みが分かったところで、WSL2環境を構築していこうと思います。
Microsoft公式のインストール手順に沿ってWSL2をインストールしていきます。

システム要件の確認

WSL2を利用するにはWindows 10が以下の要件を満たしている必要があります。

  • x64 システムの場合:バージョン 1903 以降、ビルド 18362 以上。
  • ARM64 システムの場合:バージョン 2004 以降、ビルド 19041 以上。

バージョン情報を確認してみます。問題ないですね!

02

WSLと仮想マシンの有効化

管理者として開いたPowerShellから以下を実行して、WSLと仮想マシンを有効化します。

# WSLの有効化
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

# 仮想マシンの有効化
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

ここで一度Windowsを再起動します。

WSL2用Linuxカーネルを適用

ここまでで準備したWSLへWSL2用Linuxカーネルを適用します。
アーキテクチャに合わせてLinuxカーネル更新プログラムをダウンロードしてください。

ダウンロードできたらインストーラを起動して更新を完了します。

03

WSL2を既定のバージョンへ設定

管理者として開いたPowerShellから以下を実行し、WSL2が既定バージョンとして使われるように設定しましょう。

# WSLの既定バージョンを2へ設定
wsl --set-default-version 2

Linuxディストリビューションをインストール

Microsoft StoreからWSL2で使いたいLinuxディストリビューションを選択してインストールします。
お好きなディストロをインストールしてください。
今回はUbuntuをインストールしてみます。

04

Ubuntuを選択して、インストールボタンをクリックします。
このときMicrosoftアカウントが必要になるので、アカウントを持っていなければ作成してください。

05

インストールが終わったら、起動ボタンをクリックします。

06

コンソールが開き、Ubuntuのインストールが始まります。
終わるまでお茶でも飲んでしばし待ちましょう( ^^) _旦~~

インストールが終わったらUbuntuで使うユーザ名とパスワードの設定を求められるので入力します。

07

以上でWSL2の環境構築は完了です!

Docker環境構築

次に、WSL2のUbuntuへDockerをインストールします。
Docker公式のインストール手順に沿って進めていきます。

Dockerのインストール

Dockerをインストールしていきます。

# パッケージを更新する
sudo apt-get update
sudo apt-get upgrade

# Dockerのインストールに必要なパッケージをインストールする
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

# DockerのGPG鍵を登録する
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# DockerのPPAを登録する
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# Dockerのインストール
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

# sudoなしでdockerコマンドを使えるようにする
sudo usermod -aG docker $USER

# ここまでで一旦シェルを抜けます
exit

動作確認

再びシェルを起動して、Dockerがインストールされたか確認してみます。

$ docker -v
Docker version 20.10.2, build 2291f61
$

次に、Dockerデーモンを起動します。

$ sudo service docker start
 * Starting Docker: docker                                                                                       [ OK ]
$

そしていよいよ、コンテナを起動してみます。
hello-worldイメージを使ってコンテナ起動してみましょう。

$ docker run 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.
    (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/

$

動きました!!!(あっさり?)

もう少し実用的に使うには、Windows側からWSL上のDockerコンテナへlocalhost接続できるように設定を追加してあげる必要があります。
詳しいやり方はたくさんの方が記事にされているので調べてみてください。
今回はここまでのご紹介で終わらせていただきたいと思います?‍♂️

さいごに

お仕事でもDockerを使ったマイクロサービスアプリの開発事例がじわじわ増えてきています。
そして、WSL2の登場によってWindowsでもこれまでより簡単にDocker環境を構築できるようになりました。
これを機に、社内におけるDockerの活用を一層盛り上げていけるように頑張っていきたいと思います?

以上、ご精読ありがとうございました!