windows 10 homeにWSL2を入れてDockerを使う

Vagrantで開発環境を構築するために愛用していた『PuPHPet』。
終了してしまったのか、アクセスできなくなってしまった!

設定ファイルで、PHP等色々機能のバージョンを上げてみるも失敗するし…
仕方ないdockerに戻るか…
と思っていたら、友人が『WSL2』をオススメしてくれた。

WSL(Windows Subsystem for Linux)2
ざっくり言うと『WSL2』はLinux仮想環境を作るためのもの。
Windowsに全く依存しない形でLinuxカーネルごと起動する。
だからwindows 10 homeにHyper-Vが入ってなくても関係ない。
そして今まで仮想環境をつくるために必要だったVirtualBox、VMWareが要らなくなる。
『Docker Toolbox』の『レガシー』でなくて、『Docker Desktop』が使える!
あと多分軽くなるんじゃない? 1個介さなくなるわけだしね!
便利そうこの上ないので、1回それを使ってみることにするまでの話。

今まで使っていたVagrant環境が使えなくなります。戻せますが、慎重に!

基本的に機能を呼び出すには、画面下の『タスクバー』の『ここに入力して検索』(※虫眼鏡アイコン)を使う。
途中まで打ち込めば候補として出るので、これが一番手っ取り早い呼び出し方法かと思う。
※以下『検索』とする。

コマンド(CUI)でも出来るが、自分は基本GUI派。
面倒になればCUI使うかもしれないけど。
なので、GUIでの方法を記載しておく。

WSL2をインストールする

再起動を繰り返すから、やるなら時間あるときをオススメする。
残業代の出ない会社のPCに、退勤前にやるなんて以ての外!

Windows Update

『検索』にて『更新プログラムの確認』呼び出す。
『更新プログラムのチェック』をして『最新の状態です』になっていることを確認。
なっていなければ、せっせと更新する。

Windowsのバージョンを確認

『検索』にて『ファイル名を指定して実行』呼び出す。
winver』→『OK』とし、出たバージョンを確認する。
もし『バージョン1909』だった場合、WSL2入っていないので先に進む。

作業領域の容量を開けておく

アップデートには10GB超程度の空き容量が必要らしい。
大概『Cドライブ』で、『20GB』程度空いていれば安心。

手動で更新ファイルをインストール

Windows 10 のダウンロード』にアクセス。
※『検索』で『Windows10 更新アシスタント』と打ち込んでもアクセス出来る。

『今すぐアップデート』を押し『Window10Upgrade【省略】.exe』ダウンロードし、実行。
あとは流れに任せる。
インストール後、再度バージョンを確認するとバージョンが上がっていることが確認出来る。

※因みに2020年8月現在
アップデートは『Windows 10 May 2020 Update』
ファイル名は『Windows10Upgrade9252.exe』
インストールのバージョンは『バージョン2004』
になっている。

WSl2のCPU、メモリ割り当て

使っていて気づいたが、気兼ねなく遠慮なくメモリを食っていく。
なので自分は後から設定した。

WSL2では『[ユーザープロファイル]\.wslconfig』にWSL全体に関わる設定を書くそうだ。
因みに『ユーザプロファイル』の位置は『C:\Users\【ユーザ名】』
インストールしたら用意される訳ではないので、新規に作成し、下記の内容で保存する。

[wsl2]
memory=2GB
processors=2

上記の場合軽量VMにCPU2コア、メモリ2GBを割り当てることになる例。ありがたい。

WSL2を有効化する前なら良いが、した後に設定した場合、設定後Windowsを再起動するとよろしい。
参考:Windows Subsystem for Linux 2(WSL 2)をセットアップしてみた | Developers.IO

WSL2を有効化する

『検索』で『Windowsの機能の有効化または無効化』を呼び出す。

  • Linux用Windowsサブシステム
  • 仮想マシンプラットフォーム

にチェックを入れ、再起動。

因みに下記コマンドでも同じこと。

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

この設定をすると『vagrant up』が出来なくなります
 使う場合は両方OFFにして、再起動してください。
※因みに『Docker Toolbox』の『レガシー』とであれば、Windowsの機能の有効無効関係ないので両方使うことが出来る。

カーネル コンポーネントの更新

仮想環境を起動したいところであるが、大概最初はWSL1になっている様子。

試しに『Windows PowerShell(管理者)』で『wsl --set-default-version 2』とか打ってみて

WSL 2 を実行するには、カーネル コンポーネントの更新が必要です。詳細については https://aka.ms/wsl2kernel を参照してください

と出るようなら、確実にカーネルコンポーネントを更新対象。

WSL 2 Linux カーネルの更新 | Microsoft Docs』にアクセス。

x64 マシン用の最新の WSL2 Linux カーネル更新プログラム パッケージをダウンロードしてください。

から『wsl_update_x64.msi』をダウンロードし、実行すればOK。

WSL2を使う

基本的に『Windows PowerShell』を管理者権限で使って操作する。
タスクバー『スタート』の右クリックメニューから『Windows PowerShell(管理者)』で起動がオススメ。
以降はそこで操作する。GUIじゃないのが悔しい。
コマンドは基本的に『wsl --help』見ればいいかと。

WSL2 を既定のバージョンとして設定

新しいLinuxディストリビューションをインストールするとき、WSL2を既定のバージョンとして設定する。

wsl --set-default-version 2
WSL 2 を実行するには、カーネル コンポーネントの更新が必要です。詳細については https://aka.ms/wsl2kernel を参照してください

と出た場合は、カーネルコンポーネントを更新してから、再度実行する。

OS(Ubuntu)を入れる

いつ入れてもいいのだけど、通常バージョンを変更した後(↑の項目)がオススメ。
『検索』から『Microsoft Store』を呼び出し、検索窓に入れたいOSを探す。
今回、自分は『Ubuntu 20.04 LTS』を入れることにした。

インストールされていなければ、『インストール』
済んでいれば『起動』になっている。

Ubuntu使ってみる/入ってみる

『検索』から『Ubuntu』と打ち込んで『管理者として実行』をクリック。
するとSSHしたみたいな感じで、Ubuntuに入っている。
dockerは基本的にここでした方が無難。

コマンド打ち込みをちょっとだけ楽にする

いちいちsudoすんのめんどい。そんな人用。
やり方は、初回起動時にユーザ名を確認されるのだが、そこを『root』て打ち込む。
再度入力を求められるが、無視して画面を閉じるだけ。
次回起動時、ちゃんと『root』でログインできてることが確認出来る。
参考:WSLのUbuntuの初期ユーザーをrootにする | skt workshop

WSLからWindowsへのアクセス:マウント

『/mnt/{ドライブ名}』でアクセスできる。
Cドライブなら『/mnt/c』、Dドライブなら『/mnt/d』

cd /mnt/c

とすれば、アクセス出来る。

マウントがオカシイ…

lsしたとき、あるはずのディレクトリがない!
そんなとき、PowerShellで下記コマンドを実行する。

wslconfig /t Ubuntu-20.04

後半は自分のOS名。今回は『Ubuntu-20.04』の例

『Release file for ~ is not valid yet』と出る

他の環境でも起こるので別記事に移動した

WinSCP/SSHで操作する

両方ssh使えるようにする必要がある。

ss state all sport = :ssh

『WARNING: apt does not have a stable CLI interface. Use with caution in scripts.』
とか出たら入ってない。
※『netstat --tcp -a | grep ssh』としたいところだけど、現在は『ss』推奨らしい。

127.0.0.1だとは思いつつ、IPアドレスを確認してみる。

ip address show

※『ipconfig』としたいけど、現在は『ip』推奨らしい。
そして127.0.0.1である。

SSHインストールする

sudo apt-get install openssh-server
sudo vi /etc/ssh/sshd_config

して入った設定ファイルのパスワードログインを有効化

PasswordAuthentication yes

@todo ちょっと後回し
参考:Windows Subsystem for Linuxにssh接続する - Qiita

入れたOSを修復・リセットしたい場合

もし上手く動かなくなったりした場合、修復やリセットを試みるとよろしい。
user名、パスワードをセットしなかったとか色々、やりたいときもあるもの。
今回の場合は上記同様『Ubuntu』で記載する。

検索窓に『ubuntu』と打ち込むと、右側に入れたものの情報と項目が出てくる。
その中から『アプリの設定』をクリック。
出てきたその画面の下の方『リセット』という項目にあるボタンを押すだけ。

再度入れるときは『インストール』または『起動』の横『...』を押して、『自分のデバイスにインストールする』で入れ直すことが出来る。

wslのバージョン確認

そこで

wsl -l -v

を実行する。

例えば、下記の場合はバージョン2。

  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2

StoppedとかRunningは、サーバの状態なので、バージョン変換は不要。

  NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         1

こうなっているとwslのバージョンは1。
wsl2用ではないので、変換が必要。

wslがコマンドから動かない場合

前日動いてた『wsl -l -v』等が下記メッセージを出力し動かなくなった。
Linux 用 Windows サブシステムには、ディストリビューションがインストールされていません。
ディストリビューションは Microsoft Store にアクセスしてインストールすることができます:
https://aka.ms/wslstore

リセットしたからかも知れない。
その場合、ストアの入れたOSの『…』押して『自分のデバイスにインストールする』を押しインストールし直すことで解決した。
削除してから『インストール』を繰り返してもダメで、デバイスにインストールをし直さなければ、ダメだった。

wsl2用にバージョン変換

wsl --set-version Ubuntu-20.04 2
変換中です。この処理には数分かかることがあります...

のあと

WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。

が出れば完了。

カーネル コンポーネントを更新してないと、下記が出て実行出来ない。

WSL 2 を実行するには、カーネル コンポーネントの更新が必要です。詳細については https://aka.ms/wsl2kernel を参照してください

カーネル コンポーネント更新後、再度変換を実行すれば問題ない。

もう1回下記を実行した場合、2になっていることが確認出来る。

wsl -l -v

Docker Desktopを入れる

基本的には『Docker Desktop for Mac and Windows | Docker』から、自分のOSに合うものを落として入れるだけでOK。
チェックは外さずにそのままにすること。
入れるPCにDocker Toolboxが入っている場合、インストールエラーになるので消しておく。
アカウントが必要になるので、作る必要があるが、インストールしながら作ればいい。

起動アイコンを右クリックし『Setting』
『General』の『Use the WSL 2 based engine』にチェックがついていること
『Resources』の『Enable integration with my default WSL distro』にチェックがついていることを確認すればOK。

インストール後『docker-desktop』と『docker-desktop-data』が出来ている。
使っていると大きくなるから、どうにかしたい場合は下記を参照するといいかと。
WSL2 Dockerのイメージ・コンテナの格納先を変更したい (WSL2のvhdxファイルを移動させたい) - Qiita
Docker for Macを使っていたら50GB位ディスク容量を圧迫していたのでいろんなものを削除する - Qiita

ポート原因のインストールエラー

起動後のチュートリアルをやった結果
多分下記のコマンドを実行したあたりで

docker run -d -p 80:80 docker/getting-started

下記メッセージが出て失敗終了することがある。

docker: Error response from daemon: Ports are not available: listen tcp 0.0.0.0:80: bind: An attempt was made to access a socket in a way forbidden by its access permissions.

80ポート使うようなサーバプログラム動かしてないんですけど!?となった。

コマンドプロンプト『netstat -nao』と打ち込み、ポート一覧を取得。

アクティブな接続

  プロトコル  ローカル アドレス      外部アドレス           状態            PID
  TCP         0.0.0.0:80             0.0.0.0:0              LISTENING       4

他にも色々でるが今回はスルー。PIDの番号を覚えておく。
『タスクマネージャー』起動→『詳細』タブを選択。該当するPIDが、そのポートを使っているアプリとなる。
大概、そのPIDに該当するアプリケーションを削除するなり、ポート番号変えるなりで解決する。

ところが上記の場合、PID 4は『システムプロセス』である。
この場合は『Microsoft』系アプリが原因。
それ以外の詳細はわからない。正直そこまで書いてほしい。

今回、自分の場合は『World Wide Web サービス』が有効になっていることが原因だった。
しいては『.Net 拡張 3.5』が。
つまりは以前『Microsoft .NET Framework 3.5』をインストールしたことが原因の様子。
2020年現在『Microsoft .NET Framework 4.8』で、今回実行したアップデートに含まれているし、3.5同様に4.8の拡張項目もあるが、チェックは入っていない。
なので、3.5も消しても問題はないと思われる、多分。

対応方法としては
『検索』で『Windowsの機能の有効化または無効化』を呼び出す。
『インターネット インフォメーション サービス』→『World Wide Web サービス』のチェックを外し、再起動。
これでポート80は開放されて、dockerが動かせる。

参考:【Apacheが起動しない】System(PID:4)にてポート番号80を使用/Windows10 - marronブログ

因みに

docker run -d -p 80:80 docker/getting-started

は『-p ホストのポート80:コンテナのポート80』だから

docker run -d -p 8080:80 docker/getting-started

にして、アクセスするURLを
『http://localhost:8080/』または『http://127.0.0.1:8080/』
にしてしまえば、そもそも問題なかったりする。
まぁ、これはこれでCMSやFWによっては問題だったりするのだが…

dockerコマンドを使う

Docker Desktopをインストールしたした時点で『docker』『docker-compose』が使える。
インストール時のチュートリアル的なので、ちょっと動かして入るのだけど。

Dockerの使い方自体はこっちの記事にあるので、以下は観ずに移動して貰ってもOK

docker --version
docker-compose --version

コレでコマンドが動くことは確認出来る。

まずは基本として『hello-world』

docker run hello-world

すると

docker images

でたくさん出来てしまったことが確認出来る。
気にしなくてもいいけど、不要と判断したら消してもOK。

docker ps -a

で見れる内容は、Docker Desktopの『Dashboard』から見る内容と同じ。

Ubuntuサーバを立ち上げてみる

docker run -it ubuntu bash

なんやかんや出たあと、サーバに入れた。
Docker DesktopのDashboardでも『ubuntu』があることが確認出来る。

『docker-compose.yml』が使えるようになった。ら、もう『Laradock』でいいかも…

docker使うための環境構築は出来た。
環境もチュートリアルのファイルをちゃんと読み、いじれば出来るのであろう。
と思って
コマンド実行時の位置『C:\WINDOWS\system32』以下にを見るも『docker-compose.yml』はなかった。
無いんかい!
どうやら『C:\Users\【ユーザ名】\getting-started』に以下がそれのようだ。
『docker/』で指定されることでここに行くのね。
内容はえらくシンプルな構成で、ファイル名.mdだねとか、それはいいのだ。

自分がやりたいことは、
・レガシー使っていたときに作成及び仕事で貰った『docker-compose.yml』を使い、仮想WEB環境を使うこと
・Vagrantの開発環境と同等のものを、Vagrantレベルで簡単に使うこと
なのである。

そこで自PC内にある『docker-compose.yml』を探してみたら、随分沢山文章量あるし、外部参照と思われる内容が多い。
と思っていたら、Laradockだった。
そう、仕事で使っていたのは、いつもLaradock
しばらく使っていないということは、こういうことなのである。

そうだね、もうLaravelでなくてもLaradock使えばいいよね、ハハハ

そうじゃない人は、下記をご参照くださいということで完。
Docker(for Windows)で開発環境の構築を行う - Qiita
Docker for Windows を始めよう — Docker-docs-ja 19.03 ドキュメント
今さら聞けないDockerのはじめのはじめ – CodeAid(コードエイド)

コメント

タイトルとURLをコピーしました