CentOS/Alma/RockyのWSL環境をDockerイメージから構築する

WSL 2CentOS,CentOS8,Docker,Linux,Windows,WSL2

Windows 10以降、仮想環境中でLinuxディストリビューションを動かす「WSL」という機能が搭載されています。基本的に、そこで使えるディストリビューションは、Microsoftストアで配信されているもののみですので、CentOSなどは利用できません。

ですが、いろいろ調べてみると、LinuxディストリビューションのDockerイメージから簡単にWSL用のディストリが作成できるみたいですので、その方法を使ってWSL2でCentOSなどの環境を構築する方法を紹介します。

今回はCentOS、AlmaLinux、Rocky Linuxを例に紹介しますが、Dockerイメージさえあれば、他のディストリでも同様に構築可能かと思います。

はじめに

Windows 10以降、WSL2 (Windows Subsystem for Linux)という、Windows上の仮想環境でLinuxディストリビューションを動かす仕組みが搭載されています。WSL2のコンポーネントをインストールした上で、MicrosoftストアからLinuxディストリビューションをインストールするだけで、Windows上でシームレスにLinuxが使えるようになります。

ですが、Microsoftストアからインストールできるのは、wsl -l --onlineを実行したときに出てくるもののみです。

PS C:\> wsl -l --online
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl --install -d <Distro>' を使用してインストールします。

NAME            FRIENDLY NAME
Ubuntu          Ubuntu
Debian          Debian GNU/Linux
kali-linux      Kali Linux Rolling
openSUSE-42     openSUSE Leap 42
SLES-12         SUSE Linux Enterprise Server v12
Ubuntu-16.04    Ubuntu 16.04 LTS
Ubuntu-18.04    Ubuntu 18.04 LTS
Ubuntu-20.04    Ubuntu 20.04 LTS

従って、基本的にCentOSなどのディストリビューションは、WSL2上では使えません。

いろいろ調べてみたところ、WSL2ベースで動くDocker Desktop環境があれば、比較的簡単にDockerのOSイメージからWSL2用のイメージを作成できるそうです。そこで本記事では、CentOSやAlmaLinux、Rocky Linuxを例にして、DockerイメージからWSL2環境を構築する方法を紹介します。

ちなみに、今回例に挙げているCentOS 8は、Red Hatの運営方針が変わって2021年でサポートが切れます。その方針変更に反発して、代替として生まれたディストリビューションがAlmaLinuxやRocky Linuxです。

ご案内

本記事は、WSL2ベースで動いているDocker Desktop環境が必要です。Docker Desktopをインストール済みの方は、Docker Desktopの設定画面(歯車マーク)から「Use the WSL 2 based engine」のチェックが入っているか確認してください。

「Use the WSL 2 based engine」のチェックが入っているか確認します

まだインストールされていない方は、こちらの記事を参考にWSL2とDocker Desktopの設定を行ってください。Windows 10をご利用の方はこちらが、

Windows 11をご利用の方はこちらが参考になると思います。

Docker Desktopをインストールする際、下図の一つ目のチェックを忘れないようにしてください。

「Enable WSL 2~」にチェックを入れて次に進みます

先の記事ではチュートリアルをやったりしていましたが、Docker Desktopをインストール・PC再起動して、下記の画面まで来たらOKです。

Docker Desktopのダッシュボード

PowerShellスクリプトで全自動構築する

Dockerイメージの取得からWSL2へのインポートまでを全自動で行うPowerShellスクリプトを作成しました。こちらを実行するだけでWSL2上でCentOS 8が使えるようになります。次項では、スクリプトの解説を兼ねて、一つ一つコマンドを説明しています。スクリプトを使いたくない方は、この項を飛ばして次項を参照ください。

<#
build-CentOS-on-WSL2.ps1
DockerイメージからCentOSやRocky LinuxのWSL2環境を構築します
https://astherier.com/blog/2021/08/centos-almalinux-rocky-linux-on-wsl2-from-docker/
最終更新:2021/08/11

Copyright (c) 2021 astherier
This software is released under the MIT License.
http://opensource.org/licenses/mit-license.php
#>

# Docker HubからPullするイメージ名を指定してください
# 例:"centos:8"、"almalinux:8"、"rockylinux/rockylinux:8"
$dockerName="centos:8"

# WSL2上の表示名を入力してください
# 例:"CentOS-8"、"AlmaLinux-8"、"Rocky-Linux-8"
$distroName="CentOS-8"

# WSL2中で使用するユーザーアカウント名を入力してください。
# (Windows側のユーザー名と同じにする必要はありません)
$myUserName="username"

# WSL2ディストリの元となるtarファイル(docker exportしたもの)の
# 保存先(ファイルパス)を指定してください。
# (WSL2環境ができあがったら削除可能です)
$tarPath="C:\wsl\distro-tar\${distroName}.tar"

# WSL2ディストリのディスクイメージファイルの保存先(フォルダ)を指定してください。
# (こちらは、永続的に保存できる場所を指定してください)
$distroDir="C:\wsl\distro\${distroName}"

New-Item (Split-Path -Parent $tarPath) -type directory -Force
New-Item $distroDir -type directory -Force

docker run --name "${distroName}-temp" "$dockerName"
docker export "${distroName}-temp" -o "$tarPath"
docker container rm "${distroName}-temp"
docker image rm "$dockerName"

wsl --import "$distroName" "$distroDir" "$tarPath"

wsl -d "$distroName" -- yum update -y "&&" yum install glibc-langpack-en passwd sudo -y
wsl -d "$distroName" -- adduser -G wheel "$myUserName" "&&" passwd "$myUserName"
wsl -d "$distroName" -- echo -e "[user]\\ndefault=$myUserName" ">>" /etc/wsl.conf

wsl -t "$distroName"

echo @"

WSL2への $distroName の構築が完了しました。
 > wsl -d $distroName 
で $distroName が起動できます。
また、Windows Terminalを再起動すれば、新規タブ欄からも起動できます。

"@

上記ファイルはこちらからダウンロードできるようにしておきましたので、PowerShell上でダウンロードして実行するだけでOKです。
https://astherier.com/static/blog/2021-08-11/build-CentOS-on-WSL2.ps1

なお、上記スクリプトをそのまま実行すると、CentOS 8を構築し、「username」という名前のアカウントが作成されます。好みに合わせて調整の上、実行してください。

  • AlmaLinuxやRocky Linux環境を構築したい場合は、14行目と18行目を適切に書き換えてください。18行目はWSL2上の表示名ですので、任意に変更して構いません。
  • ユーザー名を変更したい場合は、22行目を編集してください。このユーザー名は、Windowsのユーザー名と合わせる必要はありません。
  • ディスクイメージ等の保存先を変更したい場合は、27行目と31行目を編集してください。

curlコマンドでダウンロードできます。ダウンロードが終わったら、実行します。

curl -O https://astherier.com/static/blog/2021-08-11/build-CentOS-on-WSL2.ps1
& .\build-CentOS-on-WSL2.ps1
処理は何分かかかります

実行後しばらくすると、下記のプロンプトが表示されます。これは、WSL2上のユーザーアカウントのパスワード設定です。設定したいパスワードを入力してください。

Changing password for user username.
New password:
WSL2側ユーザーのパスワードを設定します

設定が終わったら、「構築が完了しました」というメッセージが出てくると思いますので、ここまで終わったら完了です。

この表示になったら完了です

次に、「インストールできたか確認する」へ進んでください。

手動で設定する

この項では、前項のPowerShellスクリプトの解説も兼ねて、コマンドを一つずつ解説していきます。手動でWSL2上にCentOS環境を構築したい場合は、こちらを参考にしてください。

ここでは、CentOS 8をインストールする例を示していますので、pullするDockerイメージは「centos:8」、WSL2上の表示名は「CentOS-8」としています。CentOSではなく、代替ディストリビューションの

  • AlmaLinuxをインストールするなら「almalinux:8」と「AlmaLinux-8」へ
  • Rocky Linuxをインストールするなら「rockylinux/rockylinux:8」と「Rocky-Linux-8」へ

それぞれ読み替えてください。Dockerイメージのタグ等は、好みに応じてマイナーバージョンまで指定したり、latestを指定したりしてください。後者の表示名も任意ですので、好みに合わせて変更して構いません。

おおまかにいえば、Dockerコンテナを作成してexport → WSL2へimport → WSL2上でアカウント作成 という流れで進めていきます。

Dockerイメージを取得して、コンテナをexportする

まずは、Dockerイメージを取得し、コンテナを作成します。実行するコマンドはdocker run --name <作成するコンテナ名> <使用したいDockerイメージ名>です。手元にCentOSのイメージがない場合、イメージのダウンロードから始まりますので、少し時間がかかります。

docker run --name CentOS-8-temp centos:8

上記コマンドが終わったら、作成したコンテナをtarファイルとしてエクスポートします。コマンドはdocker export <作成したコンテナ名> -o <エクスポート先パス>です。ここで出力するファイルは、最終的には不要になるものですので、一時的な保存場所に置いても構いません。

docker export CentOS-8-temp -o "C:\wsl\distro-tar\CentOS-8.tar"

tarファイルができたら、Dockerのコンテナやイメージは不要ですので、他に用途がなければ削除しておきましょう(他のコンテナでCentOSイメージを使用している場合は、イメージの削除はできません)。コンテナの削除はdocker container rm <作成したコンテナ名>、イメージの削除はdocker image rm <使用したイメージ名>でできます。

docker container rm CentOS-8-temp
docker image rm centos:8

DockerコンテナをWSL2にインポートする

Dockerからエクスポートしたコンテナファイルは、WSL2にインポート可能です。ここで実行するコマンドはwsl --import <WSL2上のディストリ名> <ディスクイメージの保存フォルダ> <エクスポートしたtarファイル>です。ディストリ名は任意に決めてください。ディスクイメージの保存フォルダは、WSL2ディストリの実体が保存されるフォルダですので、永続的に保存しておけるフォルダを指定してください

wsl --import CentOS-8 "C:\wsl\distro\CentOS-8" "C:\wsl\distro-tar\CentOS-8.tar"

実行し終わったら、正しくインストールできたか確認してみます。wsl -l -vを実行してみて、「CentOS-8」というディストリビューションが表示されていれば問題ありません。

PS C:\> wsl -l -v
  NAME                   STATE           VERSION
* Ubuntu-18.04           Running         2
  CentOS-8               Stopped         2
  Ubuntu                 Stopped         2
  docker-desktop-data    Running         2
  Ubuntu-20.04           Running         2
  docker-desktop         Running         2

ここまで来たら、前項でdocker exportしたtarファイルは削除しても構いません。ただ、ディストリ名を変えてインポートすれば、CentOS環境をたくさんつくれますので、その予定がある方は残しておきましょう。

WSL2(CentOS)側でユーザーを作成する

このままでも利用可能ですが、一般ユーザーを作成していないため、常にrootでログインすることになってしまいます。それでは危なかったりしますので、一般ユーザーを作成しましょう。

まず、wsl -d <ディストリ名>コマンドを実行して、先ほど作成したCentOSを起動します。

wsl -d CentOS-8

すると、WSL2のCentOS 8が起動し、プロンプトが変わります。まず始めに、各パッケージのアップデートと必要コマンドのインストールを行います。

yum update -y && yum install glibc-langpack-en passwd sudo -y

続いて、一般ユーザーの作成とパスワードの設定を行います。ここでは「username」という名前のユーザーを作成しますが、これも任意ですので適宜読み替えてください。CentOS側のユーザー名ですので、Windowsのユーザー名と合わせる必要はありません。

myUserName=username
adduser -G wheel $myUserName && passwd $myUserName

上記を実行すると、設定したいパスワードを聞かれますので、パスワードを入力してエンターキーを押してください。続いて、確認のためもう一度聞かれますので、同じパスワードを入力します。(入力しても「●●●」や「***」とも出てきませんが、入力できています)

次に、次回から、作成した一般ユーザーでログインするよう、wsl.confファイルを作成します。

echo -e "[user]\ndefault=$myUserName" >> /etc/wsl.conf

以上でCentOS側で行う作業は終了です。exitを実行してCentOSから抜けて、PowerShellへ戻ります。

exit

wsl.confファイルは、次回CentOSを起動した際に読み込まれますので、一旦CentOSを終了するためwsl -t <ディストリ名>を実行します。

wsl -t CentOS-8

以上で環境構築は完了です。

インストールできたか確認する

インストールできたか確認してみます。

もう一度wsl -d <ディストリ名>を実行して、CentOSを起動してみます。

wsl -d CentOS-8

もしくは、Windows Terminalをご利用の方は、Windows Terminalを再起動すると新規タブ欄にCentOS-8が追加されていると思います。それを開いても同様に起動することができます。

どちらかで起動して、作成した一般ユーザーでプロンプトが表示されたらOKです。ついでに、cat /etc/os-releaseを実行して、バージョン等を確認してみましょう。

[username@z390 username]$ cat /etc/os-release
NAME="CentOS Linux"
VERSION="8"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="CentOS Linux 8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:8"
HOME_URL="https://centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"
CENTOS_MANTISBT_PROJECT="CentOS-8"
CENTOS_MANTISBT_PROJECT_VERSION="8"

以上で設定は終了です。CentOS、AlmaLinux、Rocky Linuxいずれも同じ方法で設定できます。

CentOS、AlmaLinux、Rocky Linuxいずれも同じ方法で設定できます

あとがき

DockerのOSイメージを利用して、WSL2上にCentOS、AlmaLinux、Rocky Linux環境を構築する方法を紹介しました。

Docker Desktopが必須というデメリットはあるものの、Rocky Linuxのドキュメントで紹介されている、「WSL2+Ubuntu+rinseを使用した構築方法」より簡単ですのでおすすめです。Dockerイメージが公開されていれば、他のディストリビューションでも同様にWSL2へ移植できると思われます。

また、途中でdocker exportでtarファイルを出力していますが、WSL2上のディストリ名を変更すれば、このtarファイルから複数のWSL2環境を構築できます(「DockerコンテナをWSL2にインポートする」以降を行う)。テスト用に使い捨て環境をつくる、という使い方も便利でしょう。

参考サイト

本記事は、主にRocky Linuxのドキュメントを参照して作成しました。こちらのドキュメントでは、VirtualBoxを用いた方法も紹介されていますが、WSL2を使う方法の方が楽だと思います。

Microsoftにも同様のドキュメントがありますが、古いDocker Desktopを前提にして書かれているようです。

ちなみに、あとがきに書いた「WSL2+Ubuntu+rinse」を使う方法は、こちらのドキュメントで説明されています。結構大変そうです。