Podman用户与卷

用户操作

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

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

安装crun,并修改配置文件
[root@localhost ~]# yum -y install crun
[root@localhost ~]# rpm -qa | grep crun
crun-1.0-1.module_el8.5.0+911+f19012f9.x86_64
[root@localhost ~]# vi /usr/share/containers/containers.conf 
    470 # Default OCI runtime
    471 #
    472 #runtime = "crun"
    473 runtime = "runc"
#修改后
    470 # Default OCI runtime
    471 #
    472 runtime = "crun"
    473 #runtime = "runc"


#运行容器
[root@localhost ~]# podman run -d --name web -p 80:80 docker.io/library/httpd
cb1fe4e0c7ff21b4f0b6231fcedc90493b29eff7bb54512978c3829a822b6701
#查看运行容器是否是配置后的crun
[root@localhost ~]# podman inspect web | grep crun
        "OCIRuntime": "crun",
            "crun",
[root@localhost ~]# 

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

[root@localhost ~]# yum -y install slirp4netns
[root@localhost ~]# yum -y install fuse-overlayfs

[root@localhost ~]# vi /etc/containers/storage.conf
92 mount_program = "/usr/bin/fuse-overlayfs" #取消注释

/ etc / subuid和/ etc / subgid配置

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

[root@localhost ~]# yum -y install shadow-utils

#可以在/etc/subuid和/etc/subgid查看,
#每个用户的值必须唯一且没有任何重叠。

[root@localhost ~]# useradd xuan
[root@localhost ~]# cat /etc/subgid
long:100000:65536
[root@localhost ~]# cat /etc/subuid
long:100000:65536
[root@localhost ~]# 

// 启动非特权ping 
[root@localhost ~]# vim /etc/sysctl.conf
#For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ping_group_range = 0 300000

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

为用户分配的初始 UID。
为用户分配的 UID 范围的大小。
该usermod程序可用于为用户分配 UID 和 GID,而不是直接更新文件。

[root@localhost ~]# usermod --add-subuids 200000-201000 --add-subgids 200000-201000 xuan
[root@localhost ~]# cat /etc/subuid
xuan:100000:65536
xuan:200000:1001
[root@localhost ~]# 

用户配置文件

三个主要的配置文件是container.conf、storage.conf和registries.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以下,则需要做以下操作这个是临时的,意思是运行15000个用户使用我们的名称空间
[root@localhost ~]# sysctl user.max_user_namespaces=15000  

#只是限制用户数量,这个是永久的配置
[root@localhost ~]# vim /etc/sysctl.conf
#For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ping_group_range = 0 300000
user.max_user_namespaces=15000

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

graphroot="$HOME/.local/share/containers/storage"
runroot="$XDG_RUNTIME_DIR/containers"

#配置文件在这里
[root@localhost ~]# vim /etc/containers/storage.conf
#Temporary storage location
runroot = "/run/containers/storage"

#restorecon -R -v /NEWSTORAGEPATH
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账号
[root@localhost ~]# podman login docker.io 
Username: kuilingwu
Password: 
Login Succeeded!
#查找授权文件
[root@localhost ~]# find / -name auth.json
/run/user/0/containers/auth.json
[root@localhost ~]# cat /run/user/0/containers/auth.json 
{
	"auths": {
		"docker.io": {
			"auth": "a3VpbGluZ3d1Ojk4NjkyNTgyNXFhelFBWg=="   #显示授权的后的加密密码
		}
	}
}[root@localhost ~]# 

#登录刚才创建的账号
[root@localhost ~]# su - long 
[long@localhost ~]$ podman login
Username: kuilingwu
Password: 
Login Succeeded!
[long@localhost ~]$ find / -name auth.json
...
/tmp/podman-run-1000/containers/auth.json
[long@localhost ~]$ cat /tmp/podman-run-1000/containers/auth.json
{
	"auths": {
		"docker.io": {
			"auth": "a3VpbGluZ3d1Ojk4NjkyNTgyNXFhelFBWg=="
		}
	}
}


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

//root用户
[root@localhost ~]# podman images 
REPOSITORY                 TAG         IMAGE ID      CREATED        SIZE
docker.io/library/httpd    latest      f2a976f932ec  2 weeks ago    149 MB
docker.io/library/busybox  latest      7a80323521cc  2 weeks ago    1.47 MB
quay.io/centos/centos      latest      300e315adb2f  20 months ago  217 MB
[root@localhost ~]# 


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

#在用户里面运行容器root用户也看不见
[long@localhost ~]$ podman run -dit --name b1 busybox:latest 
8e1319264a168f497667f1291d85163b15f5031c68d67c7fc5e70819ec811ad5
[long@localhost ~]$ podman ps
CONTAINER ID  IMAGE                             COMMAND     CREATED        STATUS            PORTS       NAMES
8e1319264a16  docker.io/library/busybox:latest  sh          4 seconds ago  Up 4 seconds ago              b1
[long@localhost ~]$ 

[root@localhost ~]# podman ps
CONTAINER ID  IMAGE       COMMAND     CREATED     STATUS      PORTS       NAMES
[root@localhost ~]# 

容器与root用户一起运行,则root容器中的用户实际上就是主机上的用户。
UID GID是在/etc/subuid和/etc/subgid等中用户映射中指定的第一个UID GID。
如果普通用户的身份从主机目录挂载到容器中,并在该目录中以根用户身份创建文件,则会看到它实际上是你的用户在主机上拥有的。

[root@localhost ~]# su - xuan
[long@localhost ~]$ mkdir abc
[long@localhost ~]$ ll
total 0
drwxrwxr-x. 2 long long 6 Aug 16 22:14 abc
[long@localhost ~]$ podman run -dit --name web  -v /home/long/abc/:/abc busybox:latest 
7a73fc9809e949ea56fb3d9ab4012c5bccf9176a5f9095e88182fe84340e2695
[long@localhost ~]$ podman exec -it web /bin/bash
Error: crun: executable file `/bin/bash` not found in $PATH: No such file or directory: OCI runtime attempted to invoke a command that was not found
[long@localhost ~]$ podman exec -it b1 /bin/sh   
/ # ls -l / --color   #挂载后数据不保持一致了
total 16
drwxrwxr-x    2 root     root             6 Aug 16 14:14 abc  ##挂载后数据不保持一致了
drwxr-xr-x    2 root     root         12288 Jul 29 01:32 bin
drwxr-xr-x    5 root     root           360 Aug 16 14:17 dev
drwxr-xr-x    3 root     root            66 Aug 16 14:17 etc
drwxr-xr-x    2 nobody   nobody           6 Jul 29 01:32 home
dr-xr-xr-x  199 nobody   nobody           0 Aug 16 14:17 proc
drwx------    2 root     root            26 Aug 16 14:19 root
drwxr-xr-t    3 root     root            62 Aug 16 14:17 run
dr-xr-xr-x   13 nobody   nobody           0 Aug 16 13:05 sys
drwxrwxrwt    2 root     root             6 Jul 29 01:32 tmp
drwxr-xr-x    3 root     root            18 Jul 29 01:32 usr
drwxr-xr-x    4 root     root            30 Jul 29 01:32 var
/ # exit

#退出清除容器
[long@localhost ~]$ podman stop web
WARN[0010] StopSignal SIGTERM failed to stop container b1 in 10 seconds, resorting to SIGKILL 
b1
[long@localhost ~]$ podman rm web
7a73fc9809e949ea56fb3d9ab4012c5bccf9176a5f9095e88182fe84340e2695
[long@localhost ~]$ 



添加--userns=keep-id ID保持
```python
[long@localhost ~]$ podman run -dit --name b1 -v /home/long/abc/:/abc --userns=keep-id  busybox:latest
85758c893445ec8f4ff3173dfaf5e1176b8866a83abb4a071dc5f31a58fa64a5
[long@localhost ~]$ podman ps
CONTAINER ID  IMAGE                             COMMAND     CREATED         STATUS             PORTS       NAMES
85758c893445  docker.io/library/busybox:latest  sh          48 seconds ago  Up 49 seconds ago              b1
[long@localhost ~]$ podman exec -it b1 /bin/sh
~ $ ls -l / --color
total 16
drwxrwxr-x    2 long     long             6 Aug 16 14:14 abc  ##挂载后数据保持一致了
drwxr-xr-x    2 root     root         12288 Jul 29 01:32 bin
drwxr-xr-x    5 root     root           360 Aug 16 14:34 dev
drwxr-xr-x    3 root     root            93 Aug 16 14:34 etc
drwxr-xr-x    2 nobody   nobody           6 Jul 29 01:32 home
dr-xr-xr-x  195 nobody   nobody           0 Aug 16 14:34 proc
drwx------    2 root     root             6 Jul 29 01:32 root
drwxr-xr-x    3 root     root            62 Aug 16 14:34 run
dr-xr-xr-x   13 nobody   nobody           0 Aug 16 13:05 sys
drwxrwxrwt    2 root     root             6 Jul 29 01:32 tmp
drwxr-xr-x    3 root     root            18 Jul 29 01:32 usr
drwxr-xr-x    4 root     root            30 Jul 29 01:32 var
~ $ 

在主机上查看

[root@localhost ~]# ll /home/long/
total 0
drwxrwxr-x. 2 long long 6 Aug 16 22:14 abc
[root@localhost ~]# 

//写入文件
[long@localhost ~]$ ls
abc
[long@localhost ~]$ echo "hell" >> abc/123
[long@localhost ~]$ cat abc/123 
hell
[long@localhost ~]$ 

在容器中查看abc/123是无法查看的,因为还需要添加配置命令

~ $ cd abc/
/abc $ ls
ls: can't open '.': Permission denied

正确配置使容器和主机都能看见
配置selinux标签的解释

如果使用selinux,则可以添加z或Z选项来修改要装入容器的主机文件或目录的selinux标签。这会影响主机本身上的文件或目录,并可能导致超出Docker范围的后果。

该z选项指示绑定安装内容在多个容器之间共享。
该Z选项指示绑定安装内容是私有的且未共享。
这些选项请格外小心。绑定安装系统目录(例如/home或/usr带有该Z选项)会使主机无法操作,并且您可能需要手动重新标记主机文件。

重要说明:将绑定安装与服务一起使用时,selinux标签(:Z和:z)以及将:ro被忽略。

本示例设置z选项以指定多个容器可以共享绑定安装的内容:

docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/target:/app:z \
  nginx:latest

无法使用该–mount标志修改selinux标签。

本机配置

[long@localhost ~]$ podman rm -f b1 
WARN[0010] StopSignal SIGTERM failed to stop container b1 in 10 seconds, resorting to SIGKILL 
85758c893445ec8f4ff3173dfaf5e1176b8866a83abb4a071dc5f31a58fa64a5
[long@localhost ~]$ podman run -dit --name b1 -v /home/long/abc/:/abc:Z --userns=keep-id  busybox:latest
b4a2dca9bbf7df4d4800e1110ac3ff0419aacd0bb43f761143ba2c2b947543a5
[long@localhost ~]$ podman exec -it b1 /bin/sh
~ $ ls
abc   bin   dev   etc   home  proc  root  run   sys   tmp   usr   var
~ $ ll
/bin/sh: ll: not found
~ $ ls -l / --color
total 16
drwxrwxr-x    2 long     long            17 Aug 16 14:39 abc
drwxr-xr-x    2 root     root         12288 Jul 29 01:32 bin
drwxr-xr-x    5 root     root           360 Aug 16 14:45 dev
drwxr-xr-x    3 root     root            93 Aug 16 14:45 etc
drwxr-xr-x    2 nobody   nobody           6 Jul 29 01:32 home
dr-xr-xr-x  197 nobody   nobody           0 Aug 16 14:45 proc
drwx------    2 root     root             6 Jul 29 01:32 root
drwxr-xr-x    3 root     root            62 Aug 16 14:45 run
dr-xr-xr-x   13 nobody   nobody           0 Aug 16 13:05 sys
drwxrwxrwt    2 root     root             6 Jul 29 01:32 tmp
drwxr-xr-x    3 root     root            18 Jul 29 01:32 usr
drwxr-xr-x    4 root     root            30 Jul 29 01:32 var
~ $ cat abc/123   
hell    #可以看到编写的文件
~ $ 

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

[zz@localhost ~]$ podman run  -d -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

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

[zz@localhost ~]$ podman run  -d -p 1024:80 httpd
58613a6bdc70d4d4f9f624583f795a62a610596d166f0873bdff8fb26aa15092
[zz@localhost ~]$ ss -anlt
State       Recv-Q      Send-Q           Local Address:Port           Peer Address:Port      Process      
LISTEN      0           128                    0.0.0.0:22                  0.0.0.0:*                      
LISTEN      0           128                          *:1024                      *:*                      
LISTEN      0           128                       [::]:22                     [::]:* 

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

[root@localhost ~]# echo  'net.ipv4.ip_unprivileged_port_start=80'  >> /etc/sysctl.conf
[root@localhost ~]# sysctl -p
net.ipv4.ip_unprivileged_port_start = 80

[zz@localhost ~]$ podman run -d -p 80:80 httpd
1215455a0c300d78e7bf6afaefc9873f818c6b0f26affeee4e2bc17954e72d8e
[zz@localhost ~]$ ss -anlt
State       Recv-Q      Send-Q           Local Address:Port           Peer Address:Port      Process      
LISTEN      0           128                    0.0.0.0:22                  0.0.0.0:*                      
LISTEN      0           128                          *:1024                      *:*                      
LISTEN      0           128                          *:80                        *:*                      
LISTEN      0           128                       [::]:22                     [::]:*  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值