无根用户管理podman
在允许没有root特权的用户运行Podman之前,管理员必须安装或构建Podman并完成以下配置
cgroup V2Linux内核功能允许用户限制普通用户容器可以使用的资源,如果使用cgroupV2启用了运行Podman的Linux发行版,则可能需要更改默认的OCI运行时。某些较旧的版本runc不适用于cgroupV2,必须切换到备用OCI运行时crun。
[root@localhost ~]# dnf -y install crun //centos8自带
Failed to set locale, defaulting to C.UTF-8
Last metadata expiration check: 6:48:58 ago on Tue Aug 16 12:24:31 2022.
Dependencies resolved.
[root@localhost ~]# rpm -qa | grep crun
crun-1.0-1.module_el8.5.0+911+f19012f9.x86_64
[root@192 ~]# vim /usr/share/containers/containers.conf
runtime = "crun" //取消这一行注释
#runtime = "runc" //这一行加上注释
[root@localhost ~]# podman run -d --name web1 -p 80:80 httpd
c399e2dbfdda9b5a43778968754b9af01c97929f0277cd42b2ed0bb4945f0746
[root@localhost ~]# podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c399e2dbfdda registry.fedoraproject.org/f29/httpd:latest /usr/bin/run-http... 7 seconds ago Up 7 seconds ago 0.0.0.0:80->80/tcp web1
[root@localhost ~]# podman inspect -l | grep crun
"OCIRuntime": "crun",
"crun",
安装slirp4netns和fuse-overlayfs
在普通用户环境中使用Podman时,建议使用fuse-overlayfs而不是VFS文件系统,至少需要版本0.7.6。现在新版本默认就是了。
[root@192 ~]# yum -y install slirp4netns
[root@192 ~]# yum -y install fuse-overlayfs
[root@192 ~]# vim /etc/containers/storage.conf
mount_program = "/usr/bin/fuse-overlayfs" //77行 取消掉此行注释
/ etc / subuid和/ etc / subgid配置
Podman要求运行它的用户在/ etc / subuid和/ etc / subgid文件中列出一系列UID,shadow-utils或newuid包提供这些文件
[root@192 ~]# useradd lx
[root@192 ~]# cat /etc/subuid
lx:100000:65536
[root@192 ~]# cat /etc/subgid
lx:100000:65536
// 启动非特权ping
[root@192 ~]# vim /etc/sysctl.conf //永久修改
net.ipv4.ping_group_range = 0 200000 大于100000这个就表示lx可以操作podman
这个文件的格式是 USERNAME:UID:RANGE中/etc/passwd或输出中列出的用户名getpwent。
- 为用户分配的初始 UID。
- 为用户分配的 UID 范围的大小。
该usermod程序可用于为用户分配 UID 和 GID,而不是直接更新文件。
[root@192 ~]# cat /etc/subgid
lx:100000:65536
nidaye:165536:65536
[root@192 ~]#
[root@192 ~]# usermod --add-subuids 200000-201000 --add-subgids 200000-201000 nidaye
[root@192 ~]# cat /etc/subgid
lx:100000:65536
nidaye:165536:65536
[root@192 ~]#
用户配置文件
三个主要的配置文件是container.conf、storage.conf和registries.conf。用户可以根据需要修改这些文件。
container.conf
cat /usr/share/containers/containers.conf //优先级最低
cat /etc/containers/containers.conf
cat ~/.config/containers/containers.conf //优先级最高
storage.conf
1./etc/containers/storage.conf
2.$HOME/.config/containers/storage.conf
在普通用户中**/etc/containers/storage.conf**的一些字段将被忽略
[root@192 ~]# vim /etc/containers/storage.conf
# Default Storage Driver, Must be set for proper operation.
driver = "overlay" #此处改为overlay 一般默认就是不用改
.......
mount_program = "/usr/bin/fuse-overlayfs" #取消注释
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@192 ~]# podman login
Username: xiaoapihai123
Password:
Error: error logging into "docker.io": invalid username/password
[root@192 ~]# podman login
Username: xiaopihai123
Password:
Login Succeeded!
[root@192 ~]# cat /run/user/0/containers/auth.json
{
"auths": {
"docker.io": {
"auth": "eGlhb3BpaGFpMTIzOjIwMDIwNDI0bHg="
}
}
}[root@192 ~]#
普通用户是无法看见root用户的镜像的
[root@192 ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/alpine latest 9c6f07244728 7 days ago 5.83 MB
localhost/xiaopihai123/alpine v0.1 9c6f07244728 7 days ago 5.83 MB
docker.io/library/busybox latest 7a80323521cc 2 weeks ago 1.47 MB
registry.fedoraproject.org/f29/httpd latest 25c76f9dcdb5 3 years ago 482 MB
[root@192 ~]# su - lx
[lx@192 ~]$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
无根用户的卷管理
- 容器与root用户一起运行,则root容器中的用户实际上就是主机上的用户。
- UID GID是在/etc/subuid和/etc/subgid等中用户映射中指定的第一个UID GID。
- 如果普通用户的身份从主机目录挂载到容器中,并在该目录中以根用户身份创建文件,则会看到它实际上是你的用户在主机上拥有的。
[root@192 ~]# su - lx
[lx@192 ~]$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
[lx@192 ~]$ pwd
/home/lx
[lx@192 ~]$ mkdir /home/lx/data
[lx@192 ~]$ podman run -it -v "$(pwd)"/data:/data docker.io/library/busybox /bin/sh
Trying to pull docker.io/library/busybox:latest...
Getting image source signatures
Copying blob 50783e0dfb64 done
Copying config 7a80323521 done
Writing manifest to image destination
Storing signatures
/ # ls
bin data dev etc home proc root run sys tmp usr var
/ # cd /data/
/data # ls
/data # touch lxx
/data # ls -l
total 0
-rw-r--r-- 1 root root 0 Aug 17 04:28 lxx
/data # cat lxx
/data # ls
lxx
在主机上查看
[lx@192 ~]$ ll data/
total 0
-rw-r--r-- 1 lx lx 0 Aug 17 12:28 lxx
往里面写入东西
[lx@192 data]$ echo "hell world" >> lxx
回到容器查看
/data # cat lxx
hell world
我们可以发现在容器里面的文件的属主和属组都属于root
让其属于tom用户,只需要在运行容器的时候加上一个--userns=keep-id即可。
[lx@192 ~]$ podman run -it --name test -v "$(pwd)"/data:/data --userns=keep-id docker.io/library/busybox /bin/sh
~ $ ls
bin data dev etc home proc root run sys tmp usr var
~ $ cd data/
/data $ ls -l
total 4
-rw-r--r-- 1 lx lx 0 Aug 17 04:32 123
-rw-r--r-- 1 lx lx 12 Aug 17 04:32 lxx
使用普通用户映射容器端口时会报“ permission denied”的错误
[lx@192 data]$ podman run -d -p 80:80 nginx
Resolving "nginx" using unqualified-search registries (/etc/containers/registries.conf)
Trying to pull docker.io/library/nginx:latest...
配置echo ‘net.ipv4.ip_unprivileged_port_start=80’ >> /etc/sysctl.conf后可以映射大于等于80的端口
[root@192 ~]# vim /etc/sysctl.conf
[root@192 ~]# sysctl -p
net.ipv4.ping_group_range = 0 200000
net.ipv4.ip_unprivileged_port_start = 80
再次拉取
[lx@192 data]$ podman run -d -p 80:80 nginx
Resolving "nginx" using unqualified-search registries (/etc/containers/registries.conf)
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob 6a17c8e7063d done
Copying blob 05396a986fd3 done
Copying blob baf2da91597d [======>------------------------------] 4.8MiB / 24.2MiB
Copying blob b1349eea8fc5 done
Copying blob 1efc276f4ff9 [=====>-------------------------------] 5.2MiB / 29.9MiB
Copying blob 27e0d286aeab done
Copying blob baf2da91597d [==>------------------------------] 4.8MiB / 24.2MiB
Copying blob b1349eea8fc5 done
Copying blob 1efc276f4ff9 [=>-------------------------------] 5.2MiB / 29.9MiB
Copying blob 27e0d286aeab done