仮想化通信

日本仮想化技術株式会社の公式エンジニアブログ

macOSでPodmanを動かす

Red Hat Forum APAC 2021でPodmanのセッションがあって、Podman machineを使うと、macOSのVM上でPodmanが利用できることを知りました。各セッションはオンデマンド視聴がまだサイトから可能です。

今年の9月時点ではM1 Macでは動かなかったようですが、現在利用できるバージョンでは動く模様です。 早速試してみようと思いました。

rheb.hatenablog.com

インストール

macOSに事前にHomebrewのセットアップをしておきます。 Homebrewのセットアップができたら、次にHomebrewを使ってPodmanをインストールします。

% brew install podman

インストールが終わったら一度シェルに入り直すか、端末を開き直して...

% zsh

Podmanの初期化を実行します。 Fedora CoreOSのQEMUイメージがダウンロードされて動くようです。

% podman machine init
Downloading VM image: fedora-coreos-35.20211029.2.0-qemu.aarch64.qcow2.xz: done
Extracting compressed file

初期化が終わったらリストを出してみます。

% podman machine list
NAME                     VM TYPE     CREATED         LAST UP         CPUS        MEMORY      DISK SIZE
podman-machine-default*  qemu        31 seconds ago  31 seconds ago  1           2.147GB     10.74GB

これでインストールは終わりです。

「Podman VM」を動かす

Linuxの場合はPodmanはネイティブに動作しますが、macOSやWindows環境ではリモートのLinuxマシンに接続して利用する方法かpodman machineコマンドで Fedora CoreOS VMを動かして、その環境でPodmanを動かす構成を取ります。今回の例は後者の方法です。

$ 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/mq/961qzxqx47931tnnpblf6wfr0000gn/T/podman/qemu_podman-machine-default.sock
Waiting for VM ...
Machine "podman-machine-default" started successfully

VMが起動したあとは、普通にpodmanコマンドでコンテナの作成、操作ができるようです。 このVMの実体はps aux|grep podmanを実行するとわかると思います。QEMUで動いていることがわかります。

「Podman VM」上のPodmanをmacOSから操作する

コンテナーを動かしてみます。

% podman run --rm -it busybox echo -e '\n hello world!'
Resolved "busybox" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull docker.io/library/busybox:latest...
Getting image source signatures
Copying blob sha256:00fa7918e1c4a657af04fed3a8121dd47630905832e9de65088d577ca325a6de
Copying blob sha256:00fa7918e1c4a657af04fed3a8121dd47630905832e9de65088d577ca325a6de
Copying config sha256:55d288799e596cdb89f7933104b2092b95680dc34c094a06571ea5a8001e2391
Writing manifest to image destination
Storing signatures
 hello world!

busyboxイメージがダウンロードされて、「hello world!」と表示されました。コンテナーの実行は問題なかったようです。

次に、NGINX Webサーバーを起動してみます。アクセスするためにポート指定をしています。これはDockerと同じような感じです。

% podman run --name=cont1 -d -p 8080:80 -it nginx:alpine
% podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS            PORTS                 NAMES
152d5095790e  docker.io/library/nginx:alpine  nginx -g daemon o...  8 seconds ago  Up 8 seconds ago  0.0.0.0:8080->80/tcp  cont1
% curl http://127.0.0.1:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...

Podmanでイメージのビルド

Podmanでイメージビルドを試してみます。 ディレクトリーを作って、その中にDockerfileindex.htmlを作成しておきます。

% cat Dockerfile
FROM docker.io/nginx:alpine
ADD index.html /usr/share/nginx/html/

% cat index.html
Welcome to My site!

イメージを作成してみます。

% podman build --compress -t mynginx:latest -f Dockerfile .
STEP 1/2: FROM docker.io/nginx:alpine
STEP 2/2: ADD index.html /usr/share/nginx/html/
COMMIT mynginx:latest
--> b723b34aa0a
Successfully tagged localhost/mynginx:latest
b723b34aa0ae391de87177d5525d8b9d909e13673f3d7431684e9276a542b114

作成したイメージでコンテナーを起動してみます。

% podman run --name=cont1 -d -p 8080:80 -it mynginx:latest

コンテナーアプリケーションにアクセスしてみます。

% curl http://127.0.0.1:8080
Welcome to My site!

Podmanのイメージビルドも、ネイティブでPodmanを動かしている時と同じように利用できることがわかりました。 かなり大きいイメージのビルドはおそらくネイティブで実行した方が良いでしょうが、一般的な用途であれば十分そうです。

Podmanコンテナーの削除と終了

コンテナーを削除します。

% podman stop cont1 && podman rm cont1

Podman machineを停止する場合は

% podman machine stop

Podman machineを再開する場合は

% podman machine start

Podman machineを削除する場合は

% podman machine rm
...
Are you sure you want to continue? [y/N]
(yを入力で消去)

podman machine rmを実行したあとは、podman machine initの再実行が必要のようです。

まとめ

というわけで、Docker Desktopとほぼ同等のことが「Podman machine」の利用でできるようになりました。 Intel CPU版のMacでも、Apple Silicon版のMacでも利用できたので安心です。 必要になったらpodman machine startを実行して、いらなくなったら停止するなり削除するなりで利用できるので、 Docker Desktopから乗り換えても良いかなと思いました。

ちなみにRed Hat Forum 2021でPodmanのセッションの情報によると、Podman Desktopのようなプロダクトを考えているようです。これも楽しみですね。