WSL2でDockerを使ってCentOSを使ってみた話

WindowsのInsider Previewで、Release PreviewにもWSL2に対応したWindows10 2004 May 2020 Updateが降ってきたので、どんなもんかとWSL2を試してみました。

ついでに、UbuntuよりCentOSの方が使い慣れてるので、CentOS環境も作れないかDockerで検証してみました。

WSL2を入れる

ぐぐればたくさん記事が出てきますので省略しますが、公式ドキュメントとしては下記になります。

https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-install

ざっくり書けば、

  • Hyper-Vを有効化する
  • Microsoft StoreからUbuntuをインストールする
  • この状態では古いWSL1なので、”wsl –set-version Ubuntu 2”を叩いてWSL2に変換する

カーネルが古いとかなんとか言われたら、

https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel

からアップデートすると良いです。

Dockerを入れる

インストールも公式の手順で問題無いです。

http://docs.docker.jp/engine/installation/linux/docker-ce/ubuntu.html

見るの面倒ですって方は、下を叩けばOK。

sudo apt-get update
sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get install -y docker-ce docker-compose
service docker start

CentOS7を入れる

カーネルが新しいならまあディストリビューション違ってても大丈夫だろうという精神で入れてみる。

sudo docker image pull centos:centos7
sudo docker run -d -p 10080:80 --privileged --name centos7 centos:centos7 /sbin/init
sudo docker exec -it centos7 bash

動きました。後でApacheで外部からアクセスするので、80ポートを外部ポート10080から叩けるように-pオプションがついています。

もし、

docker: Error response from daemon: cgroups: cannot find cgroup mount destination: unknown.

とか出る場合は、

sudo mkdir /sys/fs/cgroup/systemd
sudo mount -t cgroup -o none,name=systemd cgroup /sys/fs/cgroup/systemd
sudo docker rm centos7

と叩いて再度トライ!

手っ取り早くLAMP環境を作成してみる。phpアプリとしてphpMyAdminで動作確認します。

timedatectl set-timezone Asia/Tokyo
yum install -y epel-release
yum install -y httpd mariadb-server mariadb php phpmyadmin
systemctl start httpd
systemctl start mariadb
systemctl enble httpd
systemctl enable mariadb
mysql_secure_installation

ここで何か聞かれますが、1回エンター、rootのパスワード2回、あとエンター連打でOKです。

ここでブラウザから、

http://localhost:10080/phpmyadmin

にアクセス。Forbbidenになると思います。

アクセスログを確認します。

$ tail /var/log/httpd/access_log
中略
172.17.0.1 - - [21/Apr/2020:09:22:13 +0000] "GET /phpmyadmin HTTP/1.1" 403 212 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:75.0) Gecko/20100101 Firefox/75.0"

yumからインストールしたphpMyAdminは初期値ではlocalhostからしかアクセスを受け付けません。ここでは172.17.0.1からのアクセスが弾かれているので、このIPアドレスを許可します。

vi /etc/httpd/conf.d/phpMyAdmin.conf

最初に出てくる

     <RequireAny>
       Require ip 127.0.0.1
       Require ip ::1
     </RequireAny>

の部分を

     <RequireAny>
       Require ip 127.0.0.1
       Require ip ::1
       Require ip 172.17.0.1
     </RequireAny>

とします。そしたらhttpdを再起動。

systemctl restart httpd

改めて

http://localhost:10080/phpmyadmin/

にアクセスするとログイン画面が出ますので、設定したrootパスワードで入れればOK!

ヤッター!
作業していたコンソール画面は閉じてしまっても、裏でちゃんとhttpdとか動いてくれています。

VirtualBoxとか使わなくてもDockerが使えて、しかもCentOS環境も動く。
メモリとかCPUの割り当てとか意識せずにほぼネイティブといっても良いLinux環境が使えるので、WSL2スバラシス!

もしこのままLAMP開発環境として使うのであれば、Dockerの機能でコンテナ内のディレクトリをWSL2内のディレクトリにマッピングするなり、コンテナ内でsshdを起動しておいて22ポートを外部から叩けるようにして、ソースコードをSCP転送とかで送り込むとかすれば良いと思います。

こちらの記事もどうぞ