スクエニ ITエンジニア ブログ

Windows で Docker Desktop を使わない Docker 環境を構築する (WSL2)

ホシイです。こんにちは。

あまりこういうことばかりを書いていると怒られそうですが、やっぱり有料ライセンスが必要なソフトウェアって使い始めるのに敷居を感じてしまいます。でも、本格的にチームに導入する前に container での開発をしばらく検証したいとか、年に数回しか使わないからライセンス費用を抑えたいという場合もあるかと思います。

以前に、Docker push での事故を防ぎたい という記事を書きました。このときは有料ライセンスがあることを前提に、push するときには気をつけよう!というのが主題でした。

Docker CE は Docker の Community Edition で、Linux で Docker を無料で使えます。今回は、Docker が業務になじむかわからないけど、まずは試してみたいな… という場合でも迷わずすぐにはじめられるように、WSL2 + Docker CE を使って container を利用できる環境構築をしてみましょう。

※ 今回は Windows 10 を使用しています。Windows 11 をお使いのかたは (ほぼおなじだと思いますが)、適宜読み替えなどおねがいします。

まずは WSL2 を使えるようにする

PowerShell などを使い、WSL を有効にし、また、(WSL1 ではなく) WSL2 を default に設定しておきます。後者は必須ではありませんが、今回の内容では WSL1 では動かないハマりポイントがあるので、他で WSL1 をメインに使われているとかでなければ設定しておくのをおすすめします。

PS C:\> wsl --install
PS C:\> wsl --set-default-version 2

次に、Microsoft Store から以下二点を install しておきます。

  • Ubuntu 22.04
    • 一度起動して install を完了しておく (一般 user をつくる)
  • (おすすめ) Microsoft Terminal を入れる

Ubuntu は MS Store に複数のバージョンがありますが、記事作成時点で最新の 22.04 を使います。また、環境や version によっては追加で install の必要がなく、最初から Ubuntu が install される場合があるようです。現在 install されているものは以下のようにして確認できます。version にこだわりなければ入っているものでそのまま進めていただいてもだいじょうぶです。

hoshy@wsl-host:~$ wsl.exe --list -verbose
  NAME                   STATE           VERSION
* Ubuntu-22.04           Running         2
  Ubuntu                 Stopped         2

Windows Terminal を起動し、WSL の Ubuntu が使用できることを確認します。またここで、一般 user の作成を促されますので作成しておいてください。

Docker CE を入れる

以下は (WSL ではなく生の) Ubuntu に Docker CE を入れる手順ですが、WSL でもそのまま使えます。 https://docs.docker.com/engine/install/ubuntu/

上記と合わせてこちらも参照すると便利です。(というか上記に目を通しつつこちらを基本に進めるとよさそうです) https://dev.to/felipecrs/simply-run-docker-on-wsl2-3o8

(さらに、実は こちら の記事の冒頭にも Docker を使うためのまた別の手順 (例) があったりしますのでご参考に…)

sudo せずに docker コマンドを実行できるようにする手順も実施しておくと便利です。

(上記リンク先にもありますが) 起動には systemctl が使えないので以下のようにします。自動起動の設定も、上記の参考サイトを参照してください。

hoshy@wsl-host:~$ sudo service docker start

使ってみる

image pull、container 起動、local disk の mount と port forward くらいの動作を確認します。

hoshy@wsl-host:~$ docker images
hoshy@wsl-host:~$ docker run -p 8080:80 -v `pwd`/test:/usr/share/nginx/html --rm -it nginx

これで、Windows のブラウザから http://localhost:8080 にアクセスし、nginx に接続できることを確認します。

Visual Studio Code で devcontainer を使う (option)

唐突かもしれませんが、この状態で VS Code の devcontainer 機能も使えると非常に便利です。やってみましょう。

以下ふたつの extension を使用します。

Command Palette を開き (Ctrl + P)、Remote-WSL: Open Folder in WSL... を選択します。 他の手段でもよいのですがとにかく、VS Code が、WSL 内の folder を開いている状態にしておくことが必要なようです。新規でも既存でもよいのでどこか都合のよい場所を開いてください。

ふたたび Command Palette を開き、Remote-Containers: Add Development Container Configuration Files... を選択します。このあたりは通常の devcontainer の扱いと同様です。すでに .devcontainer directory が存在する既存の git repository を clone してきてもよいです。

Remote-Containers: Open Workspace in Container... を実行します。うまくいけば devcontainer の build がはじまり、build が完了すれば workspace が devcontainer 内で開かれます。

できあがり

Docker Desktop を必要とせず、WSL を起動しておけば container が使える状態になりました。 (Docker Desktop も install している人は、それが起動していない状態で使用できることを確認してください) また、Windows のブラウザから直接接続することもできますし、VS Code も Windows 側のものが自然に利用できるので非常に便利です。これまで application 開発に VM や共有サーバーを使用していた用途はたいていの場合カバーできるのではないでしょうか。

最後にですが、わたしが見つけた、おなじテーマで書かれている記事を参考に置いておきます。書く人によって注目する点も違っていて興味深いです。あわせてご参照ください。

また、こちらも Ubuntu 22.04 への Docker install 記事で、本文でリンクをはった Docker 公式サイトのものとほぼおなじに見えますが、参考に置いておきます。

さらに…

Windows ではないのですが、Rancher Desktop を使ってみる 記事も書きましたので、よろしければご覧ください。

トラブルシューティング

Docker の log は (WSL Ubuntu 内で) /var/log/docker.log に出力されます。起動しないなどの場合は log にエラーが出ていないか確認します。

docker daemon が起動しない

time="2022-06-04T13:40:30.481274700+09:00" level=warning msg="Running iptables --wait -t nat -L -n failed with message: `iptables/1.8.7 Failed to initialize nft: Protocol not supported`, error: exit status 1"

こちらに該当していないでしょうか。 https://github.com/microsoft/WSL/discussions/4872?sort=top

hoshy@wsl-host:~$ sudo update-alternatives --set iptables /usr/sbin/iptables-legacy

docker daemon が起動しない

failed to start daemon: Error initializing network controller: error obtaining controller instance: failed to create NAT chain DOCKER: iptables failed: iptables -t nat -N DOCKER: iptables v1.8.7 (legacy): can't initialize iptables table `nat': Table does not exist (do you need to insmod?)

Windows Terminal を Administrator で起動することが必要なようです。 https://stackoverflow.com/questions/57351688/unable-to-start-docker-in-wsl2-using-new-windows-terminal

docker run がエラー終了する

docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: waiting for init preliminary setup: EOF: unknown.

WSL が、version 2 ではなく 1 になっていないでしょうか。PowerShell で、以下のように wsl cli を実行して出力を確認します。 (wsl cli は WSL 内からも wsl.exe のように拡張子をつけて実行することができます)

hoshy@wsl-host:~$ wsl.exe --list -verbose
  NAME                   STATE           VERSION
* Ubuntu-22.04           Running         2
  Ubuntu                 Stopped         2

VERSION が 2 になっていることを確認します。1 になっていたら、以下のようにして 2 に convert します。

PS C:\> wsl --set-version Ubuntu-22.04 2

Hyper-V について

WSL を使用するために、Windows の設定で Hyper-V の有効化が必要な場合があります。

この設定は使用する PC と OS edition/version により手順が違うので、それぞれに合った方法を調べて適用して下さい。

また、Hyper-V は、VirtaulBox など他の仮想化ソフトウェアの動作に影響を与えることがあります。実行するマシンで他の仮想環境を使用していて、それが重要である場合、変更をする前に動作に影響が無さそうか確認してください。(とはいえ事前に確認するのが難しいので、壊せない環境を使うことは避け、他の PC を使うのが安全です)

この記事を書いた人

記事一覧
SQUARE ENIXでは一緒に働く仲間を募集しています!
興味をお持ちいただけたら、ぜひ採用情報ページもご覧下さい!