在 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。

成功地显示出来

image.png

在使用podman + docker-compose挂载macOS目录的体验中,我的感受是…

    • QEMU のディレクトリマウントが必要だが、macOS 側で編集したものを表示出来た

rootful モードなら 80, 443 で LISTEN 可能なのでブラウザからのポート指定は不要になり便利

docker-compose が普通に使えるので、macOS で podman + docker-compose を使ったアプリケーション開発はできると思います

脱 Docker を求めてる人には、とても相性が良いと思う

广告
将在 10 秒后关闭
bannerAds