MacでDockerの代わりにpodmanを使ってみた

MacでのDocker Desktopは有料化とかそもそもシステム上の問題でファイル同期のパフォーマンスが悪い（っていうざっくりした理解）ので使っていなかったのですが、代替になるものを試していなかったので[podman](https://podman.io/)を使ってみようと思います。

# Dockerをアンインストール

podmanをDockerの代替にするのでDockerを削除します。
Docker Desktopを開くと右上に表示される虫のアイコンをクリックします。
一番下に｢Uninstall｣が表示されるのでクリックします。
完了したらDocker Desktopを終了して、アプリケーションフォルダからdocker.appを削除します。

# podmanをインストール

## Podman Desktopでpodmanをインストール（しちゃった）

[Podman Desktop 0.8.0](https://podman-desktop.io/)を使って簡単にインストールできるのかなと思って試しました。
なのでHomebrewとかは使っていないです。
dmgファイルからアプリケーションをインストールして、実行するとpodmanがインストールされてないよと表示されるので画面上からクリックでインストールするとしばらく待たされました。
が、画面表示がいつまでも変わらないので「おやおや」と思ってPodman Desktopを再起動すると次のような画面に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2835840/a93a345c-708d-665f-a6ea-2b9b4b72103c.png)
インストールされたpodmanはバージョンが4.2.1でした。
で、ここで「initialize Podman」をクリックしてもいいのですが、結局これ後々設定が足りなくてやり直しが発生します。
そんなことが起こるとはつゆ知らずポチッとしました。
これは何をしてるかというと、コンテナを動かすための仮想マシンを作成するようです。中身はFedoraみたいですね。

ターミナルからpodmanのバージョンを確認しておきます。

```zsh
$ podman -v
podman version 4.2.1
```

エラーになる場合はsourceコマンドとかでパスの設定を反映する必要があるかもしれません。

## dockerコマンドにシンボリックリンクを作成

podmanをdockerコマンドのシンボリックリンクに設定します。

```zsh
$ sudo ln -s `which podman` /usr/local/bin/docker
```

## docker-compose

docker-composeを使いたかったので、Docker Desktopからではなくcurlでインストールします。
[リリースノート](https://github.com/docker/compose/releases)のAssetsから自分の環境にあったもののリンクをコピーしてインストールします。

```zsh
% sudo curl -L https://github.com/docker/compose/releases/download/v2.10.2/docker-compose-darwin-x86_64  -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 27.4M  100 27.4M    0     0  4901k      0  0:00:05  0:00:05 --:--:-- 6304k

% docker-compose -v
Docker Compose version v2.10.2
```

最新はv2.11.2なのに色々失敗した結果v2.10.2になってましたがv2.11.2で大丈夫だと思います。

# docker-compose

## docker-compose upでcredentialsエラー

docker-composeをcurlでインストール後、既成のコンテナ(nginxとか)で適当に`compose.yml`を作成してupしようとするとcredentialsを取得しようとしてエラーになりました。
Docker Desktopをインストールしてないからcredentialsが無いってことみたい。

```zsh
% docker-compose up -d
[+] Running 0/0
 ⠋ web Pulling                                                                                                     0.0s
error getting credentials - err: exec: "docker-credential-desktop": executable file not found in $PATH, out: ``

```

homeディレクトリの`.docker/config.json`から`credsStore`を削除すればいいと書いてあったので削除したら動きました。

https://forums.docker.com/t/docker-credential-desktop-exe-executable-file-not-found-in-path-using-wsl2/100225/17

## docker-composeにDockerfile追加

Node.jsのプロジェクトのDockerfileを作成してcompose.ymlに追加しました。

```zsh
% docker-compose build
[+] Building 0.0s (0/0)                                                                                                            
listing workers for Build: failed to list workers: Unavailable: connection error: desc = "transport: Error while dialing unable to upgrade to h2c, received 404"
```

buildしてみたらエラーが出たので環境変数を設定しました。

```zsh
% echo $DOCKER_BUILDKIT

% export DOCKER_BUILDKIT=0
```

https://github.com/containers/podman/issues/13889

設定を反映後、build, upするとコンテナが起動しました。

# 検証というほどでもない感想

## パフォーマンス

コンテナではNode.jsでfrourioを開発用にdevで起動､ DBとしてPostgreSQLを動かしてみました。
アクティビティモニター上でqemuのプロセスがCPUの使用率50〜200%辺りでした。
コードを修正して反映する場合もあまり変化は見られず。
dockerを使ってたときと変わったかと言われると微妙な気はします。
ちなみにfrourioだけをローカルで動作させた場合は起動直後のマイグレーションでqemuが130%ほどの使用率でしたが、その他のプロセスはほとんどが10％以下でした。
podmanの時はディスクアクセスで負荷がかかっていると判断できそうな気がします。（frourioのdevで3つのプロセスがwatchしているので）
が、podman自体は充分代替になりそうです。まぁdocker-composeで起動しただけですが。
VSCodeでコードを編集しても特に反映されるのにラグも無かったですし、Dockerのときも同じような負荷の具合だったので軽くはなってないですが。

## Podman Desktop

こちらはまだ機能的には不充分だし、急にCPU使用率が300%を越えたりしていたのでグラフィカルに状況を確認したい時に使う程度にとどめていた方がよさそうです。
machineの起動とかは1clickでできますがその程度かなあと思いました。