What's?
WSL 2.9.3からWSLC(WSLコンテナ)が使えるようになりました。
せっかくなので試してみましょう。
WSLC(WSLコンテナ)?
ドキュメントはこちらです。
設定はこちら。
WSLコンテナのリリースブログはこちら。
アーキテクチャに関するブログ記事。
ドキュメントを中心に見ていきましょうか。
- WSLコンテナとはLinuxコンテナのビルド、実行、操作を行えるwslc、WSLコンテナAPIの2つの主要コンポーネントから構成される
- WSL 2.9.3以降で利用可能
リリースブログには、パブリックプレビュー以降の変更が書かれていますね…。
パブリックプレビュー時のブログ記事はこちら。
ただ、こちらも実際の使い方について詳しく書かれているわけではありません。
dockerコマンドに似たものとして、使ってみた方が早そうですね。
環境
今回の環境はこちら。
PS > wsl --version
WSL バージョン: 3.0.1.0
カーネル バージョン: 6.18.40.1-1
WSLg バージョン: 1.0.79
MSRDC バージョン: 1.2.7214
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26100.1-240331-1435.ge-release
Windows バージョン: 10.0.26200.9457
WSLCを使ってみる
それでは使ってみましょう。
バージョン。
PS > wslc --version
wslc 3.0.1.0
ヘルプ。
PS > wslc --help
Copyright (c) Microsoft Corporation.All rights reserved.
この製品に関するプライバシー情報については、https://aka.ms/privacy にアクセスしてください。
WSLC はLinux 用 Windows サブシステム Container CLI ツールです。これにより、コマンド ラインから WSL コンテナーの管理と対話が可能になります。
使用: wslc [global-options] [<コマンド>] [オプション]
コマンド:
container コンテナーを管理します。
image イメージを管理します。
network ネットワークを管理します。
registry レジストリ資格情報を管理します。
settings 既定のエディターで設定ファイルを開きます。
system システムレベルのコマンド
volume ボリュームを管理します。
attach コンテナーにアタッチします。
build Dockerfile からイメージをビルドします。
create コンテナーを作成します。
exec 実行中のコンテナーでコマンドを実行します。
events コンテナー イベントを監視します。
export コンテナーのファイルシステムを tar アーカイブとしてエクスポートします。
images イメージを一覧表示します。
import tarball から画像をインポートします。
info システム情報を表示します。
inspect オブジェクトを検査します。
kill 1 つ以上の実行中のコンテナーを強制終了します。
list コンテナーを一覧表示します。
load イメージを読み込みます。
login レジストリにログインします。
logout レジストリからログアウトします。
logs コンテナー ログを表示します。
pull イメージをプルします。
push イメージをレジストリにアップロードします。
remove コンテナーを削除します。
restart コンテナーを再起動します。
rmi イメージを削除します。
run コンテナーを実行します。
save イメージを保存します。
start コンテナーを開始します。
stats コンテナーのリソース使用状況の統計を表示します。
stop コンテナーを停止します。
tag イメージにタグを付けます。
version バージョン情報を表示します。
特定のコマンドの詳細については、それにヘルプ オプションを渡します。 [-?]
オプション :
-v --version このツールのバージョン情報を表示します
-? --help 選択したコマンドに関するヘルプを表示
'wslc' のグローバル オプション:
--session 使用するセッションを指定する
ヘルプはサブコマンドごとに見れます。
PS > wslc run --help
Copyright (c) Microsoft Corporation.All rights reserved.
この製品に関するプライバシー情報については、https://aka.ms/privacy にアクセスしてください。
コンテナーを実行します。デフォルトでは、コンテナーはフォアグラウンドで開始されます。--detach を使用してバックグラウンドで実行します。
使用: wslc run [オプション] <image> [<command>] [<arguments>...]
エイリアス:
wslc container run, wslc run
引数:
image イメージ名
command 実行するコマンド
arguments コンテナーの初期化プロセスに渡す引数
オプション :
--cidfile 指定されたパスにコンテナー ID を書き込みます
--cpus CPU の数 (例: 0.5、1、2.5)
-d --detach コンテナーをデタッチ モードで実行します
--dns resolv.conf 内の DNS ネームサーバーの IP アドレス
--dns-option DNS オプションを設定します
--dns-search DNS 検索ドメインを設定します
--domainname コンテナー ドメイン名
--entrypoint コンテナー初期化プロセスの実行可能ファイルを指定します
-e --env 環境変数の Key=Value のペア
--env-file 環境変数の key=value のペアを含むファイル
--gpus Add GPU devices to the container ('all' to pass all GPUs)
--health-cmd コンテナーの正常性をチェックするために実行するコマンド
--health-interval 正常性チェックの実行間隔 (例: 30s, 1m30s)
--health-retries コンテナーを異常として報告するために必要な連続失敗回数
--health-start-period 正常性チェックのカウントダウンを開始する前にコンテナーを初期化するための開始期間 (例: 30s、1m30s)
--health-timeout 1 回の正常性チェックを実行するために許可される最大時間 (例: 30s、1m30s)
-h --hostname コンテナー ホスト名
-i --interactive stdin にアタッチして開いたままにする
--ip コンテナーにネットワーク上の IPv4 アドレスを割り当てます
-l --label オブジェクトにメタデータを設定します
-m --memory メモリ制限 (例: 512M, 1G)
--mount ファイルシステム マウントをコンテナーにアタッチします
--name コンテナーの名前
--network コンテナーをネットワークに接続する
--network-alias コンテナーにネットワーク スコープのエイリアスを追加する
--no-healthcheck コンテナーで指定された正常性チェックを無効にする
-p --publish コンテナーからホストへのポートを公開します
-P --publish-all 公開されているすべてのポートをランダム ホスト ポートに発行する
--pull イメージのプル ポリシー (always|missing|never) (既定値: missing)
--rm コンテナーを停止後に削除します
--shm-size /dev/shm のサイズ (例: 64M、1G)
--stop-signal コンテナーを停止するシグナル
--stop-timeout コンテナーを強制終了する前に停止するタイムアウトです (秒単位、タイムアウトなしの場合は -1)
--tmpfs tmpfs を指定されたパスにあるコンテナーにマウントします
-t --tty コンテナー プロセスで TTY を開きます。
--ulimit Ulimit オプション (形式: <name>=<soft>[:<hard>]、無制限の場合は -1 を使用)
-u --user プロセスのユーザー ID (name|uid|uid:gid)
-v --volume ボリュームをコンテナーにバインド マウントします
-w --workdir コンテナー内の作業ディレクトリ
-? --help 選択したコマンドに関するヘルプを表示
'wslc' のグローバル オプション:
--session 使用するセッションを指定する
Dockerですね。
nginxで試してみましょう。
PS > wslc run -it --rm --name nginx nginx:1.31.6-trixie
コンテナイメージのダウンロードが始まります。
イメージ 'nginx:1.31.6-trixie' が見つかりません。プルしています
1.31.6-trixie: Pulling from library/nginx
ecc510c1e359: Extracting [=============================>] 29.16MB/29.84MB
04bdbc7ea6b5: Download complete
807ab930f3a0: Download complete
1efc53192927: Download complete
947d22046304: Download complete
8020170dc65f: Download complete
f7e1db57b58b: Download complete
コンテナのIPアドレスを確認。
PS > wslc inspect nginx | Select-String IPA
"IPAMConfig": null,
"IPAddress": "172.17.0.2",
アクセスしてみましょう。
PS > Invoke-WebRequest http://172.17.0.2
Invoke-WebRequest : リモート サーバーに接続できません。
At line:1 char:1
+ Invoke-WebRequest http://172.17.0.2
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequ
est) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Comma
nds.InvokeWebRequestCommand
…到達できませんね?どういうことでしょう?
コンテナ起動時にローカルのポートにバインドするようにしてみます。
PS > wslc run -it --rm --name nginx -p 80:80 nginx:1.31.6-trixie
今度は到達できました。
PS > (Invoke-WebRequest http://localhost).Content
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, nginx is successfully installed and working.
Further configuration is required for the web server, reverse proxy,
API gateway, load balancer, content cache, or other features.</p>
<p>For online documentation and support please refer to
<a href="https://nginx.org/">nginx.org</a>.<br/>
To engage with the community please visit
<a href="https://community.nginx.org/">community.nginx.org</a>.<br/>
For enterprise grade support, professional services, additional
security features and capabilities please refer to
<a href="https://f5.com/nginx">f5.com/nginx</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
OKですね。
本当に?
ローカルポートにバインドさせなかった時には、コンテナにアクセスできませんでした。
また、コンテナにしては起動が重い時がありました。
これはどういうことでしょう?とこちらを確認してみます。
これを見ていると、どうも間にLinux VMが挟まっていますね…。
とはいえ、WSLディストリビューションが動作しているわけではなさそうです。
PS > wsl --list
Linux 用 Windows サブシステムにインストールされているディストリビューションはありません。
この問題を解決するには、以下の手順に従ってディストリビューションをインストールしてください:
'wsl.exe --list --online' を使用して利用可能な配布を一覧表示する
および 'wsl.exe --install <Distro>' を使用してインストールしてください。
WSLCのコンテナとしては存在しますけどね。
PS > wslc ls
コンテナー ID 画像 コマンド 作成済み 状態 ポート 名前
fa12626dad92 nginx:1.31.6-trixie "/docker-entrypoint.…" 2 分前 Up 2 minutes nginx
この時にHost Compute System(HCS)の機能で作られる仮想マシンの一覧を見てみます。
PS > hcsdiag list
7BB9D250-53BE-4E49-AD4B-CB58DFF6F7CA
VM, Running, 7BB9D250-53BE-4E49-AD4B-CB58DFF6F7CA, wslc-cli-admin-user
なんかありますね?
WSLを使っている時は、起動するWSLディストリビューションを増やしてもこの仮想マシンは増えませんでした。
ではここにWSLディストリビューションを追加してみます。
PS > wsl --install
ダウンロードしています: Ubuntu
[ 1.5% ]
WSLディストリビューション起動中に、仮想マシンの一覧を見てみます。
PS > hcsdiag list
7BB9D250-53BE-4E49-AD4B-CB58DFF6F7CA
VM, Running, 7BB9D250-53BE-4E49-AD4B-CB58DFF6F7CA, wslc-cli-admin-user
E8F16996-8E4F-4F2F-9B33-406BC1B7EFCF
VM, Running, E8F16996-8E4F-4F2F-9B33-406BC1B7EFCF, WSL
増えましたよ…。
というわけで、WSLCは通常のWSLディストリビューションとは異なる仮想マシン上で動作していると考えた方がよさそうです。
