macOSにPodmanを導入する

触ってみたかったので導入して動作するところまでやってみます。

# podmanってなに？

Podman(Pod Manager)とは、docker互換のコンテナエンジンです。コマンドがdockerと置き換わるだけでほぼ同じように利用することができます。
名前のとおりPodを管理するのでKubernetesのyamlなどもそのまま使える。
とはいえ、podmanはpodman、dockerはdocker、kubernetesはkubernetesというツールとしてみるのがよいかも。

今回はmacos上で利用できるようにしてみます。

## 準備

macはまだアップグレードしていないので、M1ではなくてIntelのBig Sur(11.6)になります。

```
$ brew install podman
```

同時にQEMUもインストールされています。

```
$ podman -v
podman version 3.4.0
```

VMのダウンロード

```
$ podman machine init
Downloading VM image: fedora-coreos-34.20211004.2.0-qemu.x86_64.qcow2.xz
```

Fedora CoreOSは、CoreOSが手掛けていたコンテナ向けOSをRed Hatが買収し、Fedoraと統合して登場したOSです。

cpu、メモリ等のサイズを変更するにはオプションを指定することもできます。

```
$ podman machine init --cpus 2 --memory 2048 --disk-size 30
```

podman起動

```
$ podman machine start
```

podman起動確認

```
$ podman machine ls
NAME                     VM TYPE     CREATED        LAST UP            CPUS        MEMORY      DISK SIZE
podman-machine-default*  qemu        5 minutes ago  Currently running  1           2.147GB     10.74GB
```

VMなのでsshすることもできます。

```
$ podman machine ssh
[core@localhost ~]$
```



## 試す

簡単なコンテナを実行してみます。

```
$ podman run -it -p 8080:80 nginx:alpine
```

chromeで`http://localhost:8080`にアクセス

```
Welcome to nginx!
...
```

自動でポートフォワードされているのでそのままブラウザでアクセスできました。

もし以下のようなエラーが発生した場合、

```
Error: failed to parse "X-Registry-Auth" header for...
```

~/.docker/config.jsonの

```
"auths" : {
    "https://index.docker.io/v1/" : { }
```

を

```
"auths" : {
    "index.docker.io/v1/" : { }
```

と書き換えます。

```
$ podman run -it --rm hello-world

Hello from Docker!
...
```

普通に動作できていますね。

コマンドを`alias docker=podman`のようにして、もともとのdockerコマンドを置き換えても大丈夫のようです。

## docker-composeを試す

docker-composeは内部でdockerを使っているのでコマンドのエイリアスとDOCKER_HOSTを設定すればそのままいけそう。
podman-composeというツールがあるのですが、そちらは利用しません。

```
$ podman system connection list
Name                         Identity                                      URI
podman-machine-default*      /Users/develop/.ssh/podman-machine-default  ssh://core@localhost:65228/run/user/1000/podman/podman.sock
podman-machine-default-root  /Users/develop/.ssh/podman-machine-default  ssh://root@localhost:65228/run/podman/podman.sock
```

```
# linuxなら
$ export DOCKER_HOST=unix:/run/podman/podman.sock

# macosなら
$ export DOCKER_HOST=ssh://root@localhost:65228/run/podman/podman.sock
```

sshの部分は.ssh/configに記述してexportしてもよさそう。

```
$vi .ssh/config
Host podman
  HostName localhost
  Port 65228
  User core
  IdentityFile /Users/develop/.ssh/podman-machine-default

$ export DOCKER_HOST=ssh://podman
```


## pod機能を試す

```
$ podman pod create -p 8080:80 --name sample-pod
$ podman run -d --pod sample-pod -e POSTGRES_PASSWORD=mysecretpassword postgres
$ podman run -d --pod sample-pod nginx

$ podman pod ps
POD ID        NAME        STATUS      CREATED        INFRA ID      # OF CONTAINERS
1991381b0088  sample-pod  Running     8 minutes ago  1c3c2bffa37c  3

$ podman ps --pod
CONTAINER ID  IMAGE                              COMMAND               CREATED             STATUS                 PORTS                 NAMES                  POD ID        PODNAME
1c3c2bffa37c  k8s.gcr.io/pause:3.5                                     9 minutes ago       Up About a minute ago  0.0.0.0:8080->80/tcp  1991381b0088-infra     1991381b0088  sample-pod
e370977bd0c0  docker.io/library/postgres:latest  postgres              About a minute ago  Up About a minute ago  0.0.0.0:8080->80/tcp  compassionate_leavitt  1991381b0088  sample-pod
e4e48dba870e  docker.io/library/nginx:alpine     nginx -g daemon o...  About a minute ago  Up About a minute ago  0.0.0.0:8080->80/tcp  lucid_jemison          1991381b0088  sample-pod

# 構成をYAMLに出力
$ podman generate kube sample-pod > sample-pod.yaml

# podの停止
$ podman pod stop sample-pod

# podの起動
$ podman pod start sample-pod

# podの削除
$ podman pod rm sample-pod

# kubeのyamlから作成・起動
$ podman play kube sample-pod.yaml
```

ひととおり動作できています。

## 最後に

手元のすべての開発環境を入れ替えるには少し時間がかかりそうな気がしています。

もともとdocker for macのvolume周りの問題があって代替となりそうな環境を探していたのですが、QEMUのVM上とVagrantでdockerするのもそれほど変わらないので、docker for macが重いよ〜という方は試してみてもいいかなと思います。

ちなみに導入難易度はVagrantにdockerを導入するほうが楽です。