
以前学编程语言的时候,总是从 hello world 开始,
此处也就借用 hello world 来开始 podman
1. hello world
podman 能让你在容器内运行一个程序,
如:输出 hello world

如上:
podman run ubuntu:15.10 /bin/echo "hello world"
podman run
podman 的命令格式为:podman COMMAND ...
run 这个 COMMAND 用来 运行(启动)一个 容器
ununtu:15.10
用来指定要运行的 镜像,
podman 首先会在本地主机上查找该镜像是否存在,
镜像不存在的话,就会到 镜像仓库 里面下载镜像,(如上行 3,可以看到 podman 也是到 docker 仓库查找镜像)
/bin/echo "Hello world"
在容器里面执行的命令,最后一行可以看到输出的结果
好多时候会是 /bin/bash,来配合其他选项(-i,-t)提供一个 shell 环境
2. 容器几个基本的概念
(虽然这些文章是说 podman,但在初学的过程中,感觉理解 podman 无法避开 docker 的样子,所以会有一些 docker 的内容;podman 和 docker 的使用类似,(类比 yum 和 dnf),命令有很大的重合部分)
docker 中的基本组成:
-
镜像(image)
-
镜像可以理解为一个“模板”,是一个静态的磁盘文件,这个文件里面会包含一些特定的软件包,
-
如:将 apache 的相关内容制作为一个镜像,将来加载运行这个镜像的时候,就得到了一个可以运行 apache 的环境。
-
类比:虚拟机中安装 CentOS 8 的时候,需要一个 CentOS 8 的 iso 镜像
-
(上一节 OCI 提到,主要的标准之一就是 Image)
-
-
容器(container)
- 镜像运行起来后,就是一个容器
-
仓库
-
仓库就是用来保存镜像,本机上没有的镜像,就到仓库里面查找。
-
类比 yum 本机上没有的程序,就到仓库里面查找
-
公开仓库
-
私有仓库(个人搭建)
-
3. 运行交互式容器
过 podman 的两个参数 -i -t 让 podman 运行的容器提供“交互”界面
(docker 也是一样,前面说过 podman 和 docker 的命令有很大一部分重合,后续不在赘述)
-i | --interactive
Keep STDIN open even if not attached
-t | --tty
Allocate a pseudo-TTY for container (也就是提供一个终端)
示例如下:

如上:
前面说过 podman run 是将一个镜像(ubuntu:15.10)运行起来,得到一个容器,
这个容器需要执行 /bin/bash 这个命令,
通过 -i 和 -t 参数,来运行容器中的 bash ,保留了交互的 tty,得到了一个可以交互的界面,
可以看到,执行 podman run 命令前后,
由 centos 变成了 unbutu,
且 PS1 也有了明显的变化。
退出交互 tty,可以通过 exit 或 ctrl+d
4. 后台运行容器
比如说,apache 提供的网页服务,并不需要他一直在终端里面进行交互,
有的时候希望他在后台运行,提供服务即可。
4.1 后台运行
后台运行容器需要选项:
-d | --detach
Run container in background and print container ID(也就是在后台运行容器,并打印出容器的 ID)
示例如下:
podman run -d ubuntu:15.10 /bin/bash -c \ "while true; do echo hello world; sleep 1; done"
bash -c "xxx" 大概的意思就是将 xxx 当做一个命令来执行,可以 man bash 具体查看。
"while true; do echo hello world; sleep 1; done" 展开得:
while true
do
echo hello world
sleep 1
done
也就是无限进行循环下面的内容:
输出 hello world,然后 休息 1 秒,
总体来说,就是运行容器,然后再后台无限进行循环。
运行截图如下:
如上,
运行命令后,只输出了一个字符串,表示容器的 ID
具体执行的内容都在后台。
4.2 podman ps
接下来,第二个 podman 的命令:
podman ps
可以查看 正在运行 的容器
可以有选项:
--all | -a
Show all the containers created by Podman,
default is only running containers.(也就是 podman ps 默认情况下只会显示运行中的容器)
选项 -a 的示例后续再来

如上图:
第一字段,Container ID,也就是容器 ID
第二字段,容器使用的 Image(前面说过,podman 运行 Image 后,就得到了容器)
第三字段,启动容器时候运行的命令
第四字段,容器创建的时间 Created
第五字段,容器状态 Status
- created (已创建)
- restarting (重启中)
- running 或 Up (运行中,上图就是 UP 状态)
- removing (迁移中)
- paused (暂停)
- exited (停止)
- dead (死亡)
上图,太长了,没截完,

第六字段,容器的端口信息和使用的连接类型(tcp\udp) Ports
第七字段,自动分配的容器名称,Names
可以通过容器的 ID 和 Name 来指定容器,
运行容器时,可以通过 --name XXX 来自己指定容器的名字,需要唯一
额外的示例,如:

4.3 podman log
podman log XXX
podman logs 命令能够查看到容器内的标准输出
上面的例子中,不是在后台一直输出 hello world 嘛,通过这个命令能够看到

如上,
前面说过,可以使用 容器名、容器 ID 来指定具体的容器
5. 进入后台运行的容器
前面提到,-d 选项会使得容器在后台运行,
如果想要进入后台运行中的容器,可以:
5.1 podman attach
podman attach XXX
示例如下:

如上,
podman attach test,进入 test 这个容器后,能发现 PS1 有了明显的变化,表明进入了容器。
通过 podman attach 进入容器后,如果从里面退出,会导致容器的停止。
5.2 podman exec
podman exec XXX
示例如下:

如上,
podman exec 一个后台容器,在退出后,容器依旧在运行,
因此,推荐使用 exec 进入容器,这样的话,退出的时候,不会导致容器停止。
6. 停止容器
podman stop
能够停止容器的运行

类似于 stop,还有 podman restart xxx 命令可以对容器重启
前面说过 podman ps 是查看 运行中的容器,
因此,上图中的容器停止以后,podman ps 就看不到容器了
但是 podman ps -a 就能看到该容器,只不过状态是 Exited
7. 启动已经停止的容器
对于已经停止的容器,可以使用于 podman start 来启动,
如:

如上,原本容器状态是 Exited,通过 start 命令之后,变为了 Up
8. 删除容器
8.1 podman rm
podman rm will remove one or more containers from the host.
前面说的 stop 容器,容器依旧存在,只不过状态是 Exited,
要想容器消失,还是需要将容器删除掉。

如上,
podman stop 后的容器,状态为 exited
通过 podman rm 可以将这些容器删除掉
对于 up 的容器无法删除,(需要 -f | --force)
8.2 --rm 选项

如上,
通过 stop 停止的容器,是状态变为了 Exited,需要通过 rm 删除,
可以在运行容器的时候添加 --rm 选项,表示退出的时候将容器删除
--rm
Remove container (and pod if created) after exit

如上,
运行容器的时候,添加了 --rm 选项,
行 4 退出容器后,ps -a,并没有 Exited 状态的容器
9. 帮助信息
podman COMMAND --help
man podman-COMMAND