はじめに
こんにちは。ハセガワです。
弥生Advent Calendar 2020の記事として投稿しています。
個人の趣味として自宅でDocker Desktop for WindowsをWindows 10 Homeで使ってみました。
今回は、Docker Desktop for Windowsを使うにあたっての準備や、使ってみた感想などについて記事にしてみました。
自宅のWindows 10環境
・Windows 10 Home Edition
・64bit版 (※32bit版だと、WSLが利用できません!)
使うことになった経緯
- Dockerを用いた開発への興味
もともと、技術の勉強を兼ねてGoogle Cloud Platform(GCP)にWebアプリをデプロイしておりました。
その際、昨今の流行(?)であるDockerを使ってみたいと思っていました。
- 挫折
家のPCのWindows 10は「Home」エディションであるため、Hyper-Vが使えません。
Windows 10 HomeでDockerを利用するための方法を少し調べたのですが、「環境構築がちょっと面倒くさそうだな・・・」と思い、すこし敬遠していた節がありました。
- 転機
そんな怠惰な私の耳元に「Windowsのバージョン2004からはWSL2とDocker Desktop for WindowsがWindows 10 Homeでも使えますよ。Hyper-Vがなくても使えますよ。」という情報が飛び込んできました。1
「これは使ってみるしかない!」と。
※WSL2とは
Windows Subsystem for Linux 2の略。
Windows上でLinuxを動かす仕組みのことです。
WSL1とWSL2の違いについては、以下のMicrosoft社のドキュメントに詳細が記載されています。
https://docs.microsoft.com/ja-jp/windows/wsl/compare-versions
準備
簡単に列挙すると、以下の準備を経てDocker Desktop for Windowsが使えるようになりました。
- Windows 10のバージョンアップ
- Docker Desktop for Windowsのインストール
- WSL2のインストール
※2と3はたまたま逆になってしまった感がありましたので・・・詳細は後述します。
1. Windows 10のバージョンアップ
WSL2が使用できるのはWindows 10のバージョン「2004」からです。1
怠惰な私は、長らくアップデートを放置していたため、バージョンは「1909」のままでした。
「設定」→「更新とセキュリティ」→「Windows Update」を確認すると、新しいWindowsのバージョンが取得可能でしたので、あまりよく確認せず更新しました。
更新後、Windowsのバージョンを確認すると「20H2」になっていました。
「え?H2ってなに?水素・・・?」
少し調べてみると、Windows 10 October 2020 Updateとのこと・・・。
つまり、「2004」より新しいバージョンです。
これにて、Windows 10のバージョンアップは無事完了しました。
2. Docker Desktop for Windowsのインストール
以下のサイトからDocker Desktop for Windowsをダウンロードし、インストールしました。
https://hub.docker.com/editions/community/docker-ce-desktop-windows
3. WSL2のインストール
先ほどの手順で、Docker Desktop for Windowsを立ち上げると、以下のメッセージが・・・
「そういえば、WSL2をインストールしていなかったな・・・」
順序が若干ごちゃごちゃになってしまいましたが、以下のサイトから「x64マシン用WSL2 Linux カーネル更新プログラムパッケージ」をダウンロードし、インストールしました。
https://aka.ms/wsl2kernel
Docker Desktop for Windowsを使ってみる
起動!
準備もできたので、早速Docker Desktop for Windowsを起動します。
以下のような画面が立ち上がりました。
こちらは起動中のコンテナの一覧が表示される画面です。今はコンテナが1つも動いていないためこのような表示になっています。
画面左部の「Images」をクリックすると以下のような画面が開きます。
ここにはDockerイメージの一覧が表示されます。今はイメージが1つも存在しないため、このような表示になっています。
イメージの作成
イメージの作成はコマンドプロンプトか、Windows PowerShellから行います。
とりあえず、どのように動くのか見てみたかったので、以下のDockerfileを作成しました。
80ポートを開放し、Apacheと.NET CoreのSDKをインストールします。
FROM centos:7
RUN echo "now building..."
RUN yum -y install httpd
EXPOSE 80
RUN rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
RUN yum -y install dotnet-sdk-3.1
Dockerfileを置いたディレクトリでコマンドプロンプトを起動し、いざ、Docker Buildを実行します。
作業ディレクトリ>docker build -t testmycontainer .
[+] Building 1.8s (9/9) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 32B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/centos:7 1.8s
=> [1/5] FROM docker.io/library/centos:7@sha256:0f4ec88e21daf75124b8a9e5ca03c37a5e937e0e108a255d890492430789b60e 0.0s
=> CACHED [2/5] RUN echo "now building..." 0.0s
=> CACHED [3/5] RUN yum -y install httpd 0.0s
=> CACHED [4/5] RUN rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm 0.0s
=> CACHED [5/5] RUN yum -y install dotnet-sdk-3.1 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:6c50ce36ff73cec713b16e6384a8cb7d7ce35db507fb92dee249f77f53396bde 0.0s
=> => naming to docker.io/library/testmycontainer 0.0s
※この記事の作成のために何度かDocker Buildを実行したため、初回実行の時よりログがシンプルになっています。
Docker Desktop for Windowsでイメージの一覧を確認すると・・・
イメージが作成されたことを確認できました。
コンテナの起動
先ほど作ったイメージからコンテナを生成し、実行したいと思います。
カーソルをイメージ名の行に合わせると「RUN」のボタンが表示されので、クリックします。
すると、コンテナ名やポートの選択画面が表示されるので入力し、「RUN」をクリックします。
そして、画面左部の「Containers/Apps」をクリックし、実行中のコンテナを確認します。
おお!動いている!
一応コマンドのほうでもdocker psコマンドで確認してみましょう。
作業ディレクトリ>docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d1eee1f16576 testmycontainer:latest "/bin/bash" 2 minutes ago Up 2 minutes 0.0.0.0:49153->80/tcp Test
ちゃんと動いているみたいですね!
おわりに
これからはWindows 10 Homeでもローカルで開発したプログラムがDockerで動くかを確認し、リモートの本番環境(個人のお遊びの範囲ですが)でデプロイができるのでとても便利になったなぁと思います。
時間があるときに、デプロイ等の記事も続けてアップしたいと思います!
-
累積更新プログラムを適用すれば、バージョン1903/1909でもWSL2が利用できます。
https://forest.watch.impress.co.jp/docs/news/1272017.html ↩ ↩2