podman无根用户基本设置和使用

在允许没有root特权的用户运行Podman之前,管理员必须安装或构建Podman并完成以下配置

cgroup V2Linux内核功能允许用户限制普通用户容器可以使用的资源,如果使用cgroupV2启用了运行Podman的Linux发行版,则可能需要更改默认的OCI运行时。某些较旧的版本runc不适用于cgroupV2,必须切换到备用OCI运行时crun。

//安装crun,centos8系统自带
[root@localhost ~]# dnf -y install crun

//编辑/usr/share/containers/containers.conf 文件
Default OCI runtime
#
#runtime = "crun"   //取消本行注释
runtime = "runc"    //将此行注释

//创建一个容器,查看容器运行模式是否是crun
[root@localhost ~]# podman run -itd --name web -p 80:80 httpd
3e555303388b0da61de062ed03749eb2c3ec9080047654c6a3f0aef4b4c4e937
[root@localhost ~]# podman container inspect web | grep -i crun
        "OCIRuntime": "crun",
            "crun",

安装slirp4netns和fuse-overlayfs

在普通用户环境中使用Podman时,建议使用fuse-overlayfs而不是VFS文件系统,至少需要版本0.7.6。现在新版本默认就是了。

[root@localhost ~]# dnf -y install slirp4netns
[root@localhost ~]# dnf -y install fuse-overlayfs
[root@localhost ~]# vim /etc/containers/storage.conf
#mount_program = "/usr/bin/fuse-overlayfs"      //取消此行注释

subuid和subgid配置

Podman要求运行它的用户在/ etc / subuid和/ etc / subgid文件中列出一系列UID,shadow-utils或newuid包提供这些文件

[root@localhost ~]# dnf -y install shadow-utils
//可以在/ etc / subuid和/ etc / subgid查看,每个用户的值必须唯一且没有任何重叠。
[root@localhost ~]# useradd zic
[root@localhost ~]# cat /etc/subuid
zzd:100000:65536
zic:165536:65536
[root@localhost ~]# cat /etc/subgid
zzd:100000:65536
zic:165536:65536

//启动非特权ping
[root@localhost ~]# vim /etc/sysctl.conf
//添加如下内容
net.ipv4.ping_group_range = 0 200000 (表示uid从开始到200000的用户可用)

这个文件的格式是 USERNAME:UID:RANGE中/etc/passwd或输出中列出的用户名getpwent。

  • 为用户分配的初始 UID。
  • 为用户分配的 UID 范围的大小。

该usermod程序可用于为用户分配 UID 和 GID,而不是直接更新文件。

[root@localhost ~]# useradd zzz
//添加
[root@localhost ~]# usermod --add-subuids 300000-301000 --add-subgids 300000-301000 zic
[root@localhost ~]# cat /etc/subuid
zzd:100000:65536
zic:165536:65536
zzz:231072:65536
zic:300000:1001
//删除
[root@localhost ~]# usermod --del-subuids 300000-301000 --del-subgids 300000-301000 zic
[root@localhost ~]# cat /etc/subuid
zzd:100000:65536
zic:165536:65536
zzz:231072:65536

用户配置文件

三个主要的配置文件是 container.confstorage.confregistries.conf。用户可以根据需要修改这些文件。

container.conf

// 用户配置文件
[root@localhost ~]# cat /usr/share/containers/containers.conf
[root@localhost ~]# cat /etc/containers/containers.conf
[root@localhost ~]# cat ~/.config/containers/containers.conf  //优先级最高

配置storage.conf文件

1./etc/containers/storage.conf
2.$HOME/.config/containers/storage.conf

在普通用户中 /etc/containers/storage.conf的一些字段将被忽略

[root@localhost ~]#  vi /etc/containers/storage.conf
[storage]

Default Storage Driver, Must be set for proper operation.

driver = "overlay"    //此处改为overlay
.......

mount_program = "/usr/bin/fuse-overlayfs"    //取消注释

//如果版本为8以下,则需要做以下操作:
[root@localhost ~]# sysctl user.max_user_namespaces=15000
//或者
[root@localhost ~]# vim /etc/sysctl.conf
user.max_user_namepaces=15000

在普通用户中这些字段默认

runroot = "/run/containers/storage"
graphroot = "/var/lib/containers/storage"

registries.conf

配置按此顺序读入,这些文件不是默认创建的,可以从 /usr/share/containers或复制文件 /etc/containers并进行修改

1./etc/containers/registries.conf
2./etc/containers/registries.d/*
3.HOME/.config/containers/registries.conf

授权文件

此文件里面写了docker账号的密码,以加密方式显示

[root@localhost ~]# podman login
Username: ziczhou
Password:
Login Succeeded!

[root@localhost ~]# cat /run/user/0/containers/auth.json
{
        "auths": {
                "docker.io": {
                        "auth": "emljemhvdTp6emQyd2J5Li4u"
                }
        }

普通用户是无法看见root用户的镜像的

//root用户的镜像
[root@localhost ~]# podman images
REPOSITORY               TAG         IMAGE ID      CREATED      SIZE
docker.io/library/httpd  latest      f2a976f932ec  2 weeks ago  149 MB

//普通户用
[root@localhost ~]# su - zic
[zic@localhost ~]$ podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

使用卷

  • 容器与root用户一起运行,则root容器中的用户实际上就是主机上的用户。
  • UID GID是在/etc/subuid和/etc/subgid等中用户映射中指定的第一个UID GID。
  • 如果普通用户的身份从主机目录挂载到容器中,并在该目录中以根用户身份创建文件,则会看到它实际上是你的用户在主机上拥有的。
[zic@localhost ~]$ podman run -it -v $(pwd)/date:/date:Z httpd /bin/bash
root@f6a726f506b1:/usr/local/apache2# cd /
root@f6a726f506b1:/# ls
bin  boot  date  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@f6a726f506b1:/# ls /date/
root@f6a726f506b1:/# cd /date/
root@f6a726f506b1:/date# touch 123
root@f6a726f506b1:/date# ls -l
total 0
-rw-r--r--. 1 root root 0 Aug 21 13:53 123

在主机上查看

[zic@localhost ~]$ ls $HOME/date
123

//写入内容
[zic@localhost ~]$ echo "Hello World!" > $HOME/date/123
[zic@localhost ~]$ cat $HOME/date/123
Hello World!

容器里查看

root@f6a726f506b1:/date# cat 123
Hello World!

//我们可以发现在容器里面的文件的属主和属组都属于root,那么如何才能让其属于zic用户呢?
root@f6a726f506b1:/date# ls -l
total 4
-rw-r--r--. 1 root root 13 Aug 21 13:56 123

//只要在运行容器的时候加上一个--userns=keep-id即可
[zic@localhost ~]$ podman run -it --name web1 -v $(pwd)/date:/date:Z --userns=keep-id httpd /bin/bash
zic@6412d55309af:/$ cd /date/
zic@6412d55309af:/date$ ls -l
total 4
-rw-r--r--. 1 zic zic 13 Aug 21 13:56 123

使用普通用户映射容器端口时会报” permission denied”的错误

//删除web1容器
[zic@localhost ~]$ podman rm -f web1

[zic@localhost ~]$ podman run -itd --name web1 -v $(pwd)/date:/date:Z -p 80:80 httpd
Error: rootlessport cannot expose privileged port 80, you can add 'net.ipv4.ip_unprivileged_port_start=80' to /etc/sysctl.conf (currently 1024), or choose a larger port number (>= 1024): listen tcp 0.0.0.0:80: bind: permission denied

//删除最近一次创建的容器,也就是web1
[zic@localhost ~]$ podman rm -fl

普通用户可以映射>= 1024的端口

[zic@localhost ~]$ podman run -itd --name web1 -p 1024:80  -v $(pwd)/date:/date:Z httpd
fd4d574396a42cde4822930d89acec6d597e1152ef5ad88a73a230bfa4e1aa65
[zic@localhost ~]$ podman ps
CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS            PORTS                 NAMES
fd4d574396a4  docker.io/library/httpd:latest  httpd-foreground  2 seconds ago  Up 2 seconds ago  0.0.0.0:1024->80/tcp  web1
[zic@localhost ~]$ ss -antl
State          Recv-Q         Send-Q                   Local Address:Port                   Peer Address:Port         Process
LISTEN         0              128                            0.0.0.0:111                         0.0.0.0:*
LISTEN         0              128                            0.0.0.0:22                          0.0.0.0:*
LISTEN         0              128                                  *:1024                              *:*
LISTEN         0              128                               [::]:111                            [::]:*
LISTEN         0              128                               [::]:22                             [::]:*

配置echo ‘net.ipv4.ip_unprivileged_port_start=80’ >> /etc/sysctl.conf后可以映射大于等于80的端口

//切换到root用户
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_unprivileged_port_start=80
[root@localhost ~]# sysctl -p
net.ipv4.ping_group_range = 0 200000
net.ipv4.ip_unprivileged_port_start = 80

//切换到zic用户
[root@localhost ~]# su - zic
Last login: Sun Aug 21 21:54:50 CST 2022 on pts/2

//创建容器
[zic@localhost ~]$ podman run -itd --name web2 -v $(pwd)/date:/date:Z -p 80:80 httpd
bdd64e999ce8f526af9d0bb93b091b39c188b2adf2e65608ffe72afda044eb38
[zic@localhost ~]$ podman ps
CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS            PORTS                 NAMES
fd4d574396a4  docker.io/library/httpd:latest  httpd-foreground  4 minutes ago  Up 4 minutes ago  0.0.0.0:1024->80/tcp  web1
bdd64e999ce8  docker.io/library/httpd:latest  httpd-foreground  5 seconds ago  Up 4 seconds ago  0.0.0.0:80->80/tcp    web2
[zic@localhost ~]$ ss -antl
State          Recv-Q         Send-Q                   Local Address:Port                   Peer Address:Port         Process
LISTEN         0              128                            0.0.0.0:111                         0.0.0.0:*
LISTEN         0              128                            0.0.0.0:22                          0.0.0.0:*
LISTEN         0              128                                  *:1024                              *:*
LISTEN         0              128                               [::]:111                            [::]:*
LISTEN         0              128                                  *:80                                *:*
LISTEN         0              128                               [::]:22                             [::]:*

Original: https://www.cnblogs.com/zicnotes/p/16611225.html
Author: Zic师傅
Title: podman无根用户基本设置和使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606920/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SharePoint 2007 Full Text Searching PowerShell and CS file content with SharePoint Search

    Ensure your site or shared folder in one Content Source. Add file types. The second step i…

    Linux 2023年5月28日
    071
  • linux编译安装nginx

    本文升级过程,适用于大部分nginx编译版本 常用编译选项说明nginx大部分常用模块,编译时./configure –help以–without开头的都默认安装。 –prefix…

    Linux 2023年5月27日
    081
  • linux中软件的安装方式

    linux中软件的安装方式 四种方式 ​ 源码编译安装 ​ rpm安装 ​ yum安装 解压、配置(hadoop、hive等) 1.源码编译安装 1.为了编译nginx源码 yum…

    Linux 2023年6月11日
    089
  • 给你的计算机集群加一道安全屏障

    之前的LAXCUS集群操作系统系列文章介绍过,LAXCUS把集群分成内外两个网络环境。内网归管理员掌控,外网由用户操作,中间由网关连接,网关起着反向代理的作用,负责转发内外网络的通…

    Linux 2023年6月6日
    090
  • jQuery 遍历

    下图展示了一个家族树。通过 jQuery 遍历,您能够从被选(当前的)元素开始,轻松地在家族树中向上移动(祖先),向下移动(子孙),水平移动(同胞)。这种移动被称为对 DOM 进行…

    Linux 2023年6月13日
    083
  • SSH 完全教程 1

    SSH(Secure Shell 的缩写)是一种网络协议,用于加密两台计算机之间的通信,并且支持各种身份验证机制。 实务中,它主要用于保证远程登录和远程通信的安全,任何网络服务都可…

    Linux 2023年6月7日
    076
  • Dockerfile

    基本结构 Dockerfile 是一个文本格式的配置文件,用户可以使用 Dockerfile 快速创建自定义镜像。 Dockerfile 由一行行命令语句组成,并且支持以 # 开头…

    Linux 2023年6月13日
    096
  • vert.x-快速入门

    vert.x是Eclipse软件基金会顶级java开源项目之一,它基于netty的、运行在jvm之上的、支持多种编程语言的高性能异步、非阻塞、响应式全栈java web框架。它在t…

    Linux 2023年6月8日
    0104
  • 内核同步问题

    linux内核同步问题 Linux内核设计与实现 十、内核同步方法 [手把手教Linux驱动5-自旋锁、信号量、互斥体概述](https://www.cnblogs.com/yik…

    Linux 2023年6月13日
    084
  • 服务器监控-TOP命令详解

    用jmeter进行性能测试的时候,top命令是最方便可用的服务器监控命令,可以看出服务器的当前负载量,CPU占用率,内存占用率等重要信息,下面详细解说一下top命令里面的各个指标。…

    Linux 2023年5月27日
    0107
  • Linux系统Oracle常见操作

    1.1 登录默认数据库 首先切换到oracle用户,用数据库默认管理员登录。 [root@tsm-zh01 ~]# su – oracle [oracle@redhat ~]$ l…

    Linux 2023年6月6日
    074
  • protobuf 的交叉编译使用(C++)

    为了提高通信效率,可以采用 protobuf 替代 XML 和 Json 数据交互格式,protobuf 相对来说数据量小,在进程间通信或者设备之间通信能够提高通信速率。下面介绍 …

    Linux 2023年6月7日
    0137
  • 性能测试—性能监控

    性能测试中,首先需要确定需求 测什么?怎么测?达到什么标准?。确定好性能测试的需要之后选择性能测试工具,jmeter或者LoadRunner。 分析是否需要分布式压测,如果需要分布…

    Linux 2023年6月8日
    066
  • manjaro镜像官方下载

    manjaro国内下载地址,收藏 https://mirrors.tuna.tsinghua.edu.cn/osdn/storage/g/m/ma/manjaro-jp/ http…

    Linux 2023年6月8日
    0504
  • linux下应用程序界面初始位置及鼠标拖动失效

    故事背景:最近在适配uos系统,客户端程序启动初始位置乱跳,并不是我设置的屏幕中间,鼠标拖动失效,一度怀疑自己的代码有问题,开始我们的探险之路吧。。。 探索之路:后来goolge发…

    Linux 2023年6月13日
    0113
  • 剑指offer计划31(数学困难)—java

    1.1、题目1 剑指 Offer 14- II. 剪绳子 II 1.2、解法 刚刚好结束了,这个专题,国庆休息,后面再改 1.3、代码 class Solution { publi…

    Linux 2023年6月11日
    094
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球