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.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以下,则需要做以下操作: [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 [::]:*