使用 podman-remote 远程客户端远程访问 podman

OpenShift / RHEL / DevSecOps 汇总目录

podman 远程客户

podman是替换docker的容器环境,它不但可以对本地容器进行操作,还可以使用远程客户端对运行了podman服务的远程环境上的容器进行操作。

要从远程访问 podman,需要在被访问一侧运行 podman.socket 服务。客户端通过 SSH 通道访问远程的 podman 服务。
podman-remote 是专门的客户端程序,它只能用来访问远程 podman 环境。而 podman 程序可以通过 --remote 参数对远程进行访问。
在这里插入图片描述

环境说明

环境说明:需要 2 个 Linux 节点。用以下命令在节点 1 安装 podman 命令,节点 2 安装 podman-remote。

$ yum install podman
$ yum install podman-remote

节点 1 配置 podman 服务

说明:dawnsky 是节点 1 的用户,并且能进行 sudo 操作。节点 1 的主机名是 node-1。

$ ssh dawnsky@localhost
$ systemctl --user enable podman.socket
Created symlink /home/dawnsky/.config/systemd/user/sockets.target.wants/podman.socket → /usr/lib/systemd/user/podman.socket.
$ systemctl --user start podman.socket
$ sudo loginctl enable-linger $USER
[sudo] dawnsky 的密码:

节点 2 远程访问 podman

直接访问远程 podman

  1. 可以用 --url 参数访问节点 1 的远程 podman 服务。
$ NODE_1_IP=<YOUR-IP>
 
$ podman-remote --url ssh://dawnsky@${NODE_1_IP}/run/user/1000/podman/podman.sock info | grep hostname
Login password:
  hostname: node-1

入如果出现以下错误,需要使用 ssh @ 登录节点 2。
ERRO[0000] XDG_RUNTIME_DIR directory “/run/user/0” is not owned by the current user

使用 Connection 访问

  1. 可以创建 connection 记录远程访问方式。
$ podman system connection add remote-1 ssh://dawnsky@${NODE_1_IP}/run/user/1000/podman/podman.sock
$ podman system connection list
Name        URI                                                             Identity    Default
remote-1    ssh://dawnsky@192.168.1.48:22/run/user/1000/podman/podman.sock              true
  1. 使用 --connection 访问节点 1 的podman 服务。如果是 Default 的 connection,可以不用写。由于以上的 connection 没有配置 Identity,因此远程访问还需要提供节点 1 的 dawnsky 密码。
$ podman-remote info | grep hostname
Login password:
  hostname: node-1
 
$ podman-remote --connection remote-1 info | grep hostname
Login password:
  hostname: node-1
  1. 另外还可在节点 2 上用 podman --remote 也会使用远程方式访问。
$ podman --remote --url ssh://dawnsky@${NODE_1_IP}/run/user/1000/podman/podman.sock info | grep hostname
Login password:
  hostname: node-1

使用 Connection 免密访问

  1. 执行命令生成公钥私钥对,所有都回车即可。
$ ssh-keygen -t ed25519
  1. 将公钥文件的内容复制到节点 1 目标用户下的 ~/.ssh/authorized_keys 文件里。执行完命令可自行确认。
$ sh-copy-id -i .ssh/id_ed25519.pub dawnsky@${NODE_1_IP}
dawnsky@192.168.1.48's password:
 
Number of key(s) added: 1
 
Now try logging into the machine, with:   "ssh 'dawnsky@192.168.1.48'"
and check to make sure that only the key(s) you wanted were added.
  1. 执行命令创建一个新的 connection 配置,其中配置有访问证书。
$ podman system connection add --identity .ssh/id_ed25519 remote-no-password ssh://dawnsky@192.168.1.48/run/user/1000/podman/podman.sock
$ podman system connection list
Name                URI                                                             Identity         Default
remote-1            ssh://dawnsky@192.168.1.48:22/run/user/1000/podman/podman.sock                   true
remote-no-password  ssh://dawnsky@192.168.1.48:22/run/user/1000/podman/podman.sock  .ssh/id_ed25519  false
  1. 用新建的 connection 访问远程的 podman。
$ podman-remote --connection remote-no-password info | grep hostname
  hostname: centos-48

参考

https://www.redhat.com/sysadmin/podman-clients-macos-windows
https://docs.podman.io/en/latest/markdown/podman-remote.1.html
https://github.com/containers/podman/blob/main/docs/tutorials/remote_client.md
https://github.com/containers/podman/blob/main/docs/source/markdown/podman-system-service.1.md

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Android 客户使用远程服务(Remote Service)需要通过 `bindService()` 方法来绑定服务,获取远程服务的 `Binder` 对象,并通过该对象来调用服务中的方法。 以下是一个使用远程服务的示例代码: ```java public class RemoteClient extends Activity { // 定义远程服务的 Intent 对象 private Intent mRemoteServiceIntent; // 定义远程服务的 Binder 对象 private RemoteService.RemoteBinder mRemoteBinder; // 定义 ServiceConnection 对象,用于绑定服务 private ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { // 获取远程服务的 Binder 对象 mRemoteBinder = (RemoteService.RemoteBinder) service; } @Override public void onServiceDisconnected(ComponentName name) { // 远程服务断开连接时的处理 mRemoteBinder = null; } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 初始化远程服务的 Intent 对象 mRemoteServiceIntent = new Intent(this, RemoteService.class); } @Override protected void onResume() { super.onResume(); // 绑定远程服务 bindService(mRemoteServiceIntent, mServiceConnection, BIND_AUTO_CREATE); } @Override protected void onPause() { super.onPause(); // 解除绑定远程服务 unbindService(mServiceConnection); } // 在客户中调用远程服务的方法 private void doSomethingInRemoteService() { if (mRemoteBinder != null) { mRemoteBinder.doSomething(); } } } ``` 在上面的示例代码中,我们定义了一个 `RemoteClient` 类来演示如何使用远程服务。 在 `onCreate()` 方法中,我们初始化了远程服务的 `Intent` 对象。 在 `onResume()` 方法中,我们通过 `bindService()` 方法来绑定远程服务,并在 `ServiceConnection` 的 `onServiceConnected()` 方法中获取远程服务的 `Binder` 对象。 在 `onPause()` 方法中,我们通过 `unbindService()` 方法来解除绑定远程服务。 最后,在 `doSomethingInRemoteService()` 方法中,我们通过远程服务的 `Binder` 对象来调用远程服务中的方法。 需要注意的是,在客户使用远程服务时,需要确保服务已经启动,并且在 `bindService()` 方法中传入的 `Intent` 对象与服务中定义的 `Intent` 对象一致。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值