安装

发行版中直接通过仓库源安装即可:

pacman -S podman podman-compose  # arch

配置镜像源

配置国内镜像,加快镜像下载速度,编辑/etc/containers/registries.conf

unqualified-search-registries = ['docker.io']

[[registry]]
prefix = "docker.io"
insecure = false
blocked = false
location = "docker.io"
[[registry.mirror]]
location = "docker.mirrors.ustc.edu.cn"
[[registry.mirror]]
location = "hub-mirror.c.163.com"
[[registry.mirror]]
location = "mirror.ccs.tencentyun.com"

将按由上到下的顺序依次搜索并下载镜像,若都失败,最后从docker.io搜索下载。

命令

docker命令基本一致,按docker使用方式使用即可。如以数据库为例,docker-compose文件如下:

version: '3.1'
services:
  postgres-db:
    image: postgres
    container_name: postgres
    network_mode: bridge
    privileged: true
    restart: always
    environment:
      POSTGRES_PASSWORD: postgres
      TZ: Asia/Shanghai
    ports:
      - 15432:5432
    volumes:
      - ./data:/var/lib/postgresql/data

podman启动:

podman-compose up -d

查看容器列表:

podman ps -a

输出:

CONTAINER ID  IMAGE                              COMMAND     CREATED       STATUS          PORTS                    NAMES
2b2820a72053  docker.io/library/postgres:latest  postgres    15 hours ago  Up 2 hours ago  0.0.0.0:15432->5432/tcp  postgres

容器开机自启

docker因为具有守护线程,当docker本身自启后即会启动相关容器,但podman无守护线程,若要容器开机自启,需要为容器生成systemd文件,命令如下:

podman generate systemd <container> > <container>.service

将生成的文件放到/usr/lib/systemd/system下并启用开机自启即可:

systemctl daemon-reload
systemctl enable <container>.service

WSL下容器自启

因在wsl下无法使用systemctl,因此无法通过这种方式进行自启动,可以通过将容器启动命令放到~/.bashrc~/.zshrc文件中,这样当登录wsl时,启动命令就会自动被执行。在用户目录下新建.profile文件,写入容器启动命令如下:

containers=("container1" "container2") # 需要自启动的容器,容器的名称或ID
for container in ${containers[@]}; do
    stat=$(podman stats "$container" --no-stream 2>&1) # 容器未启动时执行stats会输出Error
    if [[ "$stat" =~ ^Error.* ]]; then
        echo "starting container $container ..."
        podman start "$container"
    fi
done

~/.bashrc~/.zshrc(没有则创建)中使.profile生效,加入:

source ~/.profile

这样,每当登录wsl时,.profile中的内容都会被执行,都会判断一下容器是否启动,若没启动就执行启动命令。注意当不是root用户时,除了执行podman命令加sudo外,需要在配置中设置用户为无需输入密码即可通过sudo执行podman命令,编辑配置文件:

sudo visudo

在其中加入:

<username> ALL=(ALL) NOPASSWD: /usr/bin/podman # <username>为登录用户名