概要
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 がサポートされたので動かしてみる
検証した環境
$ 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 の導入
導入方法は以前書いた以下記事を参照ください
検証用ディレクトリの構成
※ ファイルについては後述する
$ 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側のパス
で表現するで、適宜使いやすい様に試して頂ければ良いだろう
$ cd /path/to/macOS
$ podman machine init --cpus 2 --memory 8192 -v .:/mnt/qemu
※ 4.1.1 から DOCKR_HOST
のセットは不要になった模様
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 モードに切り替えをすれば割当可能
rootful モードに切り替える場合のみ利用する
$ podman machine set --rootful
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 となる
$ 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
をセットすることで回避可能) - 未設定であれば影響はない
$ 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 状態になっていることが確認できる
$ lsof -n -P -iTCP -sTCP:LISTEN
gvproxy 28718 tigeroll 42u IPv6 0x96d0cbd1403ddf67 0t0 TCP *:8080 (LISTEN)
以上で docker-compose の起動は完了
nginx で読み込む index.html を準備する
cat <<'EOF'> html/index.html
<h1>Hello Podman bind mount contents !</h1>
EOF
nginx にブラウザで接続してみる
上手く表示させることができた
podman + docker-compose で macOS のディレクトリをマウントした感想
- QEMU のディレクトリマウントが必要だが、macOS 側で編集したものを表示出来た
- rootful モードなら 80, 443 で LISTEN 可能なのでブラウザからのポート指定は不要になり便利
- docker-compose が普通に使えるので、macOS で podman + docker-compose を使ったアプリケーション開発はできると思います
- 脱 Docker を求めてる人には、とても相性が良いと思う