podman pod
什么是podman pod
注意,这里提及的是
podman pod
,而非kubernetes pod
。
什么是pod
要搞清楚pod
定义之前,必须要搞懂容器
,容器
再次之前,我们已经定义过了,是docker
或者是podman
能够管理的最小单位,而pod
则是可以装一个或多个容器
的盒子。
pod
最早定义于kubernetes
,是其可部署和管理以及调度的最小单元,kubernetes pod
中的容器可以共享存储、网络等。
podman pod
podman pod
定于基本上与kubernetes
一致,甚至,你可以根据kubernetes yaml
描述文件来创建podman pod
,和kubernetes
不同的是,podman pod
会创建名为infra
容器,它是podman pod
的默认容器。(要不要挖个坑,后面讲讲kubernetes
)
前期准备
代码案例
我们就用之前我们的实例来改下,我们将返回“阅读量”从变量的形式,我们更改为从 Redis
数据库获取,具体代码如下
该案例需要我们指定一个redis
数据库的地址,可以将“阅读量”存入数据库
Dockerfile案例
由于增加了一个变量,所以我们需要重写Docerfile
为什么是
Dockerfile
,而不是BuildAH
,嘿嘿,因为我还没看buildah
,留个坑 可以看到,Dockerfile
定义了一个ENV
变量,我们可以在run
容器的时候,使用-e
去定义具体的值
我们build
后,将它推送到docker hub
,以便我们后续podman
拉取
为什么不支持从docker
导出,然后导入podman
,之前测试过,失败了,可以翻翻看前面的文章,要不留个坑,后面专门看看这个问题? 以及解决方案?
以非pod的形式起容器组
启动容器组
启动redis容器
使用命令: podman run -d --name myredis redis
启动一个redis
容器
启动主容器
我们在启动容器之前,我们需要先获取redis
的ip
地址
使用如下命令可以获取: podman inspect -f "{{.NetworkSettings.Networks.podman.IPAddress}}" myredis
具体含义可以参考之前的podman文章,《podman 容器操作(下)》
我们得到IP地址后,我们就可以启动主容器了
命令: podman run -d --name mypdudojuejin2 -e redisHost="10.88.0.23:6379" -p 9091:9091 容器images
相关测试
测试相关功能
可以发现,成功了,没得问题
模拟容器挂掉重启后再次访问
我们可以发现,容器重启后,再次访问,已经从redis
数据库中获取相应数据了
模拟数据库挂掉后访问路由
查看主容器Log
原来是连不上数据库,抛panic
了
以pod的形式启动容器组
创建空pod
使用命令: podman pod create -n mypod1 -p 9091:9091
-n: 指定pod名称
-p: 确认映射端口(通过infra
)
注意: 在
pod
中使用pdoman run
不能携带-p
参数,需要需要在创建pod
便指定好,因为pod
会创建一个infra
,它的作用为可以共享pod
中所有的网络,即: 该Pod
可以使用localhost
进行通信。
创建redis
容器并且加入到pod
中
使用命令: podman run -d --name myredis --pod mypod1 redis
查看下启动的容器
使用命令: podman ps --pod
可以将pod
列出来
启动主容器
命令: podman run -d --name mypdudojuejin2 -e redisHost="localhost:6379" --pod mypod1 容器image
为什么要将 redisHost 置定为本机,因为这是podman pod 特性
我们再次查看启动的容器
相关测试
测试相关功能
可以发现,正常输出
模拟挂掉重启再次访问
可以发现也是可以的
查看pod负载
显示pod的运行进程
使用命令: podman pod top mypod1
显示pod容器使用资源
使用命令: podman pod stats --all --no-reset
除非按下
ctrl
+c
,否则,会持续输出pod的进程资源占用信息
停止pod
我们想停掉mypod1
下的所有容器
我们使用podman pod stop mypod1
即可
我们再次查看正在运行的容器
可以发现,mypod1
下的所有进程都被停掉了
非Pod启动容器组弊端
不能为一个整体
非pod的方式启动容器组,容器无法组成一个整体,是单个单个的,例如,如上例子,我有100
个实例组,那么换句话说,就有100
个redis
和 100
个 pdudojuejin2
进程,我们如何管理才是最大的问题,而以pod来启动,它会管理自身下的容器,为我们减少了麻烦。
网络复杂化
就像我们第一个实例一样,我们启动redis
,但是我们需要拿到它的ip,要不redis
也将端口映射出来,我们才能供pdudojuejin2
容器连接,当机器迁移后,问题会变得复杂化,主要是因为网络引起的。
以kube yaml
的形式启动podman pod
正如开头所述,我们可以使用kubernetes
描述文件启动podman pod
,如果你暂时还不会编写kubernetes
,可以跳过这节,后面我想,我可能会单独出一个章节来介绍kubernetes
将上述翻译为yaml描述文件
使用play执行yaml描述文件
查看容器
测试访问
问题/解决/想法
无法访问谷歌下载不了pause
例如我们使用命令: podman pod create -n juejin_pdudo_test_pod
问题描述
报错信息: initializing source docker://k8s.gcr.io/pause:3.5: pinging container registry k8s.gcr.io: Get "https://k8s.gcr.io/v2/": dial tcp 64.233.189.82:443: i/o timeout
问题解决
该问题是无法访问谷歌,导致pull pause
镜像失败导致的,我们可以拿着镜像名称,去docker hub
上搜索相应的,然后pull
下载,修改tag
即可,例如: podman 3.4.4
使用的是pause:3.5
,则我们按照上述执行即可
podman pull docker pull powerds/pause:3.5 podman tag docker.io/powerds/pause:3.5 k8s.gcr.io/pause:3.5
再次启动,则成功
想法
podman pod
相比于kubernetes
是在是有点鸡肋,不过有意思的是podman
可以执行k8s yaml
。如果你想学容器编排
,那么建议直接学龙头老大kubernetes
就好,不要在podman
上绕一回,2个根本不是一回事,要不要挖个坑,后面讲讲k8s
?