🙏废话不多说系列,直接开整🙏
一、快速开始
Podman 是作为 libpod 库的一部分提供的一个实用程序。它可以用来创建和维护容器。下面的教程将教你如何设置Podman 并执行一些基本命令。
二、安装 Podman
(1)CentOS 8 环境
# 1.安装 container-tools(即安装 podman)
## 1.1 容器工具基于模块
$ yum -y module install container-tools
## 1.2 安装 docker 兼容包(可选,安装了此指令包就可将Podman指令用docker为指令开头执行)
$ yum -y install podman-docker
# 2.检查是否安装podman成功
## 2.1 检查 podman 是否安装成功
$ podman -v
podman version 3.3.1
## 2.2 检查 podman-docker 是否安装成功
$ docker -v
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
podman version 3.3.1
(2)Ubuntu 22+ 环境
留给读者 ~
三、Podman 基本使用
(1)帮助指令
# 1.查看podman 命令的相关帮助文案
$ podman --help
# 1.1 查看具体命令的使用说明手册
$ podman <subcommand> --help
# 2.查看更详细的podman文档
$ man podman
# 2.1 查看具体命令的详细帮助手册
$ man podman-<subcommand>
# 普通用户是无法查看到root用户的镜像
(2)快速查找、获取、部署镜像
# 1. 【查询】Podman可以使用一些简单的关键字搜索远程注册表上的图像。
$ podman search <search_term>
# 1.1 【过滤查询】你也可以用过滤器来增强你的搜索效果:(只显示官方的)
$ podman search httpd --filter=is-official
# 1.2 示例:只查询官方的redis镜像
$ podman search redis --filter=is-official
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/library/redis Redis is an open source key-value store that... 11079 [OK]
# 2. 【拉取镜像】下载(拉)一个图像也很容易,例如
$ podman pull docker.io/library/httpd
# 2.1 拉出一些图像后,您可以列出计算机上的所有图像。
$ podman images
🌹 温馨提示:
- podman 作为 docker 的替代品,有关中央镜像信息,你可以参考 docker.io 上的信息。
- Podman在不同的注册表中搜索。因此,建议使用完整的映像名称(docker.io /library/httpd而不是httpd),以确保您使用的是正确的映像。
(3)运行一个容器
# 这个示例容器将运行一个非常基本的httpd服务器,它只提供其索引页。
$ podman run -dt -p 8080:80/tcp docker.io/library/httpd
🌹 温馨提示:
- 因为容器以分离模式运行(由podman run命令中的-d表示),所以podman将在执行命令后打印容器ID。-t还添加了一个伪tty,用于在交互式shell中运行任意命令。
- 我们使用端口转发来访问HTTP服务器。要成功运行,至少需要slirp4netns v0.3.0。
(4)列举容器
# podman ps命令用于列出已创建和正在运行的容器。
$ podman ps
如果在【 podman ps 】命令中添加 【-a】, podman将显示所有容器(已创建、已退出、正在运行等)。
# 获取所有容器状态的容器
# 如果在【podman ps】命令中添加【-a】, podman将显示所有容器(已创建、已退出、正在运行等)。
$ podman ps -a
(5)测试 httpd 容器
# 测试方法一:正如您所看到的,容器没有分配IP地址。该容器可通过其在本地机器上发布的端口访问。
$ curl http://localhost:8080
# 注意:从另一台机器,您需要使用主机的IP地址,运行容器。
$ curl http://<IP_Address>:8080
# 测试方法二:您还可以将浏览器指向http://localhost:8080,而不是使用curl。
(6)检查运行中的容器
您可以“检查”正在运行的容器,以查看其元数据和关于其自身的详细信息。波德曼检查将提供许多有用的信息,如环境变量,网络设置或分配的资源。
因为容器是在无根模式下运行的,所以不会为容器分配IP地址。
$ podman inspect -l | grep IPAddress
"IPAddress": "",
🌹 温馨提示:
- -l 是最新容器的一个方便参数。您也可以使用 【容器的ID 或名称】来代替 -l 或较长的参数 --latest。
- 如果您正在运行远程Podman客户端,包括Mac和Windows(不包括WSL2)机器,-l 选项不可用。
(7)查看容器日志
# Viewing the container’s logs
# 你也可以用Podman查看容器的日志:
$ podman logs -l
127.0.0.1 - - [04/May/2020:08:33:48 +0000] "GET / HTTP/1.1" 200 45
......
(8)查看容器的 pid
$ podman top -l
USER PID PPID %CPU ELAPSED TTY TIME COMMAND
root 1 0 0.000 22m13.33281018s pts/0 0s httpd -DFOREGROUND
daemon 3 1 0.000 22m13.333132179s pts/0 0s httpd -DFOREGROUND
daemon 4 1 0.000 22m13.333276305s pts/0 0s httpd -DFOREGROUND
daemon 5 1 0.000 22m13.333818476s pts/0 0s httpd -DFOREGROUND
(9)终止容器
$ podman stop -l
# 可以使用podman ps命令检查一个或多个容器的状态。在这种情况下,您应该使用-a参数列出所有容器。
$ podman ps -a
(10)删除容器
# 最后,你可以删除容器
$ podman rm -l
# 您可以通过运行【podman ps -a】来验证是否删除了容器。
四、Podman 案例
(1)部署 web 服务相关 CRUD 操作
参考文章:Podman开机自启容器实现过程及与Docker对比 (360doc.com)
提示:此案例用来部署一个web服务(Nginx 服务),并模拟迭代发布过程一下操作:
- 获取镜像;
- 启动镜像;
- 开启一个容器;
- 修改容器并重新发布;
- 终止容器并删除容器;
- 设置容器开启自启动♥;
# 0.查看是否存在nginx的官方镜像
$ podman search nginx --filter=is-official
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/library/nginx Official build of Nginx. 17015 [OK]
# 1.获取nginx服务镜像
## $ podman pull nginx
$ podman pull docker.io/library/nginx
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob b85a868b505f skipped: already exists
Copying blob f4407ba1f103 done
Copying blob fe0ef4c895f5 done
Copying blob 4a7307612456 done
Copying blob 935cecace2a0 done
Copying blob 8f46223e4234 done
Copying config 55f4b40fe4 done
Writing manifest to image destination
Storing signatures
55f4b40fe486a5b734b46bb7bf28f52fa31426bf23be068c8e7b19e58d9b8deb
# 2.准备一份 html页面用户 更换 nginx的index.html首页页面
## 2.1 在 目录 /opt/web-html 下提供 新的nginx首页文件 index.html 文件
$ cd /opt/web-html
$ touch index.html
## 添加下方内容
Hello World!
This is another nginx-index.html
$ cat /opt/web-html/index.html
Hello World!
This is another nginx-index.html
# 3.podman 启动 nginx 并将宿主机上的/opt/web-html/nginx-index.html 文件挂在到 nginx的index.html
$ podman run -d --name nginx-web-1 -p 8888:80 -v /opt/web-html:/usr/share/nginx/html docker.io/library/nginx
0a89618db7d09c65d368d2a8ac2eb28035d3253980b49a29f50930e5aece2610
# 4.访问nginx(检测是否启动成功)
$ curl localhost:8888 #或者直接通过域名访问: curl 192.168.174.157:8888
Hello World!
This another nginx-index.html
# 5.查看容器的IP地址
$ podman inspect nginx-web-1 | grep IPAddress
"IPAddress": "10.88.0.5",
"IPAddress": "10.88.0.5",
# 6.查看宿主机的IP
$ ip r
default via 192.168.174.2 dev ens33 proto dhcp metric 100
10.88.0.0/16 dev cni-podman0 proto kernel scope link src 10.88.0.1
192.168.174.0/24 dev ens33 proto kernel scope link src 192.168.174.157 metric 100
## 看到宿主机器的IP地址为 192.168.174.157
## 由于进行了端口绑定(8888:80 且另外进行容器IP和宿主机的IP做了对应关系),所以直接可以
$ curl 192.168.174.157:8888
# 7.进入容器 nginx-web-1 后台,查看 nginx服务的状态
$ podman exec -it nginx-web-1 /bin/bash
root@0a89618db7d0:/# service nginx status
nginx is running. ####### 此处显示【nginx】正在运行中
root@0a89618db7d0:/#
####【第二部分:修改容器内容】######################
# 8.修改宿主机 /opt/nginx-web/index.html 即可, 并修改内容为
$ cat /opt/web-html/index.html
Hello World!
This another nginx-index.html [upate this text]
# 9.再次进行访问(显示更新成功)
$ curl 192.168.174.157:8888
Hello World!
This another nginx-index.html [upate this text]
# 10.再进入容器内部查看是否修改成功(显示修改成功)
[root@localhost web-html]# podman exec -it nginx-web-1 /bin/bash
root@0a89618db7d0:/# cat /usr/share/nginx/html/index.html
Hello World!
This another nginx-index.html [update this text]
root@0a89618db7d0:/# exit
exit
####【第三部分:暂停-删除容器】######################
# 11.暂停 nginx-web-1 服务
$ podman stop nginx-web-1 #或者 podman stop [容器ID]
nginx-web-1
# 12.删除容器nginx-web-1 (或 强制删除容器:podman rm -f nginx-web-1)
$ podman rm nginx-web-1
0a89618db7d09c65d368d2a8ac2eb28035d3253980b49a29f50930e5aece2610
####【第四部分:设置容器开机自启】######################
# 1.启动一个web容器服务
$ podman run --name nginx-web-2 -d -p 8080:80 -v /opt/web-html:/usr/share/nginx/html docker.io/library/nginx:latest
4ff014d0b931941a790a1a319d0f81dbef561e6469d9a3e13871833776d364f5
## 基于web容器,优先级一般在 /etc/systemd/system 内
# 2.创建.service 单元文件
$ cd /etc/systemd/system
$ podman generate systemd --name nginx-web-2 --files --new ##输出文件
/etc/systemd/system/container-web.service
# 3.查看生成的.service文件
$ cat /etc/systemd/system/container-nginx-web-2.service
###### 文件内容如下---开始 ######
# container-nginx-web-2.service
# autogenerated by Podman 3.3.1
# Wed Jun 29 02:44:59 PDT 2022
[Unit]
Description=Podman container-nginx-web-2.service #解释:服务的描述
Documentation=man:podman-generate-systemd(1) #解释:帮助以及生成的系统
Wants=network-online.target #解释:网络
After=network-online.target
RequiresMountsFor=%t/containers #解释:前面不重要直接跳过
[Service]
Environment=PODMAN_SYSTEMD_UNIT=%n
Restart=on-failure #解释:故障时重新启动
TimeoutStopSec=70 #解释:超时时间
ExecStartPre=/bin/rm -f %t/%n.ctr-id
# ↓解释:执行开始为 /usr/bin/podman,运行刚才创建的容器
ExecStart=/usr/bin/podman run --cidfile=%t/%n.ctr-id --sdnotify=conmon --cgroups=no-conmon --rm --replace --name nginx-web-2 -d -p 8080:80 -v /opt/web-html:/usr/share/nginx/html docker.io/library/nginx:latest
ExecStop=/usr/bin/podman stop --ignore --cidfile=%t/%n.ctr-id
ExecStopPost=/usr/bin/podman rm -f --ignore --cidfile=%t/%n.ctr-id
Type=notify
NotifyAccess=all
[Install]
WantedBy=multi-user.target default.target
###### 文件内容如上---结束 ######
# 4.删除刚才创建的容器(注意:如果删除失败可尝试强制删除)
# $ podman rm nginx-web-2
[root@localhost system]# podman rm nginx-web-2
Error: cannot remove container 4ff014d0b931941a790a1a319d0f81dbef561e6469d9a3e13871833776d364f5 as it is running - running or paused containers cannot be removed without force: container state improper
[root@localhost system]# podman rm -f nginx-web-2
4ff014d0b931941a790a1a319d0f81dbef561e6469d9a3e13871833776d364f5
# 5.【重点:设置开机自启】
$ systemctl daemon-reload
$ systemctl enable --now container-nginx-web-2.service
## 5.1发现启动成功(STATUS: UP)
$ podman ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5022da9e0066 docker.io/library/nginx:latest nginx -g daemon o... 19 seconds ago Up 19 seconds ago 0.0.0.0:8080->80/tcp nginx-web-2
## 5.2 适用Linux-CentOS8 的service 指令来查看 nginx-web-2服务状态
$ service container-nginx-web-2 status # 注意:这里时 .service文件而不是podman容器服务名哦(即container-nginx-web-2)
## 5.3 当然,我们可以利用service指令来 关闭/重启/开启 container-nginx-web-2 容器 nginx-web-2 服务。
# $ service container-nginx-web-2 stop
# $ service container-nginx-web-2 restart
# $ service container-nginx-web-2 start
## 说明:
### 1. 无根root模式(rootless)设置容器和上面这种方式大同小异
### 2. 适用 systemctl 命令带上 --user 即可
五、Podman 扩展
(1)在 podman 上允许 docker 指令
# 判断是否安装了 docker 容器
## 1.如果出现了docker 的版本,则说明安装了 docker 指令(容器)
$ docker -v
## 2.没有出现docker容器,则在CentOS上会提示安装 podman-docker 指令包
$ docker -v
bash: docker: command not found...
Install package 'podman-docker' to provide command 'docker'? [N/y] y
* Waiting in queue...
* Loading list of packages....
The following packages have to be installed:
podman-docker-3.3.1-9.module_el8.5.0+988+b1f0b741.noarch Emulate Docker CLI using podman
Proceed with changes? [N/y] y
* Waiting in queue...
* Waiting for authentication...
* Waiting in queue...
* Downloading packages...
* Requesting data...
* Testing changes...
* Installing packages...
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
podman version 3.3.1
## 2.2 将podman指令按照 docker 写法运行
$ docker -v
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
podman version 3.3.1
## 2.x 至此,podman-docker podman指令用 docker 执行安装包运行成功。
(2)查看指令选项的前N个参数
# 查看 podman 帮助信息的前15行
$ podman --help | head -15
(3)Podman 镜像加速配置
😊提示:此方法配置已在 CentOS8 环境下验证,CentOS7 请另行注意。
# 1.备份原始的Podman镜像配置文件
cp /etc/containers/registries.conf /etc/containers/registries.conf.backup
# 2.将原始的镜像文件置空
echo '' > /etc/containers/registries.conf
# 3.将下面的内容复制到 /etc/containers/registries.conf 文件中
### 开始内容 ###
unqualified-search-registries = ["registry.fedoraproject.org", "registry.access.redhat.com", "registry.centos.org", "docker.io"]
[[registry]]
prefix = "docker.io"
location = "docker.io"
[[registry.mirror]]
location = "hub-mirror.c.163.com"
[[registry.mirror]]
location = "mirror.baidubce.com"
[[registry.mirror]]
location = "f1361db2.m.daocloud.io"
[[registry.mirror]]
location = "ustc-edu-cn.mirror.aliyuncs.com"
[[registry.mirror]]
location = "ghcr.io"
### 结束内容 ###
附录
(1)相关链接
-
Podman 官网地址:podman.io/releases
-
Podman Wiki 帮助文档地址:What is Podman? — Podman documentation
(2)更多详细
① 网络
关于容器中的网络和DNS的更详细的指南,请参见网络指南。
② 检查点、迁移和恢复容器
当将容器中所有进程的状态写入磁盘时,指向容器的检查点将停止容器。这样,容器就可以在稍后迁移和恢复,并在与检查点完全相同的时间点运行。有关详细信息,请参阅检查点说明。
③ 综合测试
有关如何在 环境中设置和运行集成测试 的详细信息,请签出集成测试README.md。
④ 更多命令信息
有关Podman及其子命令的更多信息。
🙏至此,非常感谢阅读🙏