WSL2でDockerを用いる

はじめに_

Windows Subsystem for Linux 2(WSL2)が使えるように設定済みで、かつ、何かしらのLinuxがWSL2上にインストール済みとする。

この例ではUbuntu 20.04がWSL2上にインストールされている。

参考_

Docker Desktop for Windowsのインストール_

Docker公式にアクセスし、 公式サイト上部の「Get Started」をクリックする(画面サイズによってはメニュー内に格納されている)。

ダウンロードページからDocker Desktop for Windowsをダウンロードし、インストールする。インストールを開始して、しばらくすると以下のようなオプションの選択画面になるので、「OK」を押して進める。

以下のような画面でインストールが進む。

インストールが終了すると以下の画面になる。

デスクトップ上にあるDocker DesktopのアイコンからDocker Desktopを起動する。初回起動時は以下のようにチュートリアル(tutorial)を行うかどうか尋ねてくる。「Skip tutorial」をクリックする。

そして、Docker Desktop WSL 2 backendの「Install」の項に従い、設定を行う。Dockerの設定画面を開く。以下の画面の歯車アイコンをクリックする。

設定のトップ画面は「General」の設定になっている。「Use the WSL2 based engine」がオンになっていることを確認する。私はこの設定画面の「Start Docker Desktop when you log in」のチェックをオフにしている。設定を変更したときは「Apply&Restart」をクリックし、設定の変更を反映させる。

「Resources」→「WSL Integration」を開く。「Enable integration with my default WSL distro」をチェックする。そして、WSL2上にインストールしているLinuxのディストリビューションをONにする(今回の例ではUbuntu 20.04)。「Apply&Restart」をクリックし、設定の変更を反映させる。

Windows Powershellで状況を確認する。私の環境だと以下のようになる。

 wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-18.04           Running         2
  docker-desktop         Running         2
  Ubuntu-20.04           Running         2
  docker-desktop-data    Running         2

これでDocker Desktopのインストールおよび設定は終了。

Docker利用の練習_

Docker Desktopのインストール時にUbuntuが起動していた場合は、上述のDocker Desktopとの連携設定終了後に一度Ubuntuを再起動すること。

Dockerが動いているとする。さくらのナレッジ:Docker入門(第一回)~Dockerとは何か、何が良いのか~に従い、dockerを動かしてみる。

Ubuntuのターミナル上でdockerと連携していることを確認する。

% which docker
/usr/bin/docker

(docker-desktop-dataにマウントされているのを確認する)
% df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdd        251G  5.3G  233G   3% /
tmpfs           6.3G  274M  6.0G   5% /mnt/wsl
/dev/sdc        251G  6.5G  232G   3% /mnt/wsl/docker-desktop-data/isocache
none            6.3G   12K  6.3G   1% /mnt/wsl/docker-desktop/shared-sockets/host-services
/dev/sdb        251G  124M  239G   1% /mnt/wsl/docker-desktop/docker-desktop-proxy
/dev/loop0      376M  376M     0 100% /mnt/wsl/docker-desktop/cli-tools
tools           160G  104G   56G  66% /init
none            6.3G     0  6.3G   0% /dev
none            6.3G   20K  6.3G   1% /run
none            6.3G     0  6.3G   0% /run/lock
none            6.3G     0  6.3G   0% /run/shm
none            6.3G     0  6.3G   0% /run/user
tmpfs           6.3G     0  6.3G   0% /sys/fs/cgroup
C:\             160G  104G   56G  66% /mnt/c
D:\             9.5G  8.4G  1.2G  88% /mnt/d
E:\             2.8T  427G  2.4T  16% /mnt/e
F:\             2.0T  1.3T  751G  64% /mnt/f
J:\             762G  311G  452G  41% /mnt/j

nginxのイメージを取得し、コンテナを起動してみる。Ubuntuのターミナル上で以下を実行する。

% docker run --name some-nginx -d -p 8080:80 nginx

Windows上のWebブラウザで http://localhost:8080/ にアクセスするとnginxのトップ画面が起動する。

現在動いているコンテナは以下のコマンドで確認できる。

% docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS                      PORTS                     NAMES
b89d2e19b18d   nginx          "/docker-entrypoint.…"   23 seconds ago   Up 19 seconds               0.0.0.0:8080->80/tcp      some-nginx

コンテナsome-nginxの停止は以下のコマンドで停止する。

% docker stop some-nginx

停止していることを確認する。

% docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS                      PORTS                     NAMES
b89d2e19b18d   nginx          "/docker-entrypoint.…"   About a minute ago   Exited (0) 23 seconds ago                             some-nginx

MySQLおよびWordpressを動かしてみる。

% docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7
% docker run --name some-wordpress -e WORDPRESS_DB_PASSWORD=my-secret-pw --link some-mysql:mysql -d -p 8080:80 wordpress

Windows上のWebブラウザで http://localhost:8080/ にアクセスするとWordpressのトップ画面が起動する。

稼働状況を確認する。

% docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS                      PORTS                     NAMES
9b98d7ad04c9   wordpress      "docker-entrypoint.s…"   34 seconds ago       Up 27 seconds               0.0.0.0:8080->80/tcp      some-wordpress
5b877fc60e5d   mysql:5.7      "docker-entrypoint.s…"   About a minute ago   Up About a minute           3306/tcp, 33060/tcp       some-mysql
b89d2e19b18d   nginx          "/docker-entrypoint.…"   7 minutes ago        Exited (0) 5 minutes ago                              some-nginx

コンテナを停止させる。コンテナ名は上の「docker ps -a」で調べる。

% docker stop some-wordpress
% docker stop some-mysql

nginx, mysql, wordpressのコンテナを削除する。コンテナ名は「docker ps -a」で調べる。

% docker rm some-nginx
% docker rm some-wordpress
% docker rm some-mysql

削除されていることを確認する。

% docker ps -a

手元のdockerイメージを確認する。

% docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mysql        5.7       f07dfa83b528   36 hours ago   448MB
nginx        latest    ae2feff98a0c   7 days ago     133MB
wordpress    latest    bc5f6567b763   11 days ago    550MB

不要になったイメージを削除する。イメージIDは「docker images」で確認する。

% docker rmi ae2feff98a0c 
% docker rmi bc5f6567b763
% docker rmi f07dfa83b528

消えているかどうかを確認する。

% docker images

dockerコンテナのポートフォワードをやり直す_

docker run実行時しかポートフォワードの設定を行えないとのこと。このため、ポートフォワードをやり直したいコンテナの名前をcont1としたとき、以下の手順で進める。

  1. cont1を停止する
  2. cont1からイメージを作成する
  3. cont1を削除する
  4. 作成したイメージからコンテナを生成する(この際にポートフォワードをやり直す)

まず、cont1を停止する。

% docker stop cont1
% docker ps -a (停止を確認する)

cont1からイメージを作成する。

% docker commit cont1 cont1_i

cont1を削除する。

% docker rm cont1

生成したイメージからコンテナを作成する。

% docker run --name cont1_renew -d -p 8080:80 cont1_i
% docker ps -a

戻る_