macOS の podman で docker-compose する

## 概要
podman 4.1 系から docker-compose v2 がサポートされたとのことで、それを簡単に検証した

※ podman 4.7 系から公式にサブコマンドとして podman compose が入りました

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

* nginx を起動して画面を見るというシンプルな確認をする
* podman + docker-compose で macOS で編集したものを、そのまま表示してみる
* podman machine は 4系から QEMU の volume マウントをサポートしているので、 docker-compose の container から macOS のディレクトリをマウントしてみる
* podman は、4.1系から docker-compose v2 がサポートされたので動かしてみる

https://podman.io/releases/2022/05/09/podman-release-v4.1.0.html

https://podman.io/releases/2022/02/22/podman-release-v4.0.0.html

## 検証した環境
```bash
$ sw_vers
ProductName:	macOS
ProductVersion:	12.4
BuildVersion:	21F79

$ podman version
Client:       Podman Engine
Version:      4.1.1
API Version:  4.1.1
Go Version:   go1.18.3
Built:        Wed Jun 15 05:12:46 2022
OS/Arch:      darwin/amd64

Server:       Podman Engine
Version:      4.1.0
API Version:  4.1.0
Go Version:   go1.18
Built:        Sat May  7 01:15:54 2022
OS/Arch:      linux/amd64
```

### docker-compose も事前に入れておく
brew でインストールできる docker-compose は 2系になってるのでそれを使う
```
$ docker-compose -v
Docker Compose version 2.6.0

$ ls -al /usr/local/bin/docker-compose
lrwxr-xr-x 1 tigerroll 49  6 18 09:58 /usr/local/bin/docker-compose -> ../Cellar/docker-compose/2.6.0/bin/docker-compose
```

## podman の導入

導入方法は以前書いた以下記事を参照ください :pray:

https://qiita.com/tigerroll/items/b511d7e2812b690df4c2

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

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

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

1 directory, 3 files
```

## podman + docker-compose のディレクトリマウント構成

* macOS のディレクトリを QEMU インスタンスに Shared ディレクトリとしてマウントさせる
	`macOS` --> `/mnt/qemu` 
* QEMU のディレクトリを container 側がマウントして macOS のディレクトリを参照する
	`/mnt/qemu` --> `/usr/share/nginx/html` 
* ディレクトリのマウントの関係は以下の様になる
	`macOS` --> `/mnt/qemu` --> `/usr/share/nginx/html`

## QEMU インスタンスをセットアップする

ディレクトリをマウントするために `-v`  オプションを使う
`/Host側のパス:/Guest側のパス` で表現するで、適宜使いやすい様に試して頂ければ良いだろう

```bash
$ cd /path/to/macOS
$ podman machine init --cpus 2 --memory 8192 -v .:/mnt/qemu
```

※ 4.1.1 から `DOCKR_HOST` のセットは不要になった模様
```bash
API forwarding listening on: /var/run/docker.sock
Docker API clients default to this address. You do not need to set DOCKER_HOST.
```

#### rootrul モードに切り替えるコマンド
コンテナ に `80` や `443` を割り当てたい場合は　rootful モードに切り替えをすれば割当可能
```bash:rootful モードに切り替える場合のみ利用する
$ podman machine set --rootful
```

```bash:podman machine の起動
$ podman machine start
Starting machine "podman-machine-default"
Waiting for VM ...
Mounting volume... .:/mnt/qemu

This machine is currently configured in rootless mode. If your containers
require root permissions (e.g. ports < 1024), or if you run into compatibility
issues with non-podman clients, you can switch using the following command:

	podman machine set --rootful

API forwarding listening on: /var/run/docker.sock
Docker API clients default to this address. You do not need to set DOCKER_HOST.

Machine "podman-machine-default" started successfully
```

## docker-compose で container を起動する

#### docker-compose の設定ファイルを用意する
* nginx のコンテンツが編集できることを確認するので、volume をバインドマウントする
* hostPort[8080] を LISTEN させて、転送先の containerPort[80] を指定する
* docker-compose v2 からファイル名は compose.yaml となる

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

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

##### [注意]
* 環境変数に `DOCKER_BUILDKIT=1` がセットされていると Build が失敗する（ `0` をセットすることで回避可能)
* 未設定であれば影響はない

```bash
$ docker-compose up -d
[+] Running 1/8
 ⠿ web Pulled                                        15.3s
   ⠇ 75a963e94de0 Download complete                   6.8s
   ⠇ 42c077c10790 Download complete                   6.8s
   ⠇ 915cc9bd79c2 Download complete                   6.8s
   ⠇ 62c70f376f6a Download complete                   6.8s
   ⠇ db24d06d5af4 Download complete                   6.8s
   ⠇ 7b1fab684d70 Download complete                   6.8s
   ⠋ 0e901e68141f Download complete                   0.0s
[+] Running 2/2
 ⠿ Network kind_default  Cr...                        0.0s
 ⠿ Container kind-web-1  St...                        0.6s
```

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

```bash
$ lsof -n -P -iTCP -sTCP:LISTEN
gvproxy  28718 tigeroll   42u  IPv6 0x96d0cbd1403ddf67      0t0  TCP *:8080 (LISTEN)
```

以上で docker-compose の起動は完了


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

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

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

上手く表示させることができた :star2: 

<img width="512" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/214973/29fe9f67-e157-ecff-228d-acedbad6c738.png">

## podman + docker-compose で macOS のディレクトリをマウントした感想

* QEMU のディレクトリマウントが必要だが、macOS 側で編集したものを表示出来た :smile:
* rootful モードなら 80, 443 で LISTEN 可能なのでブラウザからのポート指定は不要になり便利 :rocket:  
* docker-compose が普通に使えるので、macOS で podman + docker-compose を使ったアプリケーション開発はできると思います :thumbsup: 
* 脱 Docker :whale: を求めてる人には、とても相性が良いと思う