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

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                             [::]:* 
posted @ 2022-08-21 22:22  Zic师傅  阅读(200)  评论(0编辑  收藏  举报