Podman 教程

Podman 快速入门指南

注意:下面操作将在 Windows11 上面安装 Podman 最新版本 5.7.0-rc2 进行操作。

Podman 是一个无守护进程的容器引擎,与 Docker 命令兼容,非常适合容器化应用的开发和运行。以下是 Podman 的快速入门指南:

运行 podman 命令查看版本信息,确认 Podman 是否已经正确安装,如下:

C:\Users\hxstr> podman --version
podman version 5.7.0-rc2

如果你能看见 podman 的版本信息,则说明你已经成功安装 Podman。

基本概念

镜像(Image)

Podman 中的镜像是打包了应用程序及其依赖、运行环境、配置文件的只读模板,是创建容器的基础。

镜像的核心特性如下:

  • 只读属性:镜像创建后不可修改,容器运行时会在镜像之上生成可写层来存储临时数据。

  • 分层结构:由多个只读层叠加而成,相同层可被多个镜像共享,大幅节省存储空间。

  • 可移植性:包含运行应用所需的全部依赖,能在任何支持 Podman 的环境中一致运行,解决“环境不一致” 问题。

镜像与容器的关系:镜像相当于“软件安装包”,容器则是“安装后的运行实例”。一个镜像可以创建多个独立的容器,容器停止或删除后,镜像本身不会受影响。

Podman 快速入门指南

容器(Container)

Podman 中的容器是基于镜像创建的可运行实例,是镜像的 “动态运行形态”,用于实际执行应用程序。

容器是镜像的 “运行时载体”,镜像相当于静态模板,容器则是模板实例化后的动态进程。它通过 namespace、cgroups 等 Linux 内核技术实现资源隔离(如网络、进程、文件系统)和资源限制(如 CPU、内存),拥有独立的运行环境但共享宿主机内核。

容器的关键特性:

  • 可写性:容器在镜像的只读层之上,会自动创建一层可写容器层,所有运行时的修改(如创建文件、修改配置)都仅保存在这一层,不影响原始镜像。

  • 生命周期可控:支持创建、启动、停止、重启、删除等操作,生命周期独立于镜像和其他容器。

  • 轻量级:无需额外的操作系统内核,仅占用应用运行所需的资源,启动速度快、资源开销低。

容器与镜像的核心区别:

维度

镜像(Image)

容器(Container)

状态

静态、只读

动态、可写(仅容器层)

作用

作为创建容器的模板

运行应用程序的实际载体

生命周期

创建后长期存在(除非主动删除)

随启动而存在,删除后数据丢失(除非挂载存储卷)

仓库(Registry)

Podman 的仓库(Registry)是存储、分发容器镜像的远程或本地服务,相当于镜像的 “仓库 / 中转站”,用于集中管理和共享镜像资源。

仓库的核心作用:

  • 存储镜像:提供镜像的长期存储服务,支持不同版本、不同架构的镜像分类存储。

  • 分发镜像:用户可通过仓库拉取(pull)所需镜像到本地,也可将本地构建的镜像推送(push)到仓库供他人使用。

  • 版本管理:支持镜像标签(Tag)管理,同一镜像可通过不同标签区分版本(如 nginx:1.21、nginx:latest)。

仓库的常见类型:

  • 公共仓库:面向所有用户开放,最常用的是 Docker Hub(Podman 可直接兼容使用),还有 Red Hat Quay、阿里云容器镜像服务等。

  • 私有仓库:仅对特定用户或团队开放,用于存储内部项目镜像,保障镜像的安全性和私密性(可自行搭建或使用云厂商提供的私有仓库服务)。

  • 本地仓库:搭建在本地环境的仓库,用于局域网内快速分发镜像,避免依赖外网。

仓库与镜像、容器的关联:

  • 仓库是镜像的“存储载体”,镜像需通过仓库实现跨环境传输。

  • 容器的创建依赖本地镜像,而本地镜像要么来自仓库拉取,要么是本地构建后推送至仓库再拉取使用。

常用命令(与 Docker 兼容)

镜像操作

拉取镜像

拉取镜像(Pull)是指从远程或本地仓库下载镜像到本地环境的操作,是使用镜像创建容器的前提(若本地已存在目标镜像,则无需重复拉取)。语法如下:

podman pull <镜像名:标签>

示例:拉取 Ubuntu 版本为 22.04 的镜像

C:\Users\hxstr> podman pull ubuntu:22.04
Resolving "ubuntu" using unqualified-search registries (/home/user/.config/containers/registries.conf)
Trying to pull docker.io/library/ubuntu:22.04...
Getting image source signatures
Copying blob sha256:af6eca94c8104c8e90d3f9efe59c2b3a02b20aad3d985e31c7cd009ea104c447
Copying config sha256:392fa14dddd09da29a5c3d26948ff81c494424035b755d01b84ab12d92127433
Writing manifest to image destination
392fa14dddd09da29a5c3d26948ff81c494424035b755d01b84ab12d92127433

从仓库拉取最新版本的 nginx 镜像到本地:

C:\Users\hxstr> podman pull nginx
Resolving "nginx" using unqualified-search registries (/home/user/.config/containers/registries.conf)
Trying to pull docker.io/library/nginx:latest...
Getting image source signatures
Copying blob sha256:52bc359bcbd74bb3d11b94cf3c6d94bcf9bd2d3e450483fb978124ceddb9ca57
Copying blob sha256:266626526d42cf7fe5f56b933db3f4c59c0596b7e2c3a556ba5ec4981daf3e9d
Copying blob sha256:d7ecded7702a5dbf6d0f79a71edc34b534d08f3051980e2c948fba72db3197fc
Copying blob sha256:d921c57c6a81addac6ca451906699ca6ee8c01fd708805a928181c5370b0a30c
Copying blob sha256:320b0949be89766f7c6a8746f1971021a8e8c84928af00454c0f9c6e38ebf54c
Copying blob sha256:9def903993e4ef9a3faa02bb893b0382768a4d466d51247bff1ea80b119377a1
Copying blob sha256:e2f8e296d9df1dd5e2ddc81e5e758f9762fdb932e982ac6873e36692c3e3c983
Copying config sha256:d261fd19cb63238535ab80d4e1be1d9e7f6c8b5a28a820188968dd3e6f06072d
Writing manifest to image destination
d261fd19cb63238535ab80d4e1be1d9e7f6c8b5a28a820188968dd3e6f06072d

更多命令信息将在后续介绍。

查看本地镜像

在 Podman 中,查看本地镜像的核心命令是 podman images 或其等效命令 podman image ls,用于列出本地存储的所有镜像信息,方便用户了解当前可用的镜像资源。例如:

C:\Users\hxstr> podman images
REPOSITORY                TAG         IMAGE ID      CREATED      SIZE
docker.io/library/nginx   latest      d261fd19cb63  4 days ago   155 MB
docker.io/library/redis   latest      017b1c12abf9  4 days ago   140 MB
docker.io/library/tomcat  latest      f29228ec2c11  3 weeks ago  417 MB
docker.io/library/ubuntu  22.04       392fa14dddd0  5 weeks ago  80.4 MB

C:\Users\hxstr> podman image ls
REPOSITORY                TAG         IMAGE ID      CREATED      SIZE
docker.io/library/nginx   latest      d261fd19cb63  4 days ago   155 MB
docker.io/library/redis   latest      017b1c12abf9  4 days ago   140 MB
docker.io/library/tomcat  latest      f29228ec2c11  3 weeks ago  417 MB
docker.io/library/ubuntu  22.04       392fa14dddd0  5 weeks ago  80.4 MB

更多命令信息将在后续介绍。

删除镜像

在 Podman 中,删除本地镜像的核心命令是 podman rmi(全称为 podman image rm),用于移除本地存储中不再需要的镜像,释放磁盘空间。删除镜像前需注意:若镜像已被容器使用(包括停止的容器),需先删除关联容器,否则会删除失败。语法如下:

podman rmi <镜像ID或名称>

如果要强制删除(即使有容器依赖也删除),语法如下:

podman rmi -f <镜像>

例如:

C:\Users\hxstr> podman rmi d261fd19cb63
Untagged: docker.io/library/nginx:latest
Deleted: d261fd19cb63238535ab80d4e1be1d9e7f6c8b5a28a820188968dd3e6f06072d

C:\Users\hxstr> podman rmi redis
Untagged: docker.io/library/redis:latest
Deleted: 017b1c12abf9d52fe40dda80a195107ea2c566a0035b59ffcc67af8b4c32c736

更多命令信息将在后续介绍。

容器操作

运行容器

在 Podman 中,运行容器(从镜像创建并启动)的核心命令是 podman run,该命令会基于指定镜像创建一个新容器,并立即启动它。基本命令格式:

podman run [选项] <镜像> [命令]

常用选项:

  • -it:交互式终端(适合调试)

  • -d:后台运行(守护进程模式)

  • -p 宿主端口:容器端口:端口映射

  • --name:指定容器名称

  • --rm:容器停止后自动删除

示例:运行 Ubuntu 容器并进入交互式终端

C:\Users\hxstr> podman run -it --name my-ubuntu ubuntu:22.04 /bin/bash
root@edf04a33bfb1:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@edf04a33bfb1:/# date
Sun Nov  9 00:16:30 UTC 2025
root@edf04a33bfb1:/#

上面命令用于基于 ubuntu:22.04 镜像创建并启动一个名为 my-ubuntu 的容器,并直接进入容器的 bash 终端。然后再 bash 终端执行 ls 和 date 命令。

命令详细说明:

  • podman run:Podman 创建并启动容器的核心命令,等价于先执行 podman create(创建容器)再执行 podman start(启动容器)。

  • -it:两个选项的组合,是交互式操作的关键:

    • -i(--interactive):保持容器的标准输入(STDIN)打开,确保能与容器内的进程交互(如输入命令)。

    • -t(--tty):为容器分配一个伪终端(模拟终端环境),使交互体验与本地终端一致(支持命令行提示符、光标移动等)。

  • --name my-ubuntu:为容器指定一个自定义名称 my-ubuntu(若不指定,Podman 会自动生成一个随机名称,如 loving_tesla)。指定名称后,后续操作(如停止、删除、进入容器)可直接使用名称而非容器 ID,更方便。

  • ubuntu:22.04:指定基础镜像,即基于 Ubuntu 22.04 版本的官方镜像创建容器。若本地没有该镜像,Podman 会自动从 Docker Hub 拉取。

  • /bin/bash:容器启动后执行的命令,即启动容器内的 bash 终端(Ubuntu 镜像默认的 shell 环境)。这会覆盖镜像的默认启动命令(Ubuntu 镜像默认命令通常是 /bin/bash,此处显式指定更清晰)。

注意:退出容器终端,容器将立即结束。

C:\Users\hxstr> podman ps -a
CONTAINER ID  IMAGE                           COMMAND     CREATED        STATUS                       PORTS       NAMES
edf04a33bfb1  docker.io/library/ubuntu:22.04  /bin/bash   3 minutes ago  Exited (130) 25 seconds ago              my-ubuntu

示例:运行 Nginx 并映射端口(宿主8080 → 容器80)

C:\Users\hxstr> podman images
REPOSITORY                TAG         IMAGE ID      CREATED      SIZE
docker.io/library/nginx   latest      d261fd19cb63  4 days ago   155 MB
docker.io/library/tomcat  latest      f29228ec2c11  3 weeks ago  417 MB
docker.io/library/ubuntu  22.04       392fa14dddd0  5 weeks ago  80.4 MB

C:\Users\hxstr> podman run -d -p 8080:80 --name my-nginx nginx
3c9d92ee580bf6886c8dcc8e174a51d33ce5801f642435ea3719cad644e2d4fc

在宿主机通过浏览器访问 http://localhost:8080,效果如下图:

Podman 快速入门指南

更多命令信息将在后续介绍。

查看运行中的容器

在 Podman 中,查看当前正在运行的容器的核心命令是 podman ps,该命令会列出所有处于 “运行中(Running)” 状态的容器及其关键信息,方便用户了解容器的运行状态。

基本命令格式:

podman ps [选项]

注意:不添加任何选项时,仅显示当前正在运行的容器,包含容器 ID、名称、使用的镜像、启动命令、创建时间、状态、端口映射等关键信息。

例如:

C:\Users\hxstr> podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED            STATUS            PORTS                 NAMES
3c9d92ee580b  docker.io/library/nginx:latest  nginx -g daemon o...  About an hour ago  Up About an hour  0.0.0.0:8080->80/tcp  my-nginx

输出各字段含义:

  • CONTAINER ID:容器的唯一标识符(短 ID,完整 ID 可通过 --no-trunc 选项显示)。

  • IMAGE:容器基于的镜像(仓库地址 + 镜像名 + 标签)。

  • COMMAND:容器启动时执行的命令(如 nginx -g ... 或 /bin/bash)。

  • CREATED:容器的创建时间(相对时间,如 “5 minutes ago”)。

  • STATUS:容器当前的运行状态(如 “Up 5 minutes” 表示已运行 5 分钟)。

  • PORTS:宿主机与容器的端口映射关系(如 0.0.0.0:8080->80/tcp 表示宿主机 8080 端口映射到容器 80 端口),若未配置端口映射则为空。

  • NAMES:容器的名称(自定义名称或自动生成的名称)。

更多命令信息将在后续介绍。

操作容器状态

Podman 中对容器状态的操作主要包括启动、停止、重启、暂停、恢复等,通过这些命令可灵活管理容器的运行生命周期。如下:

# 启动已停止的容器
podman start <容器名或ID>

# 停止运行中的容器
podman stop <容器名或ID>

# 重启容器
podman restart <容器名或ID>

示例:演示如何对 my-nginx 容器进行启动、停止、重启操作

# 查看正在运行的容器
C:\Users\hxstr> podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED            STATUS            PORTS                 NAMES
3c9d92ee580b  docker.io/library/nginx:latest  nginx -g daemon o...  About an hour ago  Up About an hour  0.0.0.0:8080->80/tcp  my-nginx

# 停止正在运行的名为 my-nginx 的容器
C:\Users\hxstr> podman stop my-nginx
my-nginx

# 查看所有容器状态,包含已停止的容器
# 此时,名为 my-nginx 的容器状态为 Exited (0) 9 seconds ago
# 表示容器已经停止
C:\Users\hxstr> podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED            STATUS                          PORTS                 NAMES
edf04a33bfb1  docker.io/library/ubuntu:22.04  /bin/bash             2 hours ago        Exited (130) About an hour ago                        my-ubuntu
3c9d92ee580b  docker.io/library/nginx:latest  nginx -g daemon o...  About an hour ago  Exited (0) 9 seconds ago        0.0.0.0:8080->80/tcp  my-nginx

# 启动名为 my-nginx 的容器
C:\Users\hxstr> podman start my-nginx
my-nginx

# 查看正在运行的容器,名为 my-nginx 的容器再次被启动了
C:\Users\hxstr> podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED      STATUS        PORTS                 NAMES
3c9d92ee580b  docker.io/library/nginx:latest  nginx -g daemon o...  2 hours ago  Up 3 minutes  0.0.0.0:8080->80/tcp  my-nginx

# 重启容器
C:\Users\hxstr> podman restart my-nginx
my-nginx

更多命令信息将在后续介绍。

进入运行中的容器

在 Podman 中,进入运行中的容器(即进入容器内部的终端环境,执行命令或操作文件)的核心命令是 podman exec,通常配合 -it 选项实现交互式终端访问。这是调试容器内应用、查看日志或修改配置的常用操作。

命令格式如下:

podman exec -it <容器名或ID> /bin/bash

示例:进入 Nginx 容器(使用 bash),假设运行中的 Nginx 容器名称为 my-nginx,执行:

C:\Users\hxstr> podman exec -it my-nginx /bin/bash
root@3c9d92ee580b:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@3c9d92ee580b:/#

如果要退出容器的 bash,执行 exit 命令:

root@3c9d92ee580b:/# exit
exit

C:\Users\hxstr>

更多命令信息将在后续介绍。

删除容器

在 Podman 中,删除容器的核心命令是 podman rm(全称为 podman container rm),用于移除不再需要的容器(包括已停止或处于退出状态的容器),释放资源。注意:运行中的容器默认无法直接删除,需先停止或强制删除。

命令格式如下:

podman rm <容器名或ID>
# 强制删除运行中的容器:
podman rm -f <容器>

示例:若容器已停止(状态为 Exited),直接指定容器标识即可删除:

# 查看当前运行的容器,包含退出的容器
C:\Users\hxstr> podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED       STATUS                     PORTS                 NAMES
edf04a33bfb1  docker.io/library/ubuntu:22.04  /bin/bash             10 hours ago  Exited (130) 10 hours ago                        my-ubuntu
3c9d92ee580b  docker.io/library/nginx:latest  nginx -g daemon o...  10 hours ago  Up 8 hours                 0.0.0.0:8080->80/tcp  my-nginx

# 直接删除已经退出的容器
C:\Users\hxstr> podman rm my-ubuntu
my-ubuntu

# 直接删除运行中的容器,出错了,不允许删除
C:\Users\hxstr> podman rm my-nginx
Error: cannot remove container 3c9d92ee580bf6886c8dcc8e174a51d33ce5801f642435ea3719cad644e2d4fc as it is running - running or paused containers cannot be removed without force: container state improper

如果容器正在运行(状态为 Running),默认删除会失败,需使用 -f 或 --force 选项强制删除(会先终止容器再删除):

# 强制删除正在运行的容器
C:\Users\hxstr> podman rm -f my-nginx
my-nginx

更多命令信息将在后续介绍。

其他实用命令

查看容器日志

在 Podman 中,查看容器日志的核心命令是 podman logs,用于获取容器运行过程中输出的日志信息(包括应用程序日志、错误信息等),是排查容器内应用问题的重要手段。

基本命令格式如下:

podman logs <容器名或ID>
# 实时查看日志:
podman logs -f <容器>

示例:

C:\Users\hxstr> podman logs my-nginx
/docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
/docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
/docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
...
2025/11/09 10:02:47 [notice] 1#1: start worker process 39
2025/11/09 10:02:47 [notice] 1#1: start worker process 40
2025/11/09 10:02:47 [notice] 1#1: start worker process 41

更多命令信息将在后续介绍。

检查容器详细信息

在 Podman 中,检查容器的详细信息(包括配置、网络、挂载、状态等)的核心命令是 podman inspect。该命令会以 JSON 格式输出容器的完整元数据,是深入了解容器运行环境、排查配置问题的重要工具。

基础命令格式如下:

podman inspect <容器名或ID>

示例:查看名为 my-nginx 容器的详细信息

C:\Users\hxstr> podman inspect my-nginx
[
     {
          "Id": "e88ed7e8c6be2d5a0493b6c952c9fcc54933eb3d5c0eee2b1c0d78c1ba982f9a",
          "Created": "2025-11-09T18:02:47.18472464+08:00",
          "Path": "/docker-entrypoint.sh",
          "Args": [
               "nginx",
               "-g",
               "daemon off;"
          ],
          ....
          "UseImageHosts": false,
          "UseImageHostname": false
     }
]

更多命令信息将在后续介绍。

清理无用资源

在 Podman 中,随着使用时间增长,会积累一些无用资源(如未使用的镜像、停止的容器、悬空镜像、缓存数据等),占用磁盘空间。清理这些资源可通过 podman system prune 系列命令高效完成,也可针对性清理特定类型资源。

podman system prune -a
# 加上 -f 可跳过确认:
podman system prune -af

示例:

C:\Users\hxstr>podman system prune -a
WARNING! This command removes:
        - all stopped containers
        - all networks not used by at least one container
        - all images without at least one container associated with them
        - all build cache

Are you sure you want to continue? [y/N] y
Deleted Images
392fa14dddd09da29a5c3d26948ff81c494424035b755d01b84ab12d92127433
f29228ec2c11e611d5a44d74c550d1e7b2884a7d2a00937284ab22970098825d
Total reclaimed space: 497.2MB

# 执行完后,再次查看镜像和容器信息,只剩下运行中的容器,和容器对应的镜像了
# 其他已经停止容器,以及没有使用的镜像全部被删除了
C:\Users\hxstr> podman images
REPOSITORY               TAG         IMAGE ID      CREATED     SIZE
docker.io/library/nginx  latest      d261fd19cb63  5 days ago  155 MB

C:\Users\hxstr> podman ps
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS        PORTS                 NAMES
e88ed7e8c6be  docker.io/library/nginx:latest  nginx -g daemon o...  6 minutes ago  Up 6 minutes  0.0.0.0:8080->80/tcp  my-nginx

C:\Users\hxstr> podman ps -a
CONTAINER ID  IMAGE                           COMMAND               CREATED        STATUS        PORTS                 NAMES
e88ed7e8c6be  docker.io/library/nginx:latest  nginx -g daemon o...  7 minutes ago  Up 7 minutes  0.0.0.0:8080->80/tcp  my-nginx

通过以上命令,你可以快速上手 Podman 的基本使用,体验容器化开发的便捷性。

更多 Podman 命令将在后续章节逐一展开……

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号