【podman machine】macOS上でPodmanを実行する新コマンドの紹介

Red Hatでソリューションアーキテクトをしている田中司恩(@tnk4on)です。 今回はmacOS上でPodmanの実行を可能にするpodman machineをご紹介します。

Podmanについては本ブログで以前から多く記事が書かれています。podmanというキーワードで検索して他の記事も是非参照ください。

Podmanの使用方法についてはRHEL 8のドキュメントにも日本語で詳細に解説があります。日本語で読めるリファレンスドキュメントですので、Podmanを使用する際のドキュメントとして活用ください。

-目次-


podman machine とは

PodmanはLinux上での動作を基本とし、Windows版/macOS版はリモートクライアントのみが提供されています。これはつまり、WindowsおよびmacOS上でPodmanを使ってコンテナの各種操作を行うにはリモート接続先となるLinux環境が必須ということです。Podmanリモートクライアントの詳細な解説については下記記事を参照ください。

www.redhat.com

昨今Windows環境ではWindows Subsystem for Linux(以下、WSL)がOS標準機能として使えるようになり、Windows OS上でLinux環境を実行することが容易になっています。実際にWSL2上のLinux環境でPodmanを動かす事例も公開されています。

www.redhat.com

macOSではWSLのようなOS標準で提供されるLinux実行環境はありません*1Hypervisor.frameworkVirtualization.frameworkといったmacOS上で使えるAPIは提供されていますがLinux仮想マシンを実行する機能は別途必要です。

例えばDocker for MacではHyperkitというハイパーバイザー上でDocker用のLinux仮想マシンを実行しています。

Podmanでも同様のアプローチでmacOS上でLinux仮想マシンを実行する機能がpodman machineです。podman machineではQEMUを使って仮想マシンを実行します。 podman machineは2021年4月のPodman Community Meetingで動作デモがAshley Cuiによって行われました。Community Meetingのログと録画は下記リンクから参照できます。

この時のデモではうまくいかない部分もありましたが、すでにM1 Mac上で動作しており後述するFedora CoreOSの仮想マシンを使った基本的な機能は整っていたことが分かります。 その後、Podman v3.2.0のリリースでpodman machineという新しいサブコマンドとして使えるようになりました。

Podman v3.2.0のリリースノートより抜粋

An experimental new set of commands, podman machine, was added to assist in managing virtual machines containing a Podman server. These are intended for easing the use of Podman on OS X by handling the creation of a Linux VM for running Podman.

(翻訳)Podmanサーバーを含む仮想マシンの管理を支援する実験的な新しいコマンドセット「podman machine」が追加されました。これらは、Podmanを実行するためのLinux VMの作成を処理することで、OS X上でのPodmanの使用を容易にすることを目的としています。

podman machineの全体構成は下記のようになります(Podman v3.3.x以降対応)。

podman machineの全体概要
podman machineの全体概要

非推奨のOSSプロジェクト、boot2podman(podman-machine)

podman machineがリリースされる以前にもmacOS上でPodmanコマンドを使えるようにする試みがありました。それがboot2podman(podman-machine)です。過去形で記載したのはboot2podmanはすでに終了したプロジェクトであり非推奨になっているからです。boot2podmanに関しては下記サイトに一連のポストとして詳細がまとめられています。

2020年11月のPodman Community Meetingでは作者のAnders F Björklundによりプレゼンがあり、コンテナの歴史からboot2podmanのベースになったTiny Core Linuxについて、非推奨になった理由(Podman v2からVarlink APIからREST APIへ変更)などについて解説されています。Comunity Meetingの録画やプレゼン資料のリンクは下記から。

[※ 注意 ※] boot2podmanはpodman-machineという名前のコマンド(ハイフンあり)でした。Podmanの新しいサブコマンドのpodman machineとはハイフンあり無しの違いしかないですが全くの別物となります。ご注意ください。

podman machineとは別物のboot2podman(podman-machine)は非推奨
podman machineとは別物のboot2podman(podman-machine)は非推奨

podman machine のインストールと実行コマンド

macOSへのPodmanのインストールとpodman machineの実行方法について解説します。以降はIntel版のmacOS(Big Sur 11.5.2)上での動作になります。

Podman for macOSのインストール

macOSへのPodmanのインストールはbrewを使うのが簡単でおすすめです*2

brewでPodmanをインストール

$ brew install podman
  • Podmanのインストールの依存関係でQEMUも同時にインストールされます

Podmanの依存関係パッケージ(qemu)の確認

$ brew deps --1 podman
qemu

Podman v3.3.0以降、Podmanコマンドと同時にgvproxyコマンドもインストールされます(gvproxyについては後述)。それぞれのコマンドは下記にインストールされます。

$ which podman gvproxy
/usr/local/bin/podman
/usr/local/bin/gvproxy

[Note:] Podmanの新しいバージョンがリリースされた直後はすぐにbrewで更新ができない場合があります。そうした場合はbrew unlinkコマンドを実行することでパッケージをアンインストールすることなく一時的にbrew版のPodmanの使用を停止できます。その後、GitHubのリリースページより入手したパッケージをコピーして使用することできます。元に戻す場合はbrew linkを実行します。

$ brew unlink podman
Unlinking /usr/local/Cellar/podman/3.3.1... 165 symlinks removed.
$ cp ./podman /usr/local/bin/
$ which podman
/usr/local/bin/podman
  • ※ 現時点(2021年9月6日、時点)ではmacOS用リリースアーカイブにはgvproxyは含まれていませんので、別途下記より入手して実行パスへコピーしてください

podman machineの実行

podman machinの実行は下記の手順で行います。

  1. podman machineの初期セットアップ
  2. podman machineの起動
  3. podmanコマンドの実行

なお、環境によってはPodmanコマンドの初回実行時に通信の許可を求めるポップアップが表示されます。Allowを押してPodmanコマンドによる通信を許可します。

Podmanコマンド初回実行時に通信の許可を求めるポップアップ
Podmanコマンド初回実行時に通信の許可を求めるポップアップ

1. podman machineの初期セットアップ

podman machine initコマンドを使用して初期セットアップを行います。この作業の中でpodman machinで実行するFedora CoreOSの仮想マシンイメージ(qcow2)がダウンロードされます。

$ podman machine init
Downloading VM image: fedora-coreos-34.20210821.1.1-qemu.x86_64.qcow2.xz: done
Extracting compressed file
  • イメージのダウンロードは初回のみ行われ、二回目以降のセットアップはダウンロード済みイメージから行われます
  • Fedora CoreOSは定期的にアップデートが行われており、初期セットアップの実行タイミングによっては新しいイメージのダウンロードが行われます

ダウンロード済みのイメージは下記に保存されています。*.qcow2.xzがダウンロードしたアーカイブで*.qcow2が展開された実行用の仮想マシンイメージです。

$ ls -l ~/.local/share/containers/podman/machine/qemu/
total 4327440
-rw-r--r--  1 shtanaka  staff   630260008  9  6 04:59 fedora-coreos-34.20210821.1.1-qemu.x86_64.qcow2.xz
-rw-------  1 shtanaka  staff  1561722880  9  6 05:00 podman-machine-default_fedora-coreos-34.20210821.1.1-qemu.x86_64.qcow2

2. podman machineの起動

podman machineの起動はpodman machine startを実行します。

$ podman machine start
INFO[0000] waiting for clients...
INFO[0000] listening tcp://0.0.0.0:7777
INFO[0000] new connection from  to /var/folders/df/vy1htn753fd_w4420rltfg0w0000gn/T/podman/qemu_podman-machine-default.sock
Waiting for VM ...
qemu-system-x86_64: warning: host doesn't support requested feature: CPUID.80000001H:ECX.svm [bit 2]

podman machineが正常に起動しているか確認します。

$ podman machine ls
NAME                    VM TYPE     CREATED            LAST UP
podman-machine-default  qemu        About an hour ago  Currently running
  • Currently runningとなっていればOKです。

なお、podman machineを停止する場合はpodman mahcine stopを実行します。

$ podman machine stop
$ podman machine ls
NAME                    VM TYPE     CREATED            LAST UP
podman-machine-default  qemu        About an hour ago  About a minute ago
  • 停止したpodman machineを再開する場合はpodman machine startを再度実行します

3. podmanコマンドの実行

busyboxコンテナイメージを使った「hello world!」の実行

$ podman run --rm -it docker.io/library/busybox echo -e '\n hello world!'
Trying to pull docker.io/library/busybox:latest...
Getting image source signatures
Copying blob sha256:8ec32b265e94aafb0d43ab71f1d8f786122c19afb37d25532aea169f414f8881
Copying blob sha256:8ec32b265e94aafb0d43ab71f1d8f786122c19afb37d25532aea169f414f8881
Copying config sha256:42b97d3c2ae95232263a04324aaf656dc80e7792dee6629a9eff276cdfb806c0
Writing manifest to image destination
Storing signatures

 hello world!

このようにmacOS上であたかもローカルでPodmanコマンドを実行しているかのようにコンテナの実行ができます。

自動ポートフォワード

Podman v3.3.0からgvpoxyを使った自動ポートフォワード機能が追加されました。

Podman v3.3.0のリリースノートより抜粋

Containers inside VMs created by podman machine will now automatically handle port forwarding - containers in podman machine VMs that publish ports via --publish or --publish-all will have these ports not just forwarded on the VM, but also on the host system.

(翻訳)podman machine で作成された VM 内のコンテナは、ポートフォワーディングを自動的に処理するようになりました。--publish または --publish-all でポートを公開した podman machine VM 内のコンテナは、これらのポートが VM 上だけでなく、ホストシステム上にも転送されます。

Podman v3.2.xではコンテナで公開したポートごとに手動でポートフォワードを追加する必要がありましたが、v3.3.0以降はgvproxyを使用して自動で行われるようになってより便利になりました。このため、v3.3.0以降でpodman machineを実行するにはmacOSホストの実行パスにgvproxyコマンドが必要となります*3

macOSホスト上に自動的にポートフォワードが行われることをテストしてみます。

$ podman pull docker.io/library/nginx
$ podman run --rm -d --name nginx -p 8888:80 --network bridge nginx
$ curl http://localhost:8888 |head -n 4
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   612  100   612    0     0  76500      0 --:--:-- --:--:-- --:--:-- 76500
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
$ netstat -an |grep 8888
tcp46      0      0  *.8888                 *.*                    LISTEN

このようにTCP:8888で公開したnginxコンテナにローカルホストのmacOS上からcurlでアクセスできました。また、netstatコマンドで待ち受けポートを確認すると、TCP:8888でリッスンしていることが確認できます。

[Note:] Podman v3.3.1時点でこの機能には不具合があり、上記のように--network bridgeをつけるか、他にも事前にpodman network createで作成したネットワークを指定する方法やcontainers.confファイルの[containers]セクションにrootless_networking = "cni"を追加する、などのワークアラウンドがあります。 この不具合については私の上げた下記Issue(すでにClose済み)で対応がなされており、次のバージョン(v3.3.2?)に修正が適用される見込みです。

podman machineの今後

podman machineはリリースされて間もないため下記のような点で機能が整っていない部分もあります。

  • M1 Mac上での実行
  • ボリュームマウントの改善
  • macOS版VS Code上でのRemote Containers実行

現時点(2021年9月6日、時点)ではM1 Macで実行するためにはQEMUにパッチを当てる必要があります。QEMUのアップストリームでパッチがマージされるまでは手動で適用するなどの回避策が必要です。問題については下記Issueで対応が続いています。

macOS上のディレクトリをコンテナにマウントしたり、VS CodeのRemote Containersを起動したりすることは今のところできませんが、これらの機能についてもコミュニティ上で議論が続いており今後の機能改善が期待されます。

まとめ

macOS上で簡単に仮想マシンを立ち上げてPodmanコマンドを実行できるサブコマンドのpodman machineについてご紹介しました。 macOSではOS標準で使えるLinux環境が無いためこれまではPodmanの使用は非常に限られた方法しかありませんでしたが、Podmanの標準機能のpodman machineを使うことでmacOS上で簡単にPodmanコマンドが使用できるようになりました。 しかしながらpodman machine自体もまだまだ発展途上で実用的に使うにはまだまだ不足している機能は多くあります。でも、そこはOSS。開発途中のバージョンを入手して実行したり、フィードバックをコミュニティに直接送って改善に寄与することができます。これを機にOSS活動に興味を持たれましたら是非様々な手段でPodmanの開発コミュニティに参加してみてください。

*1:Limaのような先進的なOSSプロジェクトは別途ありますがAppleから提供されるOS標準機能は今のところありません

*2:GitHubのリリースページからバイナリをダウンロードしてインストールも可。その場合はアップデートなども手動で行う必要あり

*3:gvproxyが無い場合はエラーとなってpodman machineが起動しない

* 各記事は著者の見解によるものでありその所属組織を代表する公式なものではありません。その内容については非公式見解を含みます。