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服务为例来讲解如何使用。

  1. 创建配置文件 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
  1. 将 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/
  1. 执行 systemctl daemon-reload,该命令能够让quadlet重现生成systemed unit文件

  2. 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__

发表于: 2024年4月16日 19时17分