Zenn
🛥️

Podman DesktopとWSL2上のPodmanを同期したい

に公開

本記事は、某企業アドベントカレンダー2024の24日目の記事です。
クリスマスイブですね。メリークリスマス!🎅
有馬記念で8000円失いましたが、自分へのクリスマスプレゼントに熱いレースの観戦チケットを8000円で購入したと思えば痛くありません。
痛くなんて...痛くなんてないんだからね!!ないん..だからね...。

さて、本題に入ります。
Docker Desktopの代替としてPodman DesktopをWindows環境へ導入にするあたり、普段開発で用いているWSL2上のPodmanとPodman Desktopを同期したいと思いました。途中詰まったところもありましたが、同期される環境を無事作成できたので備忘録を残します。

Podman知ってますか?

Podmanは、コンテナ管理のためのデーモンレス・ツールで、ルート権限なしで実行できる安全なコンテナランタイムです。Dockerと互換性があり、docker コマンドを podman に置き換えるだけで既存のDockerfileやコンテナイメージが利用可能です。しかも、商用無料です。
小学校時代は、流行りのDSではなく、PSP。
中学校時代は、流行りのiPod touchではなく、ウォークマンzシリーズ。
現在のスマートフォンは、iPhoneではなく、Galaxy Z flip。
タブレットも、iPadではなく、Galaxy Tab。
そんな逆張りオタクの私にとって、触手が伸びないわけがありませんね。
Dockerではなく、Podmanの時代です。
最近のRed Hatのブログで、メリットがわかりやすく紹介されていました。
https://www.redhat.com/ja/blog/5-reasons-choose-podman-2025

この記事を読む上での表記の注意

  • WSL2: podman-machineではない通常のWSL2環境(Ubuntu 22.04.5 LTS)
  • podman-machine: Podman Desktop導入時に作成される Linux仮想マシン環境

環境情報

  • Windows 11
  • WSL2 Ubuntu 22.04.5 LTS
  • Podman Desktop 1.15.0
  • Podman 5.3.1 (Podman Desktopのインストールと同時に、WindowsにインストールするPodnan)
  • Podman 4.7.0 (開発などで用いているWSL2へインストールするPodman)

セットアップ手順

Windows側の操作

  1. Podman Desktopのインストール
    公式サイト(https://podman-desktop.io)からインストーラーをダウンロード。
    インストーラーの手順に従ってインストールする。基本的にデフォルトでOK。

  2. Powershell上で、podman-machineの初期化と起動

    PS C:\Users\xxxxx> podman machine init
    PS C:\Users\xxxxx> podman machine start
    

インストールや初期設定の丁寧な解説は、本記事の対象外とします。
もし、情報が不足している場合は、以下のサイトなどを参考にしてみてください。
Podman Desktopインストール手順<Windows向け>

WSL2側の操作

Podman v4.7.0のアップデート情報

Podmanのv4.7.0以降からWindows上で共有ソケットバインディングが登録されるようになっている。
https://github.com/containers/podman/releases/tag/v4.7.0

WSL: Registers shared socket bindings on Windows, to allow other WSL distributions easy remote access

  1. Podman v4.7.0以降のインストール
    # 今回はv4.7.0を導入する
    $ wget https://github.com/containers/podman/releases/download/v4.7.0/podman-remote-static-linux_amd64.tar.gz 
    $ tar -xvf podman-remote-static-linux_amd64.tar.gz
    $ mv bin/podman-remote-static-linux_amd64 podman
    $ sudo mv podman /usr/local/bin/
    $ sudo chmod +x /usr/local/bin/podman
    
  2. バージョン確認
    $ podman --version    ✔ ╱ 12:54:33                                              
     podman version 4.7.0
    
  3. sockの確認
    $ ls /mnt/wsl/podman-sockets/podman-machine-default/       ✔ ╱ 12:54:10
    podman-root.sock  podman-user.sock
    
sockが存在しない場合(Windows PowershellでPodman Machineの再作成)
PS C:\Users\xxxxx> podman machne rm podman-machine-default
PS C:\Users\xxxxx> podman machine init
PS C:\Users\xxxxx> podman machine start
  1. 環境変数として、Podmanクライアントにソケットのパスを渡す。(~bash または~./zshrc へ追記)
    # Bash
    $ echo 'export CONTAINER_HOST=unix:///mnt/wsl/podman-sockets/podman-machine-default/podman-user.sock' >> ~/.bashrc
    $ source ~/.bashrc 
    
    # zsh
    $ echo 'export CONTAINER_HOST=unix:///mnt/wsl/podman-sockets/podman-machine-default/podman-user.sock' >> ~/.zshrc
    $ source ~/.zshrc
    

Podman Desktopへの同期の確認

WSL2からpodman-machineへの接続の確認 (sockが表示されていることを確認する)

``` bash
$ podman system connection list                                 ✔ ╱ 12:56:23
Name        URI                                       Identity    Default
default     unix:///run/user/1000/podman/podman.sock              true
```

各レジストリサービスによるコンテナの実行テスト

接続確認が完了したら、WSL2でコンテナの実行テストを行います。
以下の実行例のように、コンテナの実行が成功し、Podman Desktopにも同期されていれば成功です!

podman run --rm quay.io/podman/hello (quay.ioよりイメージの取得)
$ podman -r run quay.io/podman/hello                                                       ✔ ╱  ╱ 12:28:01
Trying to pull quay.io/podman/hello:latest...
Getting image source signatures
Copying blob sha256:81df7ff16254ed9756e27c8de9ceb02a9568228fccadbf080f41cc5eb5118a44
Copying config sha256:5dd467fce50b56951185da365b5feee75409968cbab5767b9b59e325fb2ecbc0
Writing manifest to image destination
!... Hello Podman World ...!

         .--"--.
       / -     - \
      / (O)   (O) \
   ~~~| -=(,Y,)=- |
    .---. /  \   |~~
 ~/  o  o \~~~~.----. ~~
  | =(X)= |~  / (O (O) \
   ~~~~~~~  ~| =(Y_)=-  |
  ~~~~    ~~~|   U      |~~

Project:   https://github.com/containers/podman
Website:   https://podman.io
Desktop:   https://podman-desktop.io
Documents: https://docs.podman.io
YouTube:   https://youtube.com/@Podman
X/Twitter: @Podman_io
Mastodon:  @Podman_io@fosstodon.org

Podman Desktopにも同期されていることを確認

podman run --rm docker.io/hello-world (docker.ioよりイメージの取得)
$ podman run --rm docker.io/hello-world                                                   ✔ ╱ 10s ╱ 13:14:10
Trying to pull docker.io/library/hello-world:latest...
Getting image source signatures
Copying blob sha256:c1ec31eb59444d78df06a974d155e597c894ab4cda84f08294145e845394988e
Copying config sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a
Writing manifest to image destination

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Podman Desktopにも同期されていることを確認

WSL2とpodman-machineの同期における注意点

WSL2のファイルシステムへのアクセスについて
こちらの同期を完了した上でWSL2側でpodmanコマンドを実行した場合、podmanコマンドは内部的にpodman-machine内で実行されるため、コマンドを叩いているWSL2のファイルシステムに直接アクセスできません。

例えば、下記のコマンドのように、WSL側に存在している$(pwd)をコンテナの/tmpにマウントしようとした場合、no such file or directoryエラーが起きます。

$ podman run --init --rm -v $(pwd):/tmp -p 8080:80 docker.io/nginx:latest nginx -c "/tmp/nginx.conf"
Error: statfs /home/xxxxx/example: no such file or directory
個人的な対応方法(他の対応方法があればコメントお願いします。)
  • scpでpodman-machineへファイルを転送した後、podman runを行う。
    現在は、「scpでpodman-machineへファイル移動→podman run」のShellスクリプトを組み実行する運用をしている。

  • また、podman-machineはデフォルトでscpが導入されていないため、podman-machineへopenssh-clientsのインストールが必要。

    # podman-machie上で実行
    $ sudo dnf install -y openssh-clients
    
  • scpに必要となるpodman-machineのipアドレス、ポート番号確認方法

    # Powershellで実行
    podman system connection list
    

おまけ

今回の環境構築作業で起きた障害の対応です。参考になれば幸いです。

Podman DesktopのGUI上でpodman-machineを削除した際に起きた不具合

エラー内容

Podman DesktopのGUIからpodman-machineの削除後、再びpodman-machineを構築しようとした場合に、以下の矛盾したエラーが起きました。

S C:\Users\xxxxx> podman machine init
Error: vm "podman-machine-default" already exists on hypervisor
PS C:\Users\xxxxx> podman machine start
Error: podman-machine-default: VM does not existPS C:\Users\ochiai.s> podman machine init
Error: vm "podman-machine-default" already exists on hypervisor
  • podman machine init コマンドで「VM が既に存在している」と表示されている。

  • 一方で、podman machine start コマンドでは「VM が存在しない」と矛盾したメッセージが表示されている。

解決方法

Powershellで、wslから削除したpodman-machineを登録解除します。

wsl --unregister [podman-machine名]

参考サイト

https://podman.io/docs
https://podman-desktop.io/docs/intro

Discussion

ログインするとコメントできます