0.ここでやること
- 既にあるWSLとUbuntuのアンインストール
- Microsoft Store版のWSLとUbuntuをインストール
- Windows Termianlのインストール
- systemdの確認
- dockerとdocker composeのインストール
1.WSLってなんだ?
Wikipediaによると
Windows Subsystem for Linux(WSL) とは、Linuxの(ELFフォーマット形式の)バイナリ実行ファイルをWindows 10およびWindows Server上でネイティブ実行するための互換レイヤーである。
とのことで、Windows上でLinuxを動作させるための仕組みがWSL、そのVersion2がWSL2です。
2.WSL2ってなにがいいの?
利点としては以下が挙げられます。
-
軽量で高速起動
- 従来のWSLでも動作に必要なメモリが少なく、軽量な動作と起動の速さというメリットがあったが、WSL2では更に強化されている
- 仮想マシンでLinuxを立ち上げて動作させるよりも軽量で高速
-
完全な互換性
- 従来のWSLではLinuxシステムコールを受け取りWindowsのシステムコールに変換していたがその変換が不完全であり度々不具合が報告されていた
- WSL2よりHyper-Vを利用しLinuxカーネルそのものが動作するため、完全なエミュレーションとなっており、Docker等も問題なく動作するようになった
-
ファイルアクセス速度の向上
- 従来のWSLではファイルアクセスが遅い点が指摘されていたが、WSL2より仮想HDDでext4が利用され、直接やり取りができることからアクセス速度が上がった
-
仮想マシン化
- 軽量ユーティリティVMを動作させるためにHyper-Vを用いており、OSの縛りがなく導入できる
- 従来のWSLではWindows上で動作していたため、IPアドレスがWindowsと共通だったが、仮想化する事により仮想ネットワークアダプタが作成される事で別のIPアドレスを割り当てる事が可能になった
つまり、WSLがVersion2なって、これまでの問題が解決され、めっちゃ使いやすくなったってことです。
軽量なのはとっても魅力!!
詳細を知りたい方はこちらを確認してみてください。
3.さっそくWSL2をインストールしてみる
3 - 1.「Windowsの機能の有効化または無効化」の設定
インストール前に「Windowsの機能の有効化または無効化」の設定を確認します。
「Linux用Windowsサブシステム」「仮想マシンプラットフォーム」の2つにチェックを入れます。
OKを押すと、再起動を求められるので再起動します。
3 - 2.既にあるWSLやUbuntuのアンインストール
試行錯誤の中で既に一部インストールしてしまってる方もいるかと思うので、ここでアンインストールを行います。
「設定≫アプリ≫アプリと機能」で以下を行う(あればアインストールして下さい)
-
「linux」と検索バーに入力、「Linux用Windowsサブシステム」をアンインストール
-
「linux」と検索バーに入力、「Windows Subsystem for Linux Update」をアンインストール
3 - 3.Store版のWSLとUbuntuをインストールする
Microsoft Storeから「Windows Subsystem for Linux」と「Ubuntu」をインストールする
3 - 4.Ubuntuを開く
先程インストールしたUbuntuを開きます。
以下の表示になればOK!!(エラーの場合は読み進めて頂くと対処方記載しています)
Installing, this may take a few minutes...
Please create a default UNIX user account. The username does not need to match your Windows username.
For more information visit: https://aka.ms/wslusers
Enter new UNIX username:
好きなユーザー名とパスワードを入力します。
Enter new UNIX username: xxxxxxxxxxx
New password:
Retype new password:
以下が表示されてインストール完了です。
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.10.16.3-microsoft-standard-WSL2 x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
This message is shown once a day. To disable it please create the
/home/{user}/.hushlogin file.
{user}@LAPTOP-xxxxxxxx:~$
とりあえずお決まりを実行しておきましょう
sudo apt update
【Ubuntu起動時に以下の様なエラーになった場合】
ディスク 'C:\Users\ahaya\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx'を WSL2 に接続できませんでした: 指定されたファイルが見つかりません。
Error code: Wsl/Service/CreateInstance/MountVhd/ERROR_FILE_NOT_FOUND
ディスク 'C:\Users\ahaya\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx'を WSL2 に接続できませんでした: 指定されたファイルが見つかりません。
Error code: Wsl/Service/CreateInstance/MountVhd/ERROR_FILE_NOT_FOUND
ディスク 'C:\Users\ahaya\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu_79rhkp1fndgsc\LocalState\ext4.vhdx'を WSL2 に接続できませんでした: 指定されたファイルが見つかりません。
Error code: Wsl/Service/CreateInstance/MountVhd/ERROR_FILE_NOT_FOUND
Press any key to continue...
WSL上のUbuntuが初回起動時に行っている、初期化処理を行うことで解消できます。
Press any key to continue...
の通り何かキーを押してUbuntuを終了し、PowerShellを開いてください。
PowerShellにて以下を実行し、登録されているディストリビューションを確認します。
この例ではUbuntuのディストリビューションのみが登録されています。
PS C:\Users\Name> wsl -l
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu (既定)
以下を実行して、Ubuntuのディストリビューションの登録を解除します。
PS C:\Users\User> wsl --unregister Ubuntu
登録解除。
この操作を正しく終了しました。
再度をUbuntuを開いてInstalling, this may take a few minutes...
と表示さればOKです。
上記手順通りにユーザー名、パスワードの登録とsudo apt update
を行ってください。
4.便利なターミナルで開く
Microsoft Storeにて「Windows Terminal」をダウンロードします(既にある人が多い)
このアプリは画像のようにターミナルをタブで管理できて、PowerShellやコマンドプロンプト、先程インストールしたUbuntuなど一つのウィンドウで色々開くことができます。
設定から既定のプロファイルや既定のターミナルアプリケーションを設定できるので、自分の環境に合わせて設定しましょう。
5.systemdが利用可能にする
以下の記事の通り
https://devblogs.microsoft.com/commandline/systemd-support-is-now-available-in-wsl/
「Windows Subsystem for Linux」が「systemd」に対応しネイティブに動作するようになりました。
以前はGenieなどを入れて動かす必要がありましたが、Store版WSLを利用すれば最初から利用可能です。
5 - 1.systemdの有効化
公式の記事にあるとおり、systemdを利用するにはvim /etc/wsl.conf
を実行して以下設定を書くことで有効化できます。既にファイルがある方は以下の通り追記または修正してください。
[boot]
systemd=true
5 - 2.動作の確認
念のためここでは以下をUbuntuで実行して動作していることを確認します。
一覧が表示されればOKです。
systemctl list-units --type=service
# OUTPUT:
# UNIT LOAD ACTIVE SUB DESCRIPTION >
# apport.service loaded active exited LSB: automatic crash report >
# console-getty.service loaded active running Console Getty
# console-setup.service loaded active exited Set console font and keymap
# cron.service loaded active running Regular background program p>
# dbus.service loaded active running D-Bus System Message Bus
# getty@tty1.service loaded active running Getty on tty1
# keyboard-setup.service loaded active exited Set the console keyboard lay>
# ︙
5 - 3.systemd-sysusers.service
がFailedの場合の対処
同一の事象が起こっている記事があったのでこの通りに修正してみます。
https://qiita.com/tomo00223/items/970fb22ffbcf15227518
-
以下を実行
sudo vi /usr/lib/systemd/system/systemd-sysusers.service
-
以下3つをコメントアウト
# LoadCredential=passwd.hashed-password.root # LoadCredential=passwd.plaintext-password.root # LoadCredential=passwd.shell.root
-
末尾に以下を追記
LoadCredential=
-
PowerShellを開いてwslをシャットダウンして、、、
wsl.exe --shutdown
-
再度Ubuntuを開いて、systemctlのサービス一覧を表示してみると、、、
systemctl list-units --type=service # OUTPUT: # ︙ # systemd-sysusers.service loaded active exited Create System Users # ︙
警告が消えました!
6.Docker環境の構築
6 - 1.Dockerってなんだ?
Wikipediaによると
Docker(ドッカー[4])は、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンプラットフォームである[5]。
Dockerはコンテナ仮想化を用いたOSレベルの仮想化(英語版)によりアプリケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を可能にする。かつその環境自体をアプリケーションと同じようにコード(イメージ)として管理可能にする[6]。Dockerを開発・テスト・デプロイに用いることで「コードを書く」と「コードが製品として実行される」間の時間的ギャップを大きく短縮できる[7]
とのこと。
コンテナ?ナニソレオイシイノ?って感じですが、説明すると以下の通りです。
Virtual Machine(所謂VM)は画像の左側、コンテナは右側になります。
(https://knowledge.sakura.ad.jp/13265/より引用)
VirtualBoxなどの仮想マシンでは、ホストマシン上でハイパーバイザを利用しゲストOSを動かし、その上でミドルウェアなどを動かします。
それに対し、コンテナはホストマシンのカーネルを利用し、プロセスやユーザなどを隔離することで、あたかも別のマシンが動いているかのように動かすことができます。
また、Dockerはミドルウェアのインストールや各種環境設定をコード化して管理します。
それによっての生まれる利点が次になります。
6 - 2.Dockerって何がいいの?
Dockerの利点として以下が挙げられます。
- コード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる。
- 作成した環境を配布しやすい。
- スクラップ&ビルドが容易にできる。
ひとりで開発するならDockerである必要はないかもしれませんが、複数人で開発を行う場合、Macを使うの人もいればWindowsの人もいます。
Windowsの中でVMを使う人もいればWSLを使う人もいます。
そういった異なる環境下でも全く同じ動作環境を構築することができるのはとんでもない利点です。
他にも環境が汚れないことや、PCのリソースを食いにくい点も利点かもしれません。
6 - 3.DockerとDocker-CEの違い
DockerとDocker-CEの違いについては以下記事を参照してみてください。
https://qiita.com/s-suefusa/items/cb3c4044da3b3657dbd0
基本的には同じものと考えてよいです。
Docker-CEを使っていれば間違いないとのこと。
6 - 4.Docker-CEのインストール
Docker-CEをインストールしていきます。
#既存のパッケージのリストを更新
sudo apt update
#aptがHTTPS経由でパッケージを使用できるようにするいくつかの必要条件パッケージをインストール
sudo apt install apt-transport-https ca-certificates curl software-properties-common
公式DockerリポジトリのGPGキーをシステムに追加する方法としてapt-key add
を行う方法もありますが、apt update
した際に以下のような警告が表示されます。(Ubuntu22.04までのバージョンのみ)
# OUTPUT:
# W: https://download.docker.com/linux/ubuntu/dists/focal/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
Ubuntuマニュアルに以下記載があります。
apt-key(8) will last be available in Debian 11 and Ubuntu 22.04.
パッケージ管理ツールの APT でパッケージへの電子署名用 OpenPGP 公開鍵を管理する apt-key コマンドが非推奨になっており、更に Debian 12 では apt-key コマンドは削除されます。
つまりは「サードパーティの公開鍵を管理する仕組みは提供するので、自分でやってください。APT では管理しません」ということ。
【対処法】
/etc/apt/keyrings
ディレクトリに公式DockerリポジトリのGPGキーを ASCII Armor 形式
で追加します。
cd /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o docker-key.asc
以下コマンドでarchive_uri-https_download_docker_com_linux_ubuntu-jammy.list
を編集します。
sudo vim /etc/apt/sources.list.d/archive_uri-https_download_docker_com_linux_ubuntu-jammy.list
画像の通り、既存のdeb ~~~
の記載をコメントアウトして以下をコピーして下部へ追加し保存して閉じる。
deb [arch=amd64 signed-by=/etc/apt/keyrings/docker-key.asc] https://download.docker.com/linux/ubuntu jammy stable
sudo apt update
# OUTPUT:
# ︙
# Reading package lists... Done
# Building dependency tree... Done
# Reading state information... Done
# 41 packages can be upgraded. Run 'apt list --upgradable' to see them.
警告は表示されてなければOKです!!
続いて、以下を順に実行してDocker-CEをインストールします。
#Dockerリポジトリからインストールしようとしていることを確認
apt-cache policy docker-ce
#Dockerをインストール
sudo apt install docker-ce
#実行を確認(active (running)となってればOK)
sudo systemctl status docker
これでDockerのインストールは完了です。
6 - 5.sudoなしでDockerコマンドを実行可能にする
ここではdockerユーザーグループにuserを追加します。
#ユーザーをdockerグループに追加
sudo usermod -aG docker ${USER}
#追加を反映
su - ${USER}
#確認(outputにdockerがあればOK)
id -nG
6 - 6.Docker Hubからイメージをダウンロードできるか確認
以下を順に実行してください。
docker run hello-world
#OUTPUT:
##Unable to find image 'hello-world:latest' locally
##latest: Pulling from library/hello-world
##0e03bdcc26d7: Pull complete
##Digest: sha256:6a65f928fb91fcfbc963f7aa6d57c8eeb426ad9a20c7ee045538ef34847f44f1
##Status: Downloaded newer image for hello-world:latest
##
##Hello from Docker!
##This message shows that your installation appears to be working correctly.
##...
#ダウンロードしたイメージ確認
docker images
#イメージを強制削除
## docker rmi -f hello-world:latestなど
docker rmi -f {REPOSITORY_NAME}
7.Docker Composeのインストール
7 - 1.docker-composeとの違い
Dockerのサブコマンドであるcomposeと似たものでdocker-composeコマンドが存在します。
その違いは以下の通りです。
後発の compose サブコマンドは docker-compose コマンドの将来的な置き換えを目指して開発された機能になるそうです。
docker-compose は python で書かれたものですが、compose サブコマンドは compose-cli というレポジトリーで Go で再実装されています。
互換性を維持した状態で開発されています。ここでいう互換性というのは、docker-compose 側で使えるオプションコマンドや実行方法などが同じような状態で使えるようにされています。
(https://keyno63.hatenablog.com/entry/2021/07/24/231528 より引用)
docker-compose の後に compose サブコマンドが再開発され、compose サブコマンドは以前とほぼ同様の使用感になっているようなので、今回はDockerのサブコマンドであるcomposeのインストールを行います。
7 - 2.dockerのサブコマンドcomposeのインストール
以下を順に実行し、バージョンが表示されればインストール完了です。
#既存のパッケージのリストを更新
sudo apt update
#Docker Compose をインストール
sudo apt install docker-compose-plugin
#Version確認
docker compose version
#OUTPUT
#Docker Compose version vx.xx.x
8.終わり
以上でWSL・Ubuntuのインストール、Docker環境の構築完了です!
ありがとうございました!