跳转到主内容

从另一个 WSL 发行版访问 Podman

在 Windows 上,Podman Desktop 会创建一个 Windows Subsystem for Linux (WSL) 虚拟机:即 Podman Machine。它还会配置 Windows Podman 客户端与 Podman Machine 通信。但是,它不会配置您的其他 WSL 发行版。

您可能正在运行其他 WSL 发行版,并希望从那里访问您的 Podman Desktop 容器。

本教程将重点介绍最常见的场景,引导您完成配置 WSL 发行版的步骤

  • Ubuntu Linux 发行版。
  • 默认的 Podman Machine。

在可折叠的详细信息中,您可以找到针对不太常见场景的替代步骤

  • 自定义 WSL 发行版。
  • 自定义 Podman Machine。

配置您的 WSL 发行版

  1. 在您的 WSL 发行版中启动一个会话

    > wsl --distribution your-distribution-name
  2. 要与远程 Podman Machine 通信,您需要一个 Podman 客户端。

    为了利用最新功能,例如 podman kube 子命令,请使用较新的 Podman 版本,而不是发行版中的 podman 软件包。

    Podman 客户端可通过完整的 podman 安装获得,或通过 podman-remote 4.x 及更高版本获得。在 Ubuntu 上,安装 podman-remote 通常更容易。

    使用 podman-remote 也会默认启用远程模式。

    请从 Podman 发布页面查看包含 podman-remote 二进制文件的最新版本。

    下载并解压二进制文件

    $ wget https://github.com/containers/podman/releases/download/v4.9.1/podman-remote-static-linux_amd64.tar.gz
    $ sudo tar -C /usr/local -xzf podman-remote-static-linux_amd64.tar.gz

    通过在 .bashrc 中添加以下内容,使其可作为 podman 执行

    $ export PATH="$PATH:/usr/local/bin"
    $ alias podman='podman-remote-static-linux_amd64'
  3. 配置您 WSL 发行版中的 Podman 客户端,以与 Podman Desktop 定义的远程 Podman machine 通信。

    这将确保您在所有不同环境中处理 Podman 时的一致性

    将默认的 Podman 系统连接设置为您的 Podman Machine(假设 Podman Desktop 配置为默认的、启用了 root 权限的 Podman Machine)

    $ podman system connection add --default podman-machine-default-root unix:///mnt/wsl/podman-sockets/podman-machine-default/podman-root.sock

    在自定义的 Podman Machine 上,远程 Podman Machine 的目标地址可能会有所不同。

    有两个参数可能会改变

    • 机器名称可能与 podman-machine-default 不同。
    • 当 Podman machine 禁用了 root 权限(rootless 模式)时,socket 名称会不同。

    查找您的 Podman Machine 名称和连接路径

    1. 识别您 WSL 发行版中可用的 socket。

    Podman machine 在一个名为 Podman machine 名称的 /mnt/wsl/podman-sockets/ 子目录中共享 socket。

    在您的 WSL 会话中,列出可用的 socket

    $ find /mnt/wsl/podman-sockets/ -name '*.sock'

    每个 Podman Machine 都有一个用于以下目的的 socket

    • Rootful Podman: podman-root.sock
    • Rootless Podman: podman-user.sock

    示例输出

    /mnt/wsl/podman-sockets/podman-machine-default/podman-root.sock
    /mnt/wsl/podman-sockets/podman-machine-default/podman-user.sock
    1. 识别 Podman Desktop 使用的 socket。

      Podman Desktop 默认为 rootful Podman。但是,建议识别活动的 socket。

      活动的 socket 是您 Windows 会话中的默认 Podman 系统连接。

      打开一个新的命令提示符,并列出您的 Podman 系统连接

      > podman system connection list

      默认连接行以 true 结尾。

      通过其在 Windows 中的 URI 识别您的 Podman Machine socket

      • Rootful Podman: ssh://root@127.0.0.1:59292/run/podman/podman.sock
      • Rootless Podman: ssh://user@127.0.0.1:59292/run/user/1000/podman/podman.sock

      示例输出

      Name                         URI                                                          Identity                                                  Default

      podman-machine-default ssh://user@127.0.0.1:59292/run/user/1000/podman/podman.sock C:\Users\Podman Desktop User\.ssh\podman-machine-default false
      podman-machine-default-root ssh://root@127.0.0.1:59292/run/podman/podman.sock C:\Users\Podman Desktop User\.ssh\podman-machine-default true
    2. 要定义 Podman machine 的远程目标,请在您 WSL 中可用的、并与 Podman Desktop 活动 socket 对应的 socket 路径前加上 unix://

      对于默认的 Podman machine

      • Rootful Podman: unix:///mnt/wsl/podman-sockets/podman-machine-default/podman-root.sock
      • Rootless Podman: unix:///mnt/wsl/podman-sockets/podman-machine-default/podman-user.sock
  4. 您的 WSL 发行版与 Podman Machine 之间的通信通道是一个特殊文件(一个 socket)。Podman Machine 创建此文件时带有特定的权限。为了从您的 WSL 发行版与 Podman Machine 通信,您的用户必须对该 socket 拥有写权限。

    要让您的用户访问远程 Podman machine:如有必要,创建用户组,分配组成员资格,然后退出您在 WSL 发行版上的会话以应用新的组成员资格

    $ sudo usermod --append --groups 10 $(whoami)
    $ exit

测试连接

验证在您的 WSL 发行版上,Podman CLI 是否能与您的 Podman machine 通信。

  1. 在您的 WSL 发行版中启动一个会话

    > wsl
  2. 验证您的用户是提供对远程 Podman Machine socket 访问权限的用户组的成员

    $ groups

    在默认的 Ubuntu WSL 上,列表包含 uucp 组。

    在自定义的 WSL 发行版上,组名可能会有所不同。

    查找所需的组名

    在任何 WSL 发行版上,所需的组 ID 都是相同的。

    但是,在自定义的 WSL 发行版上,组名可能会有所不同。

    在运行于 Fedora 发行版上的 Podman Machine 中

    • Rootful Podman:GID 10 名称是 wheel
    • Rootless Podman:GID 1000 名称是 user

    在 Ubuntu 发行版中

    • Rootful Podman:GID 10 名称是 uucp
    • Rootless Podman:GID 1000 的名称与您创建 WSL machine 时选择的用户名相同。

    在自定义的 WSL 发行版上,查找以下项的组名

    • Rootful Podman

      $ getent group 10
    • Rootless Podman

      $ getent group 1000
  3. 验证 Podman 默认系统连接已设置为您的远程 Podman machine

    $ podman system connection list
  4. 验证 Podman 的 Server 版本与您的 Podman Machine 版本相对应

    $ podman version

    示例输出

    Client:
    Version: 3.4.4
    API Version: 3.4.4
    Go Version: go1.18.1
    Built: Thu Jan 1 01:00:00 1970
    OS/Arch: linux/amd64

    Server:
    Version: 4.8.3
    API Version: 4.8.3
    Go Version: go1.21.5
    Built: Wed Jan 3 15:11:40 2024
    OS/Arch: linux/amd64
    信息

    在您的环境中,Podman 版本可能会有所不同。

  5. 验证您可以列出正在运行的容器。

    在您的 WSL 发行版上,启动一个容器,例如 quay.io/podman/hello,并列出最后一个运行容器的名称

    $ podman run quay.io/podman/hello
    $ podman ps -a --no-trunc --last 1

    Podman Desktop > Containers 中,输出会列出相同的容器(相同的名称,相同的镜像)。

更改连接

Podman Desktop 只能看到 rootless 或 rootful 容器,不能同时看到两者。

要更改活动连接

  1. 在您的 Windows 终端中,更改连接

    • 要将连接设置为 rootless

      $ podman machine set --rootful=false
    • 要将连接设置为 rootful

      $ podman machine set --rootful=true
  2. 在您的 WSL 会话中,更改 Podman 系统连接配置

    • 要将连接设置为 rootless

      $ podman system connection add --default podman-machine-default-user unix:///mnt/wsl/podman-sockets/podman-machine-default/podman-user.sock
    • 要将连接设置为 rootful

      $ podman system connection add --default podman-machine-default-root unix:///mnt/wsl/podman-sockets/podman-machine-default/podman-root.sock

后续步骤