
Lima 中的 Podman 使用指南Rootless 与 Rootful 两种模式完整上手【免费下载链接】limaLinux virtual machines, with a focus on running containers项目地址: https://gitcode.com/GitHub_Trending/lim/lima导读本文基于 Lima 官方示例文档website/content/en/docs/examples/containers/podman/_index.md展开讲解如何在 Lima 创建的 Linux 虚拟机中运行 Podman 容器引擎并覆盖Rootless无根与Rootful有根两种部署模式的启动、配置与日常使用。读完本文你将掌握通过limactl start template:podman一键拉起 Podman 虚拟机、在 VM 内与宿主机上两种方式执行podman命令、用CONTAINER_HOST/DOCKER_HOST环境变量让宿主机直接管理 VM 内的容器以及两个官方模板底层的 provisioning 脚本与 socket 端口转发原理。Lima 的设计初衷就是在虚拟机中运行容器并自动提供文件系统共享与端口转发能力。虽然 Lima 最早是为 macOS 用户推广 containerd 而生的但当前版本同样支持其他容器引擎且不依赖 macOS 宿主机参见 containers 目录索引。Podman 模板正是用 Podman 替代 containerd 与 nerdctl的官方方案。一、两种模式总览Rootless 与 Rootful官方文档将 Podman 的使用分为两个标签页分别对应两个内置模板模式模板名称特点典型命令Rootlesstemplate:podman以普通用户身份运行容器Podman socket 位于用户目录下limactl start template:podmanRootfultemplate:podman-rootful以 root 身份运行容器Podman socket 位于系统目录/run/podmanlimactl start template:podman-rootful两个模板的完整源码分别位于 templates/podman.yaml 与 templates/podman-rootful.yaml二者均声明minimumLimaVersion: 2.0.0即要求 Lima 2.0.0 及以上版本才能解析。无论哪种模式都支持三种使用路径在 VM 内部直接执行podman命令在宿主机上通过CONTAINER_HOST环境变量 podman --remote连接 VM在宿主机上通过DOCKER_HOST环境变量让dockerCLI 直接操作 VM 内的 Podman 守护进程兼容 Docker CLI 习惯。下面依次给出两种模式的完整命令。二、Rootless 模式完整操作Rootless 模式是最常用的默认方案容器以非 root 用户身份运行安全性更好。2.1 启动实例limactl start template:podmantemplate:podman会创建一个名为podman的 Lima 实例。若想自定义实例名可改为limactl start template:podman --name my-podman2.2 在 VM 内使用 podmanlimactl shell podman podman run -d --name nginx -p 127.0.0.1:8080:80 docker.io/library/nginx:alpinelimactl shell会在 VM 内执行后续命令随后即可通过宿主机访问http://127.0.0.1:8080这是因为 Lima 默认把实例的全部回环端口自动转发到宿主机见 pkg/portfwd 的实现。2.3 在宿主机上使用 podman需 podman-remoteexport CONTAINER_HOST$(limactl list podman --format unix://{{.Dir}}/sock/podman.sock) podman --remote run -d --name nginx -p 127.0.0.1:8080:80 docker.io/library/nginx:alpine这里的核心机制是limactl list --format支持 Go 模板输出见 cmd/limactl/list.go{{.Dir}}是实例目录通常为$LIMA_HOME/podman而sock/podman.sock正是模板portForwards中定义的宿主机侧 socket 路径。CONTAINER_HOST指向该 socket 后podman --remote就会把请求转发进 VM。2.4 在宿主机上使用 docker CLI需 docker-cliexport DOCKER_HOST$(limactl list podman --format unix://{{.Dir}}/sock/podman.sock) docker run -d --name nginx -p 127.0.0.1:8080:80 docker.io/library/nginx:alpine由于 Podman 的 API 与 Docker API 兼容设置DOCKER_HOST后宿主机上已安装的docker命令可以直接管理 VM 内的容器无需在 VM 内再装 Docker。三、Rootful 模式完整操作Rootful 模式以 root 身份运行容器适用于需要特权能力如修改网络配置、使用 iptables 等的场景。3.1 启动实例limactl start template:podman-rootful实例名为podman-rootful。3.2 在 VM 内使用 podman注意命令前需要sudolimactl shell podman-rootful sudo podman run -d --name nginx -p 127.0.0.1:8080:80 docker.io/library/nginx:alpine3.3 在宿主机上使用 podman需 podman-remoteexport CONTAINER_HOST$(limactl list podman-rootful --format unix://{{.Dir}}/sock/podman.sock) podman --remote run -d --name nginx -p 127.0.0.1:8080:80 docker.io/library/nginx:alpine3.4 在宿主机上使用 docker CLI需 docker-cliexport DOCKER_HOST$(limactl list podman-rootful --format unix://{{.Dir}}/sock/podman.sock) docker run -d --name nginx -p 127.0.0.1:8080:80 docker.io/library/nginx:alpine四、模板源码拆解底层到底做了什么官方文档只给出命令而命令背后的自动化逻辑全部封装在两个模板中。理解模板有助于排查问题与自定义扩展。4.1 基础继承镜像与挂载两个模板都通过base机制继承两部分配置base: - template:_images/fedora - template:_default/mountstemplate:_images/fedora见 templates/_images/fedora.yaml提供 Fedora 云镜像当前为 Fedora 44覆盖x86_64、aarch64、riscv64三种架构并带 SHA-256 digest 校验template:_default/mounts见 templates/_default/mounts.yaml把宿主机家目录~只读挂载进 VM。base模板合并发生在实例创建时参见 pkg/limayaml/default.yaml 的说明合并后的完整 lima.yaml 会保存在实例目录中。4.2 关闭 Lima 自带的 containerdcontainerd: system: false user: falseLima 默认会为 Linux 客户机启用用户级rootlesscontainerd。本模板明确将其关闭因为 Podman 接管了容器运行时职责——这与 templates/docker.yaml 中containerd 由 Docker 管理故设为 false的做法一致。4.3 Provision 脚本安装 Podman 并启用 socketRootless 模板的 provision 部分provision: - mode: system script: | #!/bin/bash set -eux -o pipefail command -v podman /dev/null 21 test -e /etc/lima-podman exit 0 dnf -y install --best podman touch /etc/lima-podman - mode: user script: | #!/bin/bash set -eux -o pipefail systemctl --user enable --now podman.socket要点第一个mode: system脚本以 root 权限执行通过dnf安装podman包用/etc/lima-podman标记文件保证幂等性provision 脚本可能被多次执行如实例重启时参见 default.yaml 的说明第二个mode: user脚本以普通用户身份执行启用用户级 systemd 的podman.socket。Rootful 模板则不同provision: - mode: system script: | #!/bin/bash set -eux -o pipefail command -v podman /dev/null 21 test -e /etc/lima-podman exit 0 if [ ! -e /etc/systemd/system/podman.socket.d/override.conf ]; then mkdir -p /etc/systemd/system/podman.socket.d cat -EOF /etc/systemd/system/podman.socket.d/override.conf [Socket] SocketUser{{.User}} EOF fi if [ ! -e /etc/tmpfiles.d/podman.conf ]; then mkdir -p /etc/tmpfiles.d echo d /run/podman 0700 {{.User}} - /etc/tmpfiles.d/podman.conf fi dnf -y install --best podman touch /etc/lima-podman - mode: system script: | #!/bin/bash set -eux -o pipefail systemctl --system enable --now podman.socketRootful 模式的差异点通过override.conf把podman.socket的SocketUser设为 Lima 用户使非 root 用户也能访问系统级 socket通过 tmpfiles 规则在/run/podman权限 0700创建 socket 目录第二个脚本启用的是系统级--system的podman.socket而不是用户级。4.4 Probes就绪探针两个模板都带就绪探针等待podman命令可用probes: - script: | #!/bin/bash set -eux -o pipefail if ! timeout 30s bash -c until command -v podman /dev/null 21; do sleep 3; done; then echo 2 podman is not installed yet exit 1 fi hint: See /var/log/cloud-init-output.log in the guest若 30 秒内podman仍未安装成功实例会判定启动失败hint指向/var/log/cloud-init-output.log以便排查。4.5 端口转发把 guest socket 暴露给宿主机这是宿主机直接使用 podman/docker的关键。Rootless 模板portForwards: - guestSocket: /run/user/{{.UID}}/podman/podman.sock hostSocket: {{.Dir}}/sock/podman.sockRootful 模板portForwards: - guestSocket: /run/podman/podman.sock hostSocket: {{.Dir}}/sock/podman.sockguestSocketVM 内的 Podman 守护 socket 路径rootless 在用户运行时目录rootful 在/run/podmanhostSocket宿主机上的 socket 路径{{.Dir}}为实例目录统一放在sock/子目录下避免与 Lima 内部 socket 冲突此约定同样见 default.yaml 的注释。Lima 的端口转发器会在宿主机上创建对应的 Unix socket 监听器并把连接转发到 guest socket相关实现见 pkg/portfwd/listener.go 与prepareUnixSocket。这正是文档中CONTAINER_HOSTunix://{{.Dir}}/sock/podman.sock能生效的底层原因。4.6 启动提示消息模板末尾的message字段会在实例启动成功后显示一条快捷提示内容同样适用于手动配置podman --remotepodman system connection add lima-{{.Name}} unix://{{.Dir}}/sock/podman.sock podman system connection default lima-{{.Name}} podman{{if eq .HostOS linux}} --remote{{end}} run quay.io/podman/hello即除了用环境变量CONTAINER_HOST也可以借助podman system connection把该 socket 注册为持久化的连接lima-实例名之后免去每次导出环境变量的麻烦。五、常见使用场景与组合命令5.1 挂载家目录并运行交互容器模板继承的mounts会把宿主机家目录只读挂载进 VM因此可以直接在容器内访问宿主机文件limactl shell podman podman run -it -v $HOME:$HOME --rm docker.io/library/alpine这也是模板头部注释给出的示例见 templates/podman.yaml。注意模板把家目录挂载为只读见 mounts.yaml如需可写请通过$LIMA_HOME/_config/override.yaml或修改实例 lima.yaml 中的mounts[].writable。5.2 同时管理多个 Podman 实例由于每个实例的 socket 路径以{{.Dir}}实例目录区分可以同时启动多个实例并分别导出不同的CONTAINER_HOST/DOCKER_HOSTexport CONTAINER_HOST$(limactl list podman --format unix://{{.Dir}}/sock/podman.sock) export DOCKER_HOST$(limactl list podman-rootful --format unix://{{.Dir}}/sock/podman.sock)5.3 验证连通性实例启动完成后可以先做最小验证# 在 VM 内 limactl shell podman podman info # 在宿主机任选其一 podman --remote info docker info若连接失败优先检查实例目录下的 socket 是否存在ls $LIMA_HOME/podman/sock/VM 内 podman socket 是否监听limactl shell podman podman system service --time0需先systemctl --user start podman.socket安装日志limactl shell podman sudo tail -f /var/log/cloud-init-output.log。六、与其他容器模板的对比Lima 仓库中还提供了同类的容器引擎模板便于按需选择模板容器引擎基础镜像说明template:podmanPodmanrootlessFedora本文主角template:podman-rootfulPodmanrootfulFedora本文主角template:dockerDockerrootlessUbuntu LTS见 templates/docker.yamltemplate:docker-rootfulDockerrootfulUbuntu LTS见 templates/docker-rootful.yamlLima 默认template:default则使用 containerd nerdctl。Podman 方案的价值在于无需在宿主机安装任何守护进程仅靠 socket 转发即可让宿主机的podman/dockerCLI 无缝操作 VM 内容器兼顾隔离性与工具链兼容性。【免费下载链接】limaLinux virtual machines, with a focus on running containers项目地址: https://gitcode.com/GitHub_Trending/lim/lima创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考