管理远程容器
在容器化应用中,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
远程连接。
添加远程
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 守护进程的地址。切换到远程
context
:docker context use ubuntu24-docker
这将把当前的 Docker CLI 环境切换到
ubuntu24-docker
上,之后的所有 Docker 命令都会与远程 Docker 守护进程交互。管理多个
context
:
Docker 的context
允许用户同时配置和管理多个环境(本地或远程):列出所有
context
:docker context ls
查看当前
context
:docker context show
删除
context
:docker context rm ubuntu24-docker
切换回默认
context
(通常是本地 Docker):docker context use default