在 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 がサポートされたので動かしてみる
验证的环境 de
$ 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选项来挂载目录,用/主机路径:/客户路径来表示,并根据需要进行适当的调整。
$ 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模式即可进行分配。
$ podman machine set --rootful
$ 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 启动容器。
准备一个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 端口处于监听状态。
$ 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 を求めてる人には、とても相性が良いと思う