macOS の Podman は applehv で起動する

## 概要

podman5.0 系から公式に applehv がサポートされたので検証した。
applehv は、macOS 独自の軽量なハイパーバイザーとした VM 基盤

https://github.com/containers/podman/releases/tag/v5.0.0

## 以下のことを確認する

- nginx を起動して画面を見るというシンプルな確認をする。
- podman compose で macOS で編集したものを表示してみる。

## 結論

* セットアップするだけで本当に applehv で起動される。

## 検証した環境

```
❯ sw_vers
ProductName:            macOS
ProductVersion:         14.4
BuildVersion:           23G214

❯ podman version
Client:       Podman Engine
Version:      5.0.0
API Version:  5.0.0
Go Version:   go1.22.1
Git Commit:   e71ec6f1d94d2d97fb3afe08aae0d8adaf8bddf0
Built:        Thu Mar 19 18:47:46 2024
OS/Arch:      darwin/arm64

Server:       Podman Engine
Version:      5.0.0-dev-8a643c243
API Version:  5.0.0-dev-8a643c243
Go Version:   go1.21.8
Built:        Mon Mar 18 09:00:00 2024
OS/Arch:      linux/arm64
```

## podman / podman-desktop の導入

```
❯ brew install podman

❯ brew install podman-desktop
※ mac の Launchpad をみると追加されてるのが確認できる
```

#### podman のバージョン確認

```
❯ podman --version
podman version 5.0.0
```

#### podman の依存関係パッケージの確認

```
❯ brew deps --1 podman
※ 依存がなくなった。

❯ brew deps --1 podman-desktop
※ 依存がなくなった。
```

`podman-mac-helper` 導入で compose でいい感じにディレクトリをマウントできる様になる。

```shell
❯ sudo /opt/homebrew/opt/podman/bin/podman-mac-helper install
```

### docker-compose も事前に入れておく

podman compose と言いつつ実態は external compose provider の指定によるものなので相変わらず `docker-compose` が必要。
しかし、ここは将来的に他の compose provider を指定できる様になるのかもしれない（期待）
brew でインストールできる docker-compose は 2系になってるのでそれを使う。
```shell
❯ docker-compose -v
Docker Compose version 2.25.0

❯ type docker-compose
docker-compose is /opt/homebrew/bin/docker-compose
```

## podman machine にて VMインスタンスをセットアップ

- `podman machine init` コマンドを使用して初期セットアップを行う。
- 実行すると Fedora CoreOS の仮想マシン RAW イメージ(applehv)がダウンロードされる。
- `--cpus` や `--memory` `--disk-size` は任意のサイズを割り当て可能。
- `-v /Users:/Users` で Mac のディレクトリを Bind Mount しやすくなる。
- `podman machine set --rootful` で特権 port を利用することができる。
- `podman machine ssh rpm-ostree -y install buildah` で buildah をインストールできる。

```bash
❯ podman machine init \
  --cpus 2 \
  --memory 8192 \
  -v /Users:/Users && \
  podman machine set --rootful && \
  podman machine start && \
  podman machine ssh rpm-ostree -y install buildah && \
  podman machine stop && \
  podman machine start
```

## 検証用ディレクトリの構成

※ ファイルについては後述する。

```bash
$ tree $(pwd)
/path/to/macOS
├── compose.yaml
└── html
    └── index.html

1 directory, 3 files
```

## compose サブコマンドで container を起動する

#### compose の設定ファイルを用意する

- nginx のコンテンツが編集できることを確認するので、volume をバインドマウントする。
- rootful なので hostPort[80] を LISTEN させて、転送先の containerPort[80] を指定する。

```bash
❯ cat <<'EOF'> compose.yaml
services:
  web:
    image: nginx:latest
    ports:
      - 80:80
    volumes:
      - type: bind
        source: ./html
        target: /usr/share/nginx/html
EOF
```

#### podman compose でコンテナを起動する

Executing external compose provider が呼び出されて compose が起動される。

```bash
❯ podman compose up -d
>>>> Executing external compose provider "/opt/homebrew/bin/docker-compose". Please refer to the documentation for details. <<<<

[+] Running 9/8
 ✔ web 8 layers [⣿⣿⣿⣿⣿⣿⣿⣿]      0B/0B      Pulled                              
   ✔ 59f5764b1f6d Download complete          10.0s                               
   ✔ 059f9f6918db Download complete          5.7s                               
   ✔ e75b854d63f1 Download complete          0.0s                               
   ✔ 2df415630b2f Download complete          0.0s                               
   ✔ f7bd43626fa7 Download complete          0.0s                               
   ✔ df91ff398a83 Download complete          3.8s                               
   ✔ 4d88df8a13cd Download complete          0.0s                               
   ✔ 070027a3cbe0 Download complete          0.0s                               
[+] Running 1/1
 ⣿ Network projects_default Created          0.0s
 ✔ Container projects-web-1 Started          0.3s
```

hostPort で指定した Port が LISTEN 状態になっていることが確認できる。

```bash
❯ lsof -n -P -iTCP -sTCP:LISTEN|grep :80
gvproxy    1510 tigerroll   22u  IPv6 0xf917929b32ae7165      0t0  TCP *:80 (LISTEN)
```

以上で compose の起動は完了

## nginx で読み込む index.html を準備する

```bash
cat <<'EOF'> html/index.html
<h1>Hello Podman bind mount contents !</h1>
EOF
```

## nginx にブラウザで接続してみる

上手く表示させることができた! :star2: 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214973/26d6a350-c506-11f7-ced0-21266956e232.png)

## VM に ssh ログインしてみる
せっかく applehv の環境に VM を起動したので SSH で中にはいってみる。
Users ディレクトリがマウントされてる。
```bash
❯ podman machine ssh
Connecting to vm podman-machine-default. To close connecting, use `~.` or `exit` Fedora CoreOS 39.20240309.2.0
Tracker: https://github.com/coreos/federoa-coreos-tracker
Discuss: https://discussion.fedoraproject.org/tag/coreos

Last login: Thu Mar 21 21:39:42 2024 from 192.168.127.1
root@localhost:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/vda4       100G  3.3G   97G   4% /sysroot
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs           3.9G  200K  3.9G   1% /dev/shm
efivarfs         56K  1.2K   56K   3% /sys/firware/efi/efivars
tmpfs           1.6G  8.6M  1.6G   1% /run
tmpfs           3.9G     0  3.9G   0% /tmp
Users           461G  108G  354G  24% /Users
/dev/vda3       350M  127M  201M  39% /boot
tmpfs           792M   12K  792M   1% /run/user/502
tmpfs           792M  4.0K  792M   1% /run/user/0
root@localhot:~#
```

## Compose を停止する
※ VM からは抜けてる前提
```bash
❯ podman compose stop
>>>> Executing external compose provider "/opt/homebrew/bin/docker-compose". Please refer to the documentation for details. <<<<

[+] Stopping 1/1
 ✔ Container podman-web-1  Stopped       0.2s    
```

## Compose を削除する

```bash
❯ podman compose rm
>>>> Executing external compose provider "/opt/homebrew/bin/docker-compose". Please refer to the documentation for details. <<<<

? Going to remove podman-web-1 Yes
[+] Removing 1/0
 ✔ Container podman-web-1  Removed    
```

## VM の停止

```bash
❯ podman macihne stop
Machine "podman-machine-default" stopped successfully
```

停止されてることが確認できる
```bash
❯ podman machine ls
NAME                    VM TYPE     CREATED         LAST UP         CPUS       MEMORY      DISK SIZE
podman-machine-default  applehv     10 minutes ago  11 seconds ago  2            8GiB        100GiB
```


## VM の削除
```bash
❯ podman machine rm
The following files will be deleted:


/Users/tigerroll/.config/containers/podman/machine/applehv/podman-macihne-default.json
/var/folders/db/rb1m1bcn4nz68wlzdp_hf0800000gp/T/podman/podman-machine-default.sock
/var/folders/db/rb1m1bcn4nz68wlzdp_hf0800000gp/T/podman/podman-machine-gvproxy.sock
/var/folders/db/rb1m1bcn4nz68wlzdp_hf0800000gp/T/podman/podman-machine-default-api.sock
/var/folders/db/rb1m1bcn4nz68wlzdp_hf0800000gp/T/podman/podman-machine-default.log
Are you sure you want to continue? [y/N] y
```

削除されてることが確認できる
```bash
❯ podman machine ls
NAME        VM TYPE     CREATED    LAST UP      CPUS       MEMORY      DISK SIZE

```

## applehv で起動してみた感想

* VM が applehv に変わり、QEMU への依存無しで起動できるのが素晴らしい :wink:
* どこでも動く QEMU で統一していくのかと思っていたけど、そうじゃなかった。