podman
使用podman
使用 Podman 非常的简单,Podman 的指令跟 Docker 大多数都是相同的。下面我们来看几个常用的例子:
查看镜像
[root@localhost ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/busybox latest 7a80323521cc 2 weeks ago 1.47 MB
docker.io/library/httpd latest dabbfbe0c57b 7 months ago 148 MB
quay.io/centos/centos latest 300e315adb2f 20 months ago 217 MB
创建容器
[root@localhost ~]# podman run -dit --name tnt httpd
58dd64754c15eb2d28f7d95279065f648778b2d798ca16a1fd4bb1a8ed8a7aa8
查看运行容器
[root@localhost ~]# podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58dd64754c15 docker.io/library/httpd:latest httpd-foreground 54 seconds ago Up 53 seconds ago tnt
注意:如果在ps命令中添加-a,Podman 将显示所有容器。
检查正在运行的容器
您可以“检查”正在运行的容器的元数据和有关其自身的详细信息。我们甚至可以使用 inspect 子命令查看分配给容器的 IP 地址。由于容器以无根模式运行,因此未分配 IP 地址,并且该值将在检查的输出中列为“无”
[root@localhost ~]# podman inspect -l |grep -i address
"IPAddress": "10.88.0.2",
"GlobalIPv6Address": "",
"MacAddress": "12:39:5a:b4:87:92",
"LinkLocalIPv6Address": "",
"IPAddress": "10.88.0.2",
"GlobalIPv6Address": "",
"MacAddress": "12:39:5a:b4:87:92",
[root@localhost ~]# curl 10.88.0.2
<html><body><h1>It works!</h1></body></html>
注意:-l 是最新容器的便利参数。您还可以使用容器的 ID 代替 -l
查看一个运行容器中的进程资源使用情况,可以使用top观察容器中的 nginx pid
[root@localhost ~]# podman top tnt
USER PID PPID %CPU ELAPSED TTY TIME COMMAND
root 1 0 0.000 8m58.057603378s pts/0 0s httpd -DFOREGROUND
www-data 7 1 0.000 8m58.058007778s pts/0 0s httpd -DFOREGROUND
www-data 8 1 0.000 8m58.058235479s pts/0 0s httpd -DFOREGROUND
www-data 9 1 0.000 8m58.058346079s pts/0 0s httpd -DFOREGROUND
停止一个运行中的容器
[root@localhost ~]# podman stop -l
58dd64754c15eb2d28f7d95279065f648778b2d798ca16a1fd4bb1a8ed8a7aa8
[root@localhost ~]# podman ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
删除一个容器
[root@localhost ~]# podman rm -l
58dd64754c15eb2d28f7d95279065f648778b2d798ca16a1fd4bb1a8ed8a7aa8
[root@localhost ~]# podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
用户操作
在允许没有root特权的用户运行Podman之前,管理员必须安装或构建Podman并完成以下配置
cgroup V2Linux内核功能允许用户限制普通用户容器可以使用的资源,如果使用cgroupV2启用了运行Podman的Linux发行版,则可能需要更改默认的OCI运行时。某些较旧的版本runc不适用于cgroupV2,必须切换到备用OCI运行时crun。
[root@localhost ~]# yum install -y crun
[root@localhost ~]# vim /usr/share/containers/containers.conf
# Default OCI runtime
#
runtime = "crun"
#runtime = "runc"
取消runtime 注释 改crun
下面一行注释
[root@localhost ~]# podman run -d --name mjq httpd
64f52f72c757de9be46e0a5b9c0608cec0cddbdd7a842d87392742fd8084a985
[root@localhost ~]# podman inspect -l | grep crun
"OCIRuntime": "crun",
"crun",
安装slirp4netns和fuse-overlayfs
在普通用户环境中使用Podman时,建议使用fuse-overlayfs而不是VFS文件系统,至少需要版本0.7.6。现在新版本默认就是了。
[root@localhost ~]# yum -y install -y slirp4netns
[root@localhost ~]# yum install -y fuse-overlayfs
[root@localhost ~]# vim /etc/containers/storage.conf
mount_program = "/usr/bin/fuse-overlayfs"
取消注释
etc / subuid和/ etc / subgid配置
Podman要求运行它的用户在/ etc / subuid和/ etc / subgid文件中列出一系列UID,shadow-utils或newuid包提供这些文件
[root@localhost ~]# useradd aa
[root@localhost ~]# cat /etc/subuid
aa:100000:65536
[root@localhost ~]# cat /etc/subgid
aa:100000:65536
[root@localhost ~]# vim /etc/sysctl.conf
在最后一行添加
net.ipv4.ping_group_range=0 200000
[root@localhost ~]# sysctl -p
net.ipv4.ping_group_range = 0 200000
这个文件的格式是 USERNAME:UID:RANGE中/etc/passwd或输出中列出的用户名getpwent。
为用户分配的初始 UID。
为用户分配的 UID 范围的大小。
该usermod程序可用于为用户分配 UID 和 GID,而不是直接更新文件。
[root@localhost ~]# usermod --add-subuids 200000-201000 --add-subgids 200000-201000 aa
[root@localhost ~]# cat/etc/subuid
-bash: cat/etc/subuid: No such file or directory
[root@localhost ~]# cat /etc/subuid
aa:100000:65536
bb:165536:65536
aa:200000:1001
在普通用户中/etc/containers/storage.conf的一些字段将被忽略
[root@localhost ~]# vim /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
[root@localhost ~]# sysctl -p
net.ipv4.ping_group_range = 0 200000
user.max_user_namespaces = 15000
在普通用户中这些字段默认
graphroot="$HOME/.local/share/containers/storage"
runroot="$XDG_RUNTIME_DIR/containers"
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: gbj1123
Password:
Login Succeeded!
[root@localhost ~]# cat /run/user/0/containers/auth.json
{
"auths": {
"docker.io": {
"auth": "Z2JqMTEyMzpzZHNudDExMjM="
}
}
普通用户是无法看见root用户的镜像的
[root@localhost ~]# podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/library/busybox latest 7a80323521cc 2 weeks ago 1.47 MB
docker.io/library/httpd latest dabbfbe0c57b 7 months ago 148 MB
quay.io/centos/centos latest 300e315adb2f 20 months ago 217 MB
[root@localhost ~]# su - aa
[aa@localhost ~]$ podman images
REPOSITORY TAG IMAGE ID CREATED SIZE
卷
容器与root用户一起运行,则root容器中的用户实际上就是主机上的用户。
UID GID是在/etc/subuid和/etc/subgid等中用户映射中指定的第一个UID GID。
如果普通用户的身份从主机目录挂载到容器中,并在该目录中以根用户身份创建文件,则会看到它实际上是你的用户在主机上拥有的
使用卷
[aa@localhost ~]$ mkdir /home/aa/data
[aa@localhost ~]$ ls
data
[aa@localhost ~]$ podman run -it -v $(pwd)/data:/data busybox /bin/sh
Resolved "busybox" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
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 dev home root sys usr
data etc proc run tmp var
/ # cd data
/data # ls
ls: can't open '.': Permission denied
添加Z
[aa@localhost ~]$ podman run -it -v $(pwd)/data:/data:Z busybox /bin/sh
/ # cd data
/data # ls
/data # touch 1 2 3
/data # ls
1 2 3
/data # ls -l
total 0
-rw-r--r-- 1 root root 0 Aug 15 08:47 1
-rw-r--r-- 1 root root 0 Aug 15 08:47 2
-rw-r--r-- 1 root root 0 Aug 15 08:47 3
在主机上查看
[aa@localhost ~]$ ll data
total 0
-rw-r--r--. 1 aa aa 0 Aug 15 16:47 1
-rw-r--r--. 1 aa aa 0 Aug 15 16:47 2
-rw-r--r--. 1 aa aa 0 Aug 15 16:47 3
[aa@localhost ~]$ echo "tnt" >> 1
[aa@localhost ~]$ cat 1
tnt
容器里查看
/data # cat 1
tnt
我们可以发现在容器里面的文件的属主和属组都属于root,那么如何才能让其属于tom用户呢?下面告诉你答案
只要在运行容器的时候加上一个--userns=keep-id即可。
[aa@localhost ~]$ podman run -it -v $(pwd)/data:/data:Z --userns=keep-id busybox /bin/sh
~ $ ls
bin dev home root sys usr
data etc proc run tmp var
~ $ cd data
/data $ ll
/bin/sh: ll: not found
/data $ touch e
/data $ ls -l
total 4
-rw-rw-r-- 1 aa aa 4 Aug 15 08:56 1
-rw-rw-r-- 1 aa aa 0 Aug 15 08:55 2
-rw-rw-r-- 1 aa aa 0 Aug 15 08:55 3
-rw-r--r-- 1 aa aa 0 Aug 15 09:03 e
使用普通用户映射容器端口时会报“ permission denied”的错误
[aa@localhost ~]$ podman run -d -p 80:80 busybox
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的端口
[aa@localhost ~]$ podman run -d -p 1025:80 busybox
a062aa367824df0247d7be74df38a9fa5ee1d9b4cc728c8f05f8c4be97de6b4d
[aa@localhost ~]$ ss -anlt
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 *:1025 *:*
LISTEN 0 128 [::]:22 [::]:*
配置echo ‘net.ipv4.ip_unprivileged_port_start=80’ >> /etc/sysctl.conf后可以映射大于等于80的端口
[root@localhost ~]# vim /etc/sysctl.conf
net.ipv4.ip_unprivileged_port_start=80 添加
[root@localhost ~]# sysctl -p
net.ipv4.ping_group_range = 0 200000
user.max_user_namespaces = 15000
net.ipv4.ip_unprivileged_port_start = 80
[aa@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 *:1024 *:*
LISTEN 0 128 [::]:22 [::]:*
[aa@localhost ~]$
[aa@localhost ~]$ podman run -d -p 80:80 httpd
9817398745bc619ca9f62feaf717b74f633c73c5590ad8ee2229f16d8d797aaa
[aa@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 *:1024 *:*
LISTEN 0 128 *:80 *:*
LISTEN 0 128 [::]:22 [::]:*