Red Hatでソリューションアーキテクトをしている田中司恩(@tnk4on)です。 今回はmacOS上でPodmanの実行を可能にするpodman machineをご紹介します。
Podmanについては本ブログで以前から多く記事が書かれています。podman
というキーワードで検索して他の記事も是非参照ください。
Podmanの使用方法についてはRHEL 8のドキュメントにも日本語で詳細に解説があります。日本語で読めるリファレンスドキュメントですので、Podmanを使用する際のドキュメントとして活用ください。
-目次-
- podman machine とは
- 非推奨のOSSプロジェクト、boot2podman(podman-machine)
- podman machine のインストールと実行コマンド
- podman machineの実行
- 自動ポートフォワード
- podman machineの今後
- まとめ
podman machine とは
PodmanはLinux上での動作を基本とし、Windows版/macOS版はリモートクライアントのみが提供されています。これはつまり、WindowsおよびmacOS上でPodmanを使ってコンテナの各種操作を行うにはリモート接続先となるLinux環境が必須ということです。Podmanリモートクライアントの詳細な解説については下記記事を参照ください。
昨今Windows環境ではWindows Subsystem for Linux(以下、WSL)がOS標準機能として使えるようになり、Windows OS上でLinux環境を実行することが容易になっています。実際にWSL2上のLinux環境でPodmanを動かす事例も公開されています。
macOSではWSLのようなOS標準で提供されるLinux実行環境はありません*1。Hypervisor.frameworkやVirtualization.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以降対応)。
非推奨の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 のインストールと実行コマンド
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
の実行は下記の手順で行います。
podman machine
の初期セットアップpodman machine
の起動podman
コマンドの実行
なお、環境によってはPodmanコマンドの初回実行時に通信の許可を求めるポップアップが表示されます。Allow
を押して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]
- v3.3.1時点では
podman machine start
最終行にwarningが表示されますが、これについては無視しても問題ありません。詳細は下記Issueを参照。
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を起動したりすることは今のところできませんが、これらの機能についてもコミュニティ上で議論が続いており今後の機能改善が期待されます。
- Support native source folder for volume mount in remote model · Issue #8016 · containers/podman
- On macOS Remote-Container (Visual Studio Code) doesn't work · Issue #11436 · containers/podman
まとめ
macOS上で簡単に仮想マシンを立ち上げてPodmanコマンドを実行できるサブコマンドのpodman machine
についてご紹介しました。
macOSではOS標準で使えるLinux環境が無いためこれまではPodmanの使用は非常に限られた方法しかありませんでしたが、Podmanの標準機能のpodman machine
を使うことでmacOS上で簡単にPodmanコマンドが使用できるようになりました。
しかしながらpodman machine
自体もまだまだ発展途上で実用的に使うにはまだまだ不足している機能は多くあります。でも、そこはOSS。開発途中のバージョンを入手して実行したり、フィードバックをコミュニティに直接送って改善に寄与することができます。これを機にOSS活動に興味を持たれましたら是非様々な手段でPodmanの開発コミュニティに参加してみてください。