podman

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             [::]:*            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值