podman无根环境中的基本设置和使用和卷

在无根环境中的基本设置和使用 Podman

用户操作

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

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

[root@localhost ~]# rpm -qa |grep crun
[root@localhost ~]# yum -y install crun	//这里我没有所以需要安装,一般centos8系统都自带的

[root@localhost ~]# cd /usr/share/containers/
[root@localhost containers]# pwd 
/usr/share/containers
[root@localhost containers]# ls
containers.conf  mounts.conf  seccomp.json  selinux
[root@localhost containers]# vim containers.conf 

# Default OCI runtime
#
runtime = "crun"				//取消注释并将runc改为crun
#runtime = "runc"

[root@localhost ~]# podman run -d --name web1 -p 80:80 httpd
3ddfdbef3bdb893f09a1c6fcff27cffa8d465db68dccc83be1f5ad57eb31e1a2
[root@localhost ~]# podman ps
CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS            PORTS               NAMES
3ddfdbef3bdb  docker.io/library/httpd:latest  httpd-foreground  4 seconds ago  Up 4 seconds ago  0.0.0.0:80->80/tcp  web1
[root@localhost ~]# 

安装slirp4netns和fuse-overlayfs

在普通用户环境中使用Podman时,建议使用fuse-overlayfs而不是VFS文件系统,至少需要版本0.7.6。现在新版本默认就是了。
没有就按照这个命令安装
yum -y install slirp4netns
yum -y install fuse-overlayfs

[root@localhost ~]# rpm -qa |grep slirp4netns
slirp4netns-1.1.8-1.module_el8.5.0+890+6b136101.x86_64
[root@localhost ~]# rpm -qa |grep fuse-overlayfs
fuse-overlayfs-1.7.1-1.module_el8.5.0+890+6b136101.x86_64
[root@localhost ~]# 
[root@localhost ~]# cd /etc/containers/
[root@localhost containers]# vim storage.conf 

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

[root@localhost containers]# which fuse-overlayfs 		//查找看看能不能找到,找到就表示启动成功了
/usr/bin/fuse-overlayfs
[root@localhost containers]# 

/ etc / subuid和/ etc / subgid配置

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

[root@localhost ~]# dnf -y install shadow-utils		//一般安装了podman就会有

可以在/ etc / subuid和/ etc / subgid查看,每个用户的值必须唯一且没有任何重叠。
[root@localhost ~]# useradd laoliu
[root@localhost ~]# id laoliu
uid=1001(laoliu) gid=1001(laoliu) groups=1001(laoliu)
[root@localhost ~]# 
[root@localhost ~]# cat /etc/subuid
cys:100000:65536
laoliu:165536:65536
[root@localhost ~]# 

// 启动非特权ping 
[root@localhost ~]# vim /etc/sysctl.conf 

net.ipv4.ping_group_range=0 200000		//大于100000这个就表示laoliu可以操作podman

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

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

[root@localhost ~]# usermod --del-subuids 165536-231072 --del-subgids 165536-231072 laoliu
[root@localhost ~]# cat /etc/subuid
cys:100000:65536
[root@localhost ~]# usermod --add-subuids 200000-201000 --add-subgids 200000-201000 laoliu
[root@localhost ~]# cat /etc/subuid
cys:100000:65536
laoliu: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"    #取消注释

[root@localhost ~]# vim /etc/sysctl.conf 
user.max_user_namespaces=15000

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

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

registries.conf

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

[root@localhost ~]# find / -name registries.conf
/etc/containers/registries.conf
[root@localhost ~]# 


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

此文件里面写了docker账号的密码,以加密方式显示
无根用户和根用户命名授权的都是一样的

//无根用户
[root@localhost ~]# su - laoliu
[laoliu@localhost ~]$ find / -name auth.json

[laoliu@localhost ~]$ cat /tmp/podman-run-1001/containers/auth.json
{
	"auths": {
		"docker.io": {
			"auth": "MGI4ZDU3MmQxYzdkOjEyMzQ1Njc4OQ=="
		}
	}
}[laoliu@localhost ~]$ 


//这里是根用户
[root@localhost ~]# podman login 
Username: 0b8d572d1c7d
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": "MGI4ZDU3MmQxYzdkOjEyMzQ1Njc4OQ=="
		}
	}
}
[root@localhost ~]# 

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

//root用户
[root@localhost ~]# podman images
REPOSITORY                  TAG      IMAGE ID       CREATED       SIZE
docker.io/library/httpd     latest   ea28e1b82f31   11 days ago   146 MB

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

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

[laoliu@localhost ~]$ podman run -dit --name web1 -v /home/laoliu/abc/:/abc:Z -p 8080:80 httpd 
Error: statfs /home/laoliu/abc: no such file or directory
[laoliu@localhost ~]$ podman run -dit --name web1 -v /home/laoliu/data/:/data:Z -p 8080:80 httpd 
c8f5c1764ac3d70581aa1183c39f35a2c5ca77b413c6d1a824e9d0afad1789ff
[laoliu@localhost ~]$ 

[laoliu@localhost ~]$ podman exec -it web1 /bin/bash
root@c8f5c1764ac3:/usr/local/apache2# cd /data/
root@c8f5c1764ac3:/data# ls
root@c8f5c1764ac3:/data# touch 1  2 4
root@c8f5c1764ac3:/data# mkdir abc
root@c8f5c1764ac3:/data# ls
1  2  4  abc
root@c8f5c1764ac3:/data# 

在主机上查看

[laoliu@localhost ~]$ ls /home/laoliu/data/
1  2  4  abc
[laoliu@localhost ~]$ 

容器里查看
//只要在运行容器的时候加上一个–userns=keep-id即可。

[laoliu@localhost ~]$ podman run -dit --name web1 --userns=keep-id -v $(pwd)/data:/data:Z busybox
960b6cae188e0ab005cb423bd095e9a91e41132e6e4dc167dd4dddd5798f8e26
[laoliu@localhost ~]$ podman exec -it web1 /bin/sh
~ $ cd /data/
/data $ ls -l
total 0
-rw-r--r--    1 laoliu   laoliu           0 Aug 17 03:04 1
-rw-r--r--    1 laoliu   laoliu           0 Aug 17 03:04 2
-rw-r--r--    1 laoliu   laoliu           0 Aug 17 03:04 4
drwxr-xr-x    2 laoliu   laoliu           6 Aug 17 03:04 abc
/data $ id
uid=1001(laoliu) gid=1001(laoliu)
/data $ 


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

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

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

[laoliu@localhost ~]$ podman run  -d -p 1024:80 httpd
58613a6bdc70d4d4f9f624583f795a62a610596d166f0873bdff8fb26aa15092
[laoliu@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
//或者直接进入文件配置
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_unprivileged_port_start=80

[laoliu@localhost ~]$ podman run -d -p 80:80 httpd
dba150fe8a0dc8e6f75b0d3ffb4d61c58a187da93f843d89eaa2f1a6a706b54f
[laoliu@localhost ~]$ ss -antl
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                  *:80                *:*            
LISTEN  0       128               [::]:22             [::]:*            
[laoliu@localhost ~]$ 

你可能感兴趣的:(linux,运维,服务器)