0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Rocky Linux 9のDockerコンテナからWSLのディストリビューションを作成する

Posted at

What's?

WSLで、wsl --list --onlineで表示される(Microsoft Storeで配布されているもの)以外のLinuxディストリビューションを使うにはどうすればよいのかな?と調べてみたところ、Dockerコンテナから作成したtarファイルをインポートできるようなので試してみます。

Dockerコンテナです。Dockerイメージではありません。

Microsoft Storeで配布されていないLinuxディストリビューションを使う

wsl --list --onlineで表示されるのは、Microsoft Storeで配布されているWSLのディストリビューションです。

これ以外のLinuxディストリビューションを使う方法はこちらのドキュメントに書かれています。

以下の方法があります。いずれもtarファイルからWSLへインポートするという形態をとります。

  • Minimal Root Filesystemが配布されているディストリビューションを使う
  • LinuxのDockerコンテナインスタンスをtarファイルとしてエクスポートして使う

Minimal Root Filesystemが提供されているのはAlpine Linuxくらいなのでしょうか。

簡単にできそうなのはDockerコンテナを使った方法のようなので、こちらをRocky Linux 9を題材に試してみます。

環境

今回の環境はこちら。

WSLを使うWindows側。

PS > [System.Environment]::OSVersion

Platform ServicePack Version      VersionString
-------- ----------- -------      -------------
 Win32NT             10.0.26200.0 Microsoft Windows NT 10.0.26200.0


PS > $PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      26100  7462


PS > wsl --version
WSL バージョン: 2.6.3.0
カーネル バージョン: 6.6.87.2-1
WSLg バージョン: 1.0.71
MSRDC バージョン: 1.2.6353
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26100.1-240331-1435.ge-release
Windows バージョン: 10.0.26200.7623

Docker Engineを使うLinux側。

 docker version
Client: Docker Engine - Community
 Version:           29.1.5
 API version:       1.52
 Go version:        go1.25.6
 Git commit:        0e6fee6
 Built:             Fri Jan 16 12:48:47 2026
 OS/Arch:           linux/amd64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          29.1.5
  API version:      1.52 (minimum version 1.44)
  Go version:       go1.25.6
  Git commit:       3b01d64
  Built:            Fri Jan 16 12:48:47 2026
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v2.2.1
  GitCommit:        dea7da592f5d1d2b7755e3a161be07f43fad8f75
 runc:
  Version:          1.3.4
  GitCommit:        v1.3.4-0-gd6d73eb8
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Rocky Linux 9のDockerコンテナからWSLのディストリビューションを作成する

それではこちらに沿って進めてみます。

Dockerコンテナをtarファイルとしてエクスポートする

ひとまずコンテナを実行します。

$ docker container run -it --name wsl-export rockylinux/rockylinux:9.7 ls /
afs  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

するとコンテナはすぐに終了してしまいますが、--rmオプションをつけていなければ終了したコンテナが残ります。

$ docker container ps -a
CONTAINER ID   IMAGE                       COMMAND   CREATED              STATUS                          PORTS     NAMES
b24e24fc916b   rockylinux/rockylinux:9.7   "ls /"    About a minute ago   Exited (0) About a minute ago             wsl-export

これをtarファイルにエクスポートします。

$ docker container export wsl-export > rocky-linux-9.7.tar

サイズはこれくらいでした。

$ ls -lh rocky-linux-9.7.tar
-rw-rw-r-- 1 user user 232M  1月 18 20:28 rocky-linux-9.7.tar

そしてWindows側に持ってきます。

Docker EngineもWSL上で動かしている場合は、マウントしているCドライブを経由するとよいでしょう。

エクスポートが済んだら、Linux側で終了したコンテナやtarファイルは削除しておきます。

$ docker container prune -f
$ rm rocky-linux-9.7.tar

WSLにインポートする

次はtarファイルをWSLにインポートします。

インストール先ディレクトリが必要になるので、先に作成しておきます。

PS > New-Item -ItemType "Directory" C:\wslDistroStorage\RockyLinux-9.7

インポート。

PS > wsl --import RockyLinux-9.7 C:\wslDistroStorage\RockyLinux-9.7 .\rocky-linux-9.7.tar

終了したようです。

この操作を正しく終了しました。

この時点でwsl --listに表示されます。

PS > wsl --list --verbose
  NAME              STATE           VERSION
* RockyLinux-9.7    Stopped         2


PS > wsl --list
Linux  Windows サブシステム ディストリビューション:
RockyLinux-9.7 (既定値)

実行してみます。

PS > wsl -d RockyLinux-9.7
#

あっさり起動しましたよ…。

ユーザを変更する

インポートしてあっさりと起動しましたが、見てのとおりrootユーザなのでちょっと微妙です。

ドキュメントを見るとインポートすると常にrootユーザになるようです。

--importを使用する場合、既定では常にルート ユーザーとして開始されます。 独自のユーザー アカウントを設定できますが、設定プロセスは、各 Linux ディストリビューションによって若干異なる点に注意してください。

WSL で使用する Linux ディストリビューションをインポートする / 既定のユーザーなどの WSL 固有のコンポーネントを追加する

passwdとsudoを追加。

dnf upgrade -y && dnf install -y passwd sudo

ユーザを作成。

username=[ユーザ名]
adduser -G wheel $username

/etc/wsl.confに反映。

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

パスワードを設定。

passwd $username

ここまでやったら、ディストリビューションを1度停止して

PS > wsl --terminate RockyLinux-9.7

起動し直すと、指定したユーザになります。

PS > wsl -d RockyLinux-9.7
$ id -un
[ユーザ名]

wheelに属しているので、sudoも実行可能です。

systemdを使う

/etc/wsl.confを見ると、デフォルトでsystemd=trueになっているようです。

$ cat /etc/wsl.conf
[boot]
systemd=true
[user]
default=[ユーザ名]

ということなら、systemdを使うパッケージを試してみましょう。

Apacheでしょうか。

$ sudo dnf install httpd

systemctlを使うと怒られます…。

$ sudo systemctl status httpd
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

どうやら初めてsystemdを使う場合は1度ディストリビューションを再起動するとよさそうです。

PS > wsl --terminate RockyLinux-9.7
PS > wsl -d RockyLinux-9.7

今度は動きます。

$ sudo systemctl status httpd
○ httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)
     Active: inactive (dead)
       Docs: man:httpd.service(8)

ユニット定義の有効化と起動。

$ sudo systemctl enable --now httpd

確認。

$ sudo systemctl status httpd
● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; preset: disabled)
     Active: active (running) since Sun 2026-01-18 20:59:45 JST; 47s ago
       Docs: man:httpd.service(8)
   Main PID: 209 (httpd)
     Status: "Total requests: 2; Idle/Busy workers 100/0;Requests/sec: 0.0513; Bytes served/sec: 212 B/sec"
      Tasks: 177 (limit: 26213)
     Memory: 21.7M (peak: 22.2M)
        CPU: 581ms
     CGroup: /system.slice/httpd.service
             ├─209 /usr/sbin/httpd -DFOREGROUND
             ├─210 /usr/sbin/httpd -DFOREGROUND
             ├─211 /usr/sbin/httpd -DFOREGROUND
             ├─212 /usr/sbin/httpd -DFOREGROUND
             └─213 /usr/sbin/httpd -DFOREGROUND

Jan 18 20:59:44 server systemd[1]: Starting The Apache HTTP Server...
Jan 18 20:59:45 server systemd[1]: Started The Apache HTTP Server.
Jan 18 20:59:45 server httpd[209]: Server configured, listening on: port 80

curlでアクセスしてみます。

$ curl -I localhost
HTTP/1.1 403 Forbidden
Date: Sun, 18 Jan 2026 12:00:09 GMT
Server: Apache/2.4.62 (Rocky Linux)
Last-Modified: Sat, 17 May 2025 02:45:05 GMT
ETag: "1dc4-6354be2d9ae40"
Accept-Ranges: bytes
Content-Length: 7620
Content-Type: text/html; charset=UTF-8

OKでしょう。

ちょっと気になったこと

tarファイルでインポートするディストリビューションは、WSLで起動するディストリビューションする扱いのようです。

どういうことかというと、たとえば今回でいえばRocky Linux 9.7のtarファイルを使って別名のディストリビューションを登録しようと思うとその都度tarファイルが必要になります。

仮想マシンとして登録するディストリビューションの扱いではないので、1度登録したらあとはこれをテンプレート的に使って別名のディストリビューションを作る、といったことはできないので注意が要ります。

だからwsl --importが完了した時点でwsl --listに表示されたのだと思いますが。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?