Skip to content

管理远程容器

约 1487 字大约 5 分钟

DockerPodman

2024-09-26

在容器化应用中,Docker 和 Podman 是两种常见的容器运行时工具。它们提供了非常相似的 CLI 接口,但 Podman 的无守护进程和 rootless 模式使其在某些场景下更加灵活和安全。本文将介绍如何在远程机器上安装 Podman 和 Docker,并通过 SSH 连接到远程的容器服务进行本地管理。

远程机器安装工具

安装 Podman

在不同的 Linux 发行版上,安装 Podman 的方法可能有所不同。以下以 Ubuntu 为例:

# 更新包索引
sudo apt update

# 安装 Podman
sudo apt install -y podman

# 检查 Podman 版本
podman --version

如果使用的是 CentOS 或 RHEL,可以通过以下命令安装:

# 添加 Podman 源
sudo dnf install -y epel-release

# 安装 Podman
sudo dnf install -y podman

# 检查 Podman 版本
podman --version

安装完成后,可以通过命令 podman info​ 确认 Podman 是否正确安装。

安装 Docker

Docker 的安装也非常简单。以下是以 Ubuntu 为例的安装步骤:

# 更新包索引
sudo apt update

# 安装依赖包
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

# 添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# 设置稳定版的 Docker 仓库
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# 更新包索引
sudo apt update

# 安装 Docker
sudo apt install -y docker-ce

# 启动并设置 Docker 开机自启动
sudo systemctl enable --now docker

# 检查 Docker 版本
docker --version

在 CentOS 中,可以使用以下命令安装 Docker:

# 安装依赖包
sudo dnf install -y yum-utils device-mapper-persistent-data lvm2

# 添加 Docker 仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# 安装 Docker
sudo dnf install -y docker-ce

# 启动并设置 Docker 开机自启动
sudo systemctl enable --now docker

# 检查 Docker 版本
docker --version

通过 SSH 连接远程 Socket

需要提前在本地机器配置ssh免密

Podman 远程访问

本地机器上通过 Podman CLI 进行远程连接。

$ podman --url ssh://root@192.168.64.19/run/podman/podman.sock --identity ~/.ssh/id_ed25519 ps
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

这样,本地的 Podman CLI 将通过 SSH 远程执行所有容器命令。

如果使用的不是默认的 SSH 密钥(例如 ~/.ssh/id_rsa​),需要手动指定密钥

Docker 远程访问

在本地机器上,可以通过以下方式连接远程 Docker 守护进程:

$ docker -H ssh://root@192.168.64.19/var/run/docker.sock ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

这样,所有 Docker 命令将通过 TCP 传输到远程机器的 Docker 守护进程。

通过 SSH 代理远程 Socket

除了直接配置远程服务监听端口,我们还可以通过 SSH 隧道代理本地 Docker 或 Podman 的 Socket 到远程机器。

使用 SSH 隧道代理 Docker Socket

在远程机器上,Docker 的默认 Socket 位于 /var/run/docker.sock​。我们可以通过 SSH 隧道将其映射到本地:

ssh -N -L /var/run/docker.sock:/var/run/docker.sock root@192.168.64.19

然后,本地 Docker CLI 就可以像使用本地 Docker 守护进程一样,管理远程机器上的容器:

$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

使用 SSH 隧道代理 Podman Socket

同样,我们可以通过 SSH 将远程 Podman 的 rootless Socket 映射到本地:

ssh -N -L /var/run/podman.sock:/var/run/podman/podman.sock root@192.168.64.19

然后,通过 Podman CLI 连接到这个本地 Socket:

$ podman --url unix:///var/run/podman.sock ps
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES

Podman 和 Docker 提供的远程连接管理方式

除了通过 SSH 隧道代理远程 Socket​ 来管理容器外,Podman 和 Docker 还各自提供了内置的远程连接管理功能,使用户可以更加方便地进行远程容器管理。

Podman 的 system connection

Podman 提供了一种简单的内置机制system connection​来管理多个远程连接。

确认远程机器上 Podman 已经正确安装并启用了远程服务(通常通过 podman system service​ 启动)。

在本地机器上配置 Podman 远程连接。

添加

假设远程机器的 IP 为 192.168.0.100​,用户名为 user​,Podman 服务运行在默认的 SSH 端口上。

podman system connection add ubuntu24-podman --identity ~/.ssh/id_rsa ssh://root@192.168.64.19/run/podman/podman.sock

这条命令会将远程主机 192.168.0.100​ 添加为一个名为 myremote​ 的连接,并通过 SSH 访问远程 Podman 的 Socket​。

切换

添加成功后,可以通过 --connection​ 选项指定使用哪个远程连接,执行容器操作。

podman --connection ubuntu24-podman ps

管理

Podman 允许管理多个远程连接:

列出所有连接

podman system connection list

设置默认连接

podman system connection default ubuntu24-podman

删除连接

podman system connection remove ubuntu24-podman

Podman 的远程连接机制非常灵活,能够支持在不同机器之间轻松切换管理对象,而无需重复配置 SSH 隧道或远程 Socket​。

Docker 的 context

Docker提供 的 context​ 功能特别适合在多个 Docker 环境之间快速切换。例如:

  • 在本地开发环境中,使用默认的 Docker 守护进程。
  • 部署时,切换到远程生产服务器的 Docker 环境。
  • 同时管理多个云提供商的 Docker 容器服务(如 AWS 或 Google Cloud 上的 Docker 实例)。

使用 context​ 不仅减少了反复配置远程 Docker 守护进程的繁琐步骤,还提供了一种更安全、可管理的方式来控制访问多个 Docker 实例。

在本地机器上配置context​远程连接。

添加 ​

docker context create ubuntu24-docker \
	--description "multipass ubuntu24 docker" \
	--docker "host=ssh://root@192.168.64.19/var/run/docker.sock"

这条命令创建了一个名为 ubuntu24-docker​ 的 context​,其描述为 "multipass ubuntu24 docker",并且使用 ssh://root@192.168.64.19/var/run/docker.sock​ 作为 Docker 守护进程的地址。

切换​

docker context use ubuntu24-docker

这将把当前的 Docker CLI 环境切换到 ubuntu24-docker​ 上,之后的所有 Docker 命令都会与远程 Docker 守护进程交互。

管理​

Docker 的 context​ 允许用户同时配置和管理多个环境(本地或远程):

列出所有 context​:

docker context ls

查看当前 context​:

docker context show

删除 context​:

docker context rm ubuntu24-docker

切换回默认 context​(通常是本地 Docker):

docker context use default