revm dockerd 启动一个内置容器运行环境。它在 guest 内运行 Podman 服务,并在 host 上提供一个 Docker-compatible API socket,因此可以用 Docker CLI 或 Podman CLI 连接。
revm dockerd --id <session-id> [flags]启动容器 session:
revm dockerd --id dev --podman-api /tmp/revm-dev.sock在另一个终端使用 Docker CLI:
export DOCKER_HOST=unix:///tmp/revm-dev.sock
docker run --rm hello-world使用 Podman CLI:
export CONTAINER_HOST=unix:///tmp/revm-dev.sock
podman run --rm alpine uname -a--podman-api 指定 host 上暴露的 Unix socket:
revm dockerd --id team --podman-api /tmp/revm-team.sock不指定时,默认路径在 session 目录内:
~/.cache/revm/<session-id>/socks/podman-api.sock
这个 socket 由 host 侧代理转发到 guest 内 Podman API。上层工具只需要连接这个 socket,不需要知道 VM 内部细节。
挂载项目目录:
revm dockerd --id app \
--podman-api /tmp/revm-app.sock \
--mount "$PWD:/workspace"构建镜像:
export DOCKER_HOST=unix:///tmp/revm-app.sock
docker build -t app /workspace
docker run --rm app挂载格式:
--mount /host/path:/guest/path[,ro]
不指定 --container-disk 时,revm 使用 session 内默认容器存储盘。
指定持久化存储盘:
revm dockerd --id dev \
--podman-api /tmp/revm-dev.sock \
--container-disk ~/.cache/revm/container-storage.ext4格式:
--container-disk <path>[,version=<string>]
如果文件不存在,revm 会创建它。如果磁盘保存的版本缺失或与 version 不一致,revm 会重新创建该磁盘。适合把容器存储当成可重建缓存管理。
容器自己的端口发布继续使用 Docker 或 Podman CLI:
export DOCKER_HOST=unix:///tmp/revm-dev.sock
docker run --rm -p 8080:80 nginx
curl http://127.0.0.1:8080guest agent 会配置 Podman machine marker,使容器 start/stop 时调用 gvproxy 的 expose/unexpose API。
如果要手动暴露 guest 内的任意服务端口,使用 revm ctl:
revm ctl --id dev --list-port
revm ctl --id dev --port-export 127.0.0.1:8081:8081
revm ctl --id dev --port-unexport 127.0.0.1:8081--list-port 会展示 SSH、容器发布端口和手动暴露端口。
资源配置:
revm dockerd --id dev \
--cpus 4 \
--memory 4096 \
--podman-api /tmp/revm-dev.sock复用 macOS 系统代理:
revm dockerd --id dev --system-proxy --podman-api /tmp/revm-dev.sock指定日志:
revm dockerd --id dev \
--log-level debug \
--log-to /tmp/revm-dockerd.log \
--podman-api /tmp/revm-dev.sock默认日志路径:
~/.cache/revm/<session-id>/logs/revm.log
连接到运行中的容器 session:
revm attach --id dev --pty
revm attach --id dev -- sh -c 'podman ps'导出管理 API socket:
revm dockerd --id dev \
--manage-api /tmp/revm-dev-vmctl.sock \
--podman-api /tmp/revm-dev.sockrevm attach 通过管理 API 获取 SSH 信息并连接 guest。revm ctl 通过管理 API 获取 gvproxy endpoint 并执行控制面更新。