podman容器操作
一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
上一篇文章,我们已经在 Centos 7上安装 podman 3.4.4,这次我们来看如何使用podman,如果熟悉docker,那么对于操作podman应该更加得心应手。
接上一回
上次centos 7安装podman 3.4.4, 我安装完了以后,就用root用户测试了一下没问题就撤了,今天来写文章的时候,发现普通用户上去执行run命令会失败,查阅了资料,记录一下
使用debug 跟踪一下命令 ./bin/podman --log-level=debug run -d nginx
报错如下:
解决:
上述异常经过排查,排查过程就不追溯了,是因为内核过低引起的,使用 uname -r可以查看内核版本,若小于4.18.0则需要升级才行。
参考:
升级内核(升级内核需要
root权限才行哈)
ps: 本次机器是测试机器,所以内核升级为最新内核,实际线上机器视情况而定,一般不建议升级为最新版本,除非你又特殊需求
centos7 kernel rpm 下载页面:elrepo.org/linux/kerne…
mkdir kernel
cd kernel/
wget https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.188-1.el7.elrepo.x86_64.rpm
wget https://lmdops.oss-cn-shanghai.aliyuncs.com/ops/oss/2022-04-02-18-25-27/kernel-lt-devel-5.4.188-1.el7.elrepo.x86_64.rpm
yum localinstall kernel-lt-* -y
grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
# reboot # 为避免复制粘贴,所以reboot 给屏蔽了的,更新完内核,需要重启才行
uname -r
确认完毕后,再次启动podman容器就正常了。
我会列举podman操作容器的相关命令,每条命令都跟上实例,当和docker不一致时,会着重解释这是为什么。
快速尝试
可以使用 podman run --help获取帮助
其中,常用podman run 参数
podman run [options] IMAGE [COMMAND [ARG...]]
选项为
--detach / -d : 将容器运行在后台,并且打印运行容器的ID
--attach / -a: 启动容器,并且连接到 标准输入(stdin)/标准输出(stdout)/错误输出(stderr)(将容器放至前台运行)
--name / -n: 为容器分配名称,若没有分配,则会为其分配随机字符串
--rm : 当容器退出后删除容器
--rmi: 当容器退出后若没有容器再使用该镜像时,会删除镜像,通常与--rm共同搭配使用
--tty / -t: 为容器分配tty
--interactive / -i: 即使容器未在前台运行,也将stdout连接出来,即 交互式(-a 包含了该操作)
使用 alpine输出 Hello World
命令: podman run alpine echo 'hello world'
创建 alpine容器,并且建立交互并且查看其ip后退出
命令: podman run -it alpine /bin/sh
-i: 打开交互式,若不适用-t选项,是无法输入任何命令的
-t: 打开终端,如果不适用-i选项,则打开后会立马退出掉
在后台运行nginx
命令: podman run -d nginx
-d: 将容器启动运行至后台
列出容器
podman 比 docker ps命令 新增了 如下参数
-p, --pod 列出POD相关信息
-w, --watch uint 以秒为单位输出ps
使用podman ps --help可以查看帮助
查看正在运行的容器
使用 podman ps可以查看
使用podman ps --ns 还可以显示用户空间
查看所有容器
使用podman ps -a可以查看
仅查看容器ID
使用podman ps -q可以查看容器ID
我记得很早之前,我是这么来获取ID的podman ps | awk 'NR>1 {print $1}'。。。
查看容器容量大小
使用podman ps -s可以查看容器占用空间
启动和停止容器
启动交互模式容器
还记得我们之前启的 alpine 容器么,它是交互式的,我们现在来启动它
命令 podman start -a -i 容器名称
启动非交互式容器
我们直接使用 podman start 容器名称即可
容器卷
为什么需要卷
- 可以持久保留容器中的数据
- 方便容器间共享
- 不会增加容器的大小
使用卷实例
我们尝试一下,我们建立一个卷,并且使用2个容器间共享
使用/podman volume create disk1创建disk1卷
我们创建一个容器并且将盘挂载上去
podman run -it -v disk1:/root/ alpine /bin/sh
想容器/root中创建一个文件
我们再次启动一个容器,并且将盘挂载上去
为避免混淆,我对容器命名了一个名字,我们查看 /root 下的文件
我们甚至于可以对文件添加内容
我们回到容器1 查看
删除容器
删除容器前,应当停止容器
删除某个容器
使用podman rm 容器名称 删除某个容器(容器必须在停止情况下才能删除)
心得体会
从上述来看,podman几乎完全兼容docker,也对,不兼容就死了,本来计划今天应该写得更多的,但是由于如开头所述,普通用户使用podman报文,耽搁些时间,所以后续的就没写了,后面再补充吧。
库
podman远程库不仅有 docker ,还有其他的,例如
会让我们选择一个源进行下载,当然,这些源都是可配置的
从卷来看podman和docker的区别
我们来看我们刚刚创建的卷
会发现 Mountpoint在 $HOME 下面
当你如果使用sudo进行创建的时候,你会发现 ,该卷 在 val下面
所以各个用户使用podman创建资源,并不会影响别的用户
而docker则不行,因为它有一个docker server代为执行,所以仅仅有一个路径,任何用户,只要有docker权限,都可以操作所有的资源,这是docker架构所决定的。
溜了 溜了

浙公网安备 33010602011771号