TrumanWong

Podman从入门到实践

TrumanWong
8/24/2023

概述

Podman是一个开源的容器管理工具,用于开发、管理和运行OCI容器。Podman提供了与Docker十分相似的功能。与Docker相比,Podman的一些优势:

  1. Podman创建的镜像与其它容器管理工具兼容。Podman创建的镜像遵循OCI标准,因此可以推送到其它容器注册中心,如Docker Hub
  2. 它可以作为普通用户运行,无需root权限,比Docker容器更安全;
  3. Podman不依赖于守护进程,因此不用担心Docker Daemon守护进程挂掉导致所有容器全部挂掉的问题。

但是,Podman也有一些局限性,由于没有Daemon守护进程,所以不支持--restart策略,不过使用k8s或者systemd可以解决这个问题。

安装使用

安装

Ubuntu/Debian

$ sudo apt-get -y install podman

CentOS:

$ sudo yum -y install podman

常用命令

# 列举镜像
$ podman images
# 删除镜像
$ podman rmi IMAGE
# 运行容器
$ podman run -d -p 8080:8080 --name myapp registry.access.redhat.com/ubi8/httpd-24
# 列出当前正在运行的容器
$ podman ps
# 列出所有容器
$ podman ps -a
# 停止容器
$ podman stop myapp
# 删除容器
$ podman rm myapp
# 创建pod
$ podman pod create -p 8080:8080 --name mypod --volume ./html:/var/www/html:z
# 列出pod
$ podman pod list
# 停止pod
$ podman pod stop mypod
# 删除pod
$ podman pod rm mypod

容器自启动

前面提到,podman没有daemon进程,因为启动容器命令没有--restart=always参数,所以容器自启动需要结合systemdk8s来实现。本文主要介绍通过systemd来实现容器自启动。操作如下:

# 生成systemd单元文件
$ podman generate systemd --new --name CONTAINER_NAME -f
$ ls *.service
CONTAINER_NAME.service
# 加载systemd服务,设置开机自启
$ mv CONTAINER_NAME.service ~/.config/systemd/user/
$ systemctl --user daemon-reload
# 到这里,只有在用户登录会话后,才会运行
$ systemctl --user enable CONTAINER_NAME.service
# 如果要让用户实例随系统自启动,需要执行以下命令,否则一旦用户注销,所有容器都会退出。
$ loginctl enable-linger

至此,容器已经可以利用systemd守护进程并自动启动。

常见问题

1. Ubuntu 22.04Podman启动容器提示报错Error validating CNI config file /etc/cni/net.d/xxx.conflist: [plugin bridge does not support config version "1.0.0" plugin portmap does not support config version "1.0.0" plugin firewall does not support config version "1.0.0" plugin tuning does not support config version "1.0.0"]

解决方案:

$ curl -O http://archive.ubuntu.com/ubuntu/pool/universe/g/golang-github-containernetworking-plugins/containernetworking-plugins_1.1.1+ds1-3_amd64.deb

$ dpkg -i containernetworking-plugins_1.1.1+ds1-1_amd64.deb