Podman Desktop(Windows)のコンテナを docker コマンドで操作する
Docker Desktop の代替として Podman Desktop を利用する際、docker
コマンドではなく podman
コマンドを使ってコンテナ等を操作しなければなりません。
しかし、コンテナを扱うガイドは docker
コマンドを前提としたものがほとんどで、docker
コマンドを都度 podman
コマンドに読み替える必要があるのは少し面倒です。
本記事では Podman Desktop を docker
コマンドで操作できるようにする方法を紹介します。
docker cli のインストール
最新の docker cli を以下のページからダウンロードします。
※ 以下のリンクは Windows (x64) 向けです
zip ファイルを解凍し docker.exe
を podman
コマンドが存在する C:\Program Files\RedHat\Podman\
配下に配置します。dockerd.exe
は不要です。
楽をするため Podman Desktop インストール時点でパスが通っている C:\Program Files\RedHat\Podman\
を利用しました。他のフォルダに docker.exe
を配置してパスを通す方法でも問題ありません。
docker compose のセットアップ
docker compose
コマンドを使えるようにします。
まずは、Settings > Resources から Compose の Setup を押下し、ウィザードに従ってインストールします。
Compose をセットアップしただけではまだ docker
の compose
サブコマンドは使えません。docker
コマンドが docker-compose.exe
を Docker CLI Plugin として認識する必要があります。
Docker CLI Plugin については以下の記事が詳しいです。
docker-compose.exe
を %USERPROFILE%\.docker\cli-plugins
に配置することで Docker CLI Plugin として認識されます。しかし、docker-compose.exe
のバージョンアップなどは Podman Desktop に任せたいため、実体を配置するのではなく docker-compose.exe
へのシンボリックリンクを配置するようにします。
管理者権限で PowerShell を起動し、以下のコマンドを実行します。
# cli-plugins フォルダの作成
New-Item -Path "$Env:USERPROFILE\.docker\cli-plugins" -ItemType Directory -Force
# cli-plugins 配下へのシンボリックリンクの作成(管理者権限が必要)
New-Item -ItemType SymbolicLink -Path "$Env:USERPROFILE\.docker\cli-plugins\docker-compose.exe" -Target "$Env:LOCALAPPDATA\Microsoft\WindowsApps\docker-compose.exe"
これで docker compose
コマンドが使えるようになります。
❯ docker compose version
Docker Compose version v2.29.0
BUILD_KIT の無効化
Docker の BuildKit のイメージビルド方式と、WSL のネットワークの相性が悪いらしく、docker compose のイメージビルドが途中で固まってしまうことがあります。
筆者の環境では dev container を docker compose で起動すると必ず起きていました。
関連する issue: Running docker compose leads to docker socket unvailable and WSL stuck · Issue #20379 · containers/podman
以下の環境変数を設定して BuildKit を無効化することで、この問題を回避します。
DOCKER_BUILDKIT=0
ちなみに、docker compose
に相当する podman compose
は docker-compose.exe
のラッパーとして機能しますが、docker-compose.exe
を呼び出すときに暗黙のうちに DOCKER_BUILDKIT=0
が設定されるようになっています。
参考にした記事
以下の記事を参考にさせて頂きました。
Discussion