WSL Containerをdip / docker compose みたいに使える wipコマンドを作った - yubeleのスライド |
slidict.io

JA | EN

WSL Containerをdip / docker compose みたいに使える wipコマンドを作った

Google Translate: 日本語 英語
yubele
yubele
フォロワー 0人
最終更新: 2026/08/01
読む時間: 00:24

共有

コード

通報

元になったドキュメント

きっかけ

Windows で開発をしていると、コンテナを使うために Docker Desktop を常時立ち上げておく必要がありました。しかし Microsoft の WSLC(WSL Containers)を使えば、Docker Desktop を起動せずに WSL2 上で直接コンテナを扱えます。「これを使えばもっと効率がいいのではないか」というシンプルな発想が wip の出発点でした。

ただし WSLC には dip のような、コンテナ・環境変数・コマンドを一つの設定ファイルにまとめて短いコマンドで呼び出せる仕組みがあればいいなと思いました。 wslc.exe exec -it -w /app app bin/rails c のような長いコマンドを毎回手打ちするのは非効率だったため、WSLC を dip 的な使い勝手でラップする CLI として wip の開発が始まりました。

WSL Containersとは?

WSL Containersは、Windows Subsystem for Linux上でLinuxコンテナをビルド、実行、管理するための仕組みです。

中心となるCLIが`wslc.exe`です。

wslc pull ubuntu:latest
wslc build .
wslc run ubuntu:latest
wslc ps
wslc exec
wslc logs
wslc stop

Docker Desktopを介さず、WindowsとWSLの機能としてOCIコンテナを扱うことを目的としています。

WSL ContainersはDockerそのものではありません。

docker CLI → Docker Engine
podman CLI → Podman
wslc CLI → WSL Containers

Docker Hubなどで配布されているOCIイメージを利用できますが、実行基盤や対応機能はDocker Engineと異なります。

そのため、Docker Desktopでは動作するイメージやオプションが、`wslc`では動作しない場合があります。

現状のWSL Containersは、Docker Composeを含むDocker開発環境全体を置き換えるものというより、単体コンテナを操作する軽量なコンテナ基盤として位置づけられます。

Docker Composeにあってwslcにないもの

宣言的な複数サービス管理

Docker Composeでは、`compose.yml`にWeb、DB、Redis、ワーカーなどをまとめて定義できます。

services:
  web:
    build: .

  mysql:
    image: mysql:8

  redis:
    image: redis:7

`wslc`には、複数サービスをまとめて定義するCompose相当の構成ファイルがありません。

複数サービスの一括起動と停止

Docker Composeでは、プロジェクト全体を一括で操作できます。

docker compose up
docker compose down
docker compose stop
docker compose start
docker compose restart
docker compose ps

`wslc`では、基本的にコンテナを個別に起動、停止、削除する必要があります。

サービス間ネットワーク

Docker Composeでは、同じプロジェクト内のサービス同士がサービス名で通信できます。

web → mysql:3306
web → redis:6379

Composeは、プロジェクト用ネットワークの作成、コンテナの接続、サービス名による名前解決、ネットワークの削除を自動で処理します。

`wslc`には、Compose相当のプロジェクト単位ネットワーク管理がありません。

依存関係と起動順制御

Docker Composeでは、`depends_on`を使ってサービスの依存関係を定義できます。

services:
  web:
    depends_on:
      mysql:
        condition: service_healthy

MySQLのヘルスチェックが成功してからWebを起動する、といった制御ができます。

`wslc`では、起動順や待機処理を別途実装する必要があります。

プロジェクト単位のライフサイクル管理

Docker Composeは、個別コンテナではなく、アプリケーションプロジェクト全体をひとつの単位として管理します。

docker compose up
docker compose logs
docker compose stop
docker compose down

`wslc`は、基本的に個別コンテナを対象に操作します。

複数サービスのログ集約

Docker Composeでは、複数サービスのログをまとめて確認できます。

docker compose logs -f
docker compose logs -f web worker

`wslc`では、コンテナごとにログを取得する必要があります。

設定ファイルのマージ

Docker Composeでは、複数のComposeファイルを組み合わせられます。

docker compose \
  -f compose.yml \
  -f compose.dev.yml \
  up

開発環境、CI環境、デバッグ環境などの差分を管理できます。

`wslc`には、この構成ファイルのマージ機能がありません。

Profiles

Docker Composeでは、必要なサービスだけを有効化できます。

services:
  mailpit:
    profiles:
      - debug
docker compose --profile debug up

`wslc`には、サービスグループを切り替えるProfiles相当の仕組みがありません。

名前付きボリューム管理

Docker Composeでは、名前付きボリュームを宣言的に管理できます。

volumes:
  mysql-data:

services:
  mysql:
    volumes:
      - mysql-data:/var/lib/mysql

Composeは、ボリュームの作成、接続、プロジェクトとの関連付けを管理します。

`wslc`では、ボリュームを個別に指定して管理する必要があります。

Compose Watch

Docker Composeには、ファイル変更に応じてコンテナへの同期、再起動、再ビルドを行う機能があります。

docker compose watch

`wslc`には、Compose Watch相当の開発支援機能がありません。

サービスのスケール

Docker Composeでは、同じサービスを複数コンテナ起動できます。

docker compose up --scale worker=3

`wslc`でも名前を変えて複数回起動することはできますが、サービス単位の宣言や一括管理は自分で実装する必要があります。

構成の検証と正規化

Docker Composeでは、最終的に適用される構成を確認できます。

docker compose config

環境変数の展開、複数ファイルのマージ、YAMLの検証などを行えます。

`wslc`にはCompose形式の構成モデルがないため、この機能もありません。

dipにあってwslcにないもの

開発コマンドへの短い名前付け

dipでは、プロジェクトで頻繁に使うコマンドに短い名前を付けられます。

interaction:
  rails:
    service: web
    command: bundle exec rails

  rspec:
    service: web
    command: bundle exec rspec

利用者は、コンテナの名前や実行方法を意識せずにコマンドを実行できます。

dip rails db:migrate
dip rspec spec/models/user_spec.rb

`wslc`だけを使う場合は、対象コンテナや実行コマンドを明示する必要があります。

wslc exec web bundle exec rails db:migrate
wslc exec web bundle exec rspec spec/models/user_spec.rb

runとexecの使い分けの隠蔽

コンテナ内でコマンドを実行するときには、状況によって次の違いがあります。

既存コンテナで実行する
一時コンテナを起動する
実行後にコンテナを削除する
TTYを有効にする
標準入力を接続する
対象サービスを選択する

dipは、これらの違いを設定ファイル側に隠蔽します。

利用者は、毎回`run`や`exec`の違いを意識する必要がありません。

`wslc`には、この開発者向け抽象化がありません。

引数の透過的な受け渡し

dipでは、指定された追加引数をそのままコンテナ内のコマンドへ渡せます。

dip rails generate model User

内部では、次のようなコマンドに変換されます。

docker compose run --rm web \
  bundle exec rails generate model User

`wslc`でもラッパーを作れば実現できますが、標準では提供されません。

Provisioning

dipでは、開発環境の初期構築手順をひとつのコマンドにまとめられます。

dip provision

Provisioningには、次のような処理を含められます。

コンテナイメージのビルド
依存パッケージのインストール
データベースの作成
データベースマイグレーション
初期データの投入
フロントエンド依存関係のインストール

新しい開発者は、次のような少数のコマンドだけで開発を開始できます。

git clone ...
dip provision
dip up

`wslc`には、プロジェクト固有の初期構築フローを管理する機能がありません。

プロジェクト固有CLI

dipでは、プロジェクト専用のコマンドセットを定義できます。

dip rails
dip rake
dip rspec
dip rubocop
dip bundle
dip yarn
dip psql
dip redis-cli

Dockerやコンテナに詳しくない開発者でも、通常のローカルコマンドに近い感覚で操作できます。

`wslc`には、プロジェクト固有のCLIを定義する仕組みがありません。

共通オプションの隠蔽

Docker Composeを直接使う場合、毎回多数のオプションが必要になることがあります。

docker compose \
  --project-name slidict \
  -f compose.yml \
  -f compose.dev.yml \
  run --rm web \
  bundle exec rails db:migrate

dipでは、プロジェクト名、Composeファイル、サービス名、実行オプションなどを設定ファイルへまとめられます。

利用者は短いコマンドだけを実行します。

dip rails db:migrate

`wslc`には、この共通設定をプロジェクト単位で隠蔽する仕組みがありません。

ホストコマンドとコンテナコマンドの統一

dipでは、コマンドごとに実行場所を切り替えられます。

コンテナ内で実行する
ホスト環境で実行する
Docker Composeの操作として実行する

利用者から見ると、すべて同じ形式で操作できます。

dip <command>

`wslc`はコンテナ操作CLIであり、ホストコマンドとコンテナコマンドを統一する機能はありません。

シェル統合

dipでは、通常のシェルコマンドをコンテナ内のコマンドへ転送するような構成を作れます。

bundle install
rails console
rspec

見た目はローカルコマンドでも、実際にはコンテナ内で実行する運用が可能です。

`wslc`には、このシェル統合機能がありません。

機能比較

| 機能 | wslc | Docker Compose | dip |
| ------------------ | ---: | -------------: | ---------: |
| イメージのビルド | 対応 | 対応 | Compose経由 |
| イメージの取得 | 対応 | 対応 | Compose経由 |
| 単体コンテナの実行 | 対応 | 対応 | Compose経由 |
| 単体コンテナへのexec | 対応 | 対応 | Compose経由 |
| 複数サービスの一括起動 | 非対応 | 対応 | 対応 |
| 宣言的なサービス定義 | 非対応 | 対応 | Composeを利用 |
| サービス依存関係 | 非対応 | 対応 | Composeを利用 |
| ネットワーク自動構築 | 個別操作 | 対応 | Composeを利用 |
| 名前付きボリューム管理 | 個別操作 | 対応 | Composeを利用 |
| プロジェクト単位のupとdown | 非対応 | 対応 | 対応 |
| 複数サービスのログ集約 | 非対応 | 対応 | 対応 |
| Profiles | 非対応 | 対応 | Composeを利用 |
| 設定ファイルのマージ | 非対応 | 対応 | Composeを利用 |
| Watch | 非対応 | 対応 | Composeを利用 |
| 開発コマンドの短縮 | 非対応 | 非対応 | 対応 |
| RailsやRSpecの専用CLI化 | 非対応 | 非対応 | 対応 |
| Provisioning | 非対応 | 非対応 | 対応 |
| runとexecの隠蔽 | 非対応 | 非対応 | 対応 |
| ホストとコンテナの実行統一 | 非対応 | 非対応 | 対応 |

wslc向け開発ツールで補う範囲

wslc向けの開発ツールを作る場合、機能は大きくふたつの層に分かれます。

wslc
↓
Docker Compose相当の層
↓
dip相当の層

Docker Compose相当の層には、次の機能が含まれます。

複数サービス定義
サービス間ネットワーク
ボリューム管理
依存関係
起動順制御
up
down
logs
ps

dip相当の層には、次の機能が含まれます。

rails
rspec
bundle
rake
rubocop
provision
プロジェクト固有コマンド
runとexecの隠蔽
共通オプションの隠蔽

最初からDocker Compose互換を目指すと、実装範囲が非常に大きくなります。

現実的なMVPは、Docker Compose全体を再実装するのではなく、wslc上にdip相当の開発コマンド層を構築することです。

services:
  web:
    image: slidict/docker-rails
    workdir: /app
    volumes:
      - .:/app

commands:
  rails:
    service: web
    command: bundle exec rails

  rspec:
    service: web
    command: bundle exec rspec

利用者は、次のように操作します。

wip up
wip rails db:migrate
wip rspec
wip down

内部では、複数の`wslc run`、wslc exec、`wslc stop`などを組み合わせて実行します。

この範囲であれば、Docker Compose完全互換ではなく、WSL Containers向けの開発ワークフローCLIとして明確な価値を持たせられます。

wslcでもdip みたいに触りたい

wip (https://github.com/slidict/wip/) が出来上がりました。
皆さん使ってみてね

WSL Containerをdip / docker compose みたいに使える wipコマンドを作ったのサムネイル(1ページ目)
1 / 9