Podman入门札记
Podman简介
容器技术已经成为现代软件开发和部署的重要工具。它通过将应用和其依赖打包在一起,实现了应用的快速部署和移植。在这个背景下,Podman作为一款开源的容器管理工具套件,因其独特的特性和优势,逐渐受到开发者和系统管理员的青睐。
Podman的优势
Podman提供了与Docker相似的功能,可以编译镜像和管理容器,但它在某些方面优于Docker:
- 无守护进程:Podman CLI 直接与底层的libpod API交互,无需守护进程。
- 安全性:无需Root权限即可运行容器,提高了系统的安全性。
- Kubernetes兼容性:Podman与Kubernetes的集成更加紧密,可以通过
podman kube
命令根据Kubernetes的yaml文件生成Pod或者container,也可以将本地的Pod配置导出成Kubernetes的yaml。
基本概念:Pod
Pod最早在Kubernetes中引入,是Kubernetes中的最小部署单元。一组Pod通常包含一个或多个强相关的容器,这些容器共享网络和内存资源,并具有相同的命名空间,这意味着在一个容器中可以通过 127.0.0.1
访问到另外一个容器,这让服务的部署会更加简单。这种设计使得Pod可以作为一个逻辑上的应用实体,方便管理和封装。例如,一个Pod中可以同时包含业务容器和日志采集容器,这样可以在不影响主应用程序的情况下单独扩展或更新辅助容器,使得服务的部署更加灵活。
Podman的基本操作
登录镜像仓库及凭证持久化
通过 podman login -u user -p password docker.io
可以登录镜像仓库。
但是通过这种方式登录之后,重启系统会导致登录态丢失,需要再次登录。
原因是 podman登录的auth配置放在${XDG_RUNTIME_DIR}
目录下,这个目录是一个用于存储运行时文件的目录,重启数据就会丢失。
我们可以将配置文件移动到 ${XDG_CONFIG_HOME}
目录下。
mkdir -p ${XDG_CONFIG_HOME}/containers
cat ${XDG_RUNTIME_DIR}/containers/auth.json > ${XDG_CONFIG_HOME}/containers/auth.json
管理Pod
podman pod create
:创建一个新的空Pod。podman pod ps
:显示所有的Pod。podman pod stop <pod_id>
:停止指定的Pod。podman pod rm <pod_id>
:删除指定的Pod。podman pod top
:查看Pod下容器里的进程。
管理容器
podman run
:在容器中运行一个进程。如果镜像不存在,该命令会从远程仓库拉取镜像。
podman run --rm -it ubuntu:latest /bin/bash
上述命令根据Ubuntu镜像创建容器,并在容器中运行一个交互式shell。--rm
表示退出容器时自动删除容器,-it
表示启用交互式终端。
podman ps
:列出机器上运行中的容器。加上-a
参数则列出所有容器。podman logs <container_id>
:查看容器的日志。
Kubernetes的试炼场
podman支持在本地根据k8s的yaml文件创建pod,container以及configMap等资源。
podman kube play nginx.yml
:使用Kubernetes的yaml文件创建Pod。podman kube play --replace nginx.yml
:使用-replace
参数更新Pod。
使用Podman实现容器自启动
Podman不依赖守护进程,要实现容器的自启动,可以依赖Systemd服务来管理容器。podman集成了quadlet程序来简化systemd的uint文件编写。这里以我的blog服务为例来讲解如何使用。
- 创建配置文件 blog.kube, 内容如下:
[Unit]
Description=Blog server container
[Kube] #我的blog是以k8s的yaml文件格式进行描述的,所以这里需要创建[kube]的配置
Yaml=/data/deploy/blog-service/deployment.yaml
ConfigMap=/data/deploy/blog-service/configmap.yaml
Network=host
[Service]
Restart=always
[Install]
WantedBy=default.target
- 将 blog.kube需要移动到podman的目录下:
- 对于root权限的容器,将配置文件移动到
/usr/share/containers/systemd/
或/etc/containers/systemd/
。 - 对于非root权限的容器,需要将配置文件移动到
$HOME/.config/containers/systemd/
我这里使用的是root权限的容器,执行下面的命令,将blog.kube文件移动到容器的目录下:
cp ./blog.kube /etc/containers/systemd/
-
执行 systemctl daemon-reload,该命令能够让quadlet重现生成systemed unit文件
-
systemctl start blog 启动服务 这里不需要执行 systemctl enable blog, 因为quadlet生成的是一个临时文件,不能通过systemctl enable启用, blog.kube中增加了 [Install]部分实现了类似的效果。
参考链接
https://news.ycombinator.com/item?id=37656990 https://access.redhat.com/discussions/7033481 [https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/building_running_and_managing_containers/index](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/building_running_and_managing_containers/index__