Podman 教程

Podman Pod 启动

在 Podman 中,可以使用 podman run --pod <pod名称或ID> 命令将新创建的容器加入到一个已存在的 Pod 中。最关键的特性是,加入 Pod 的容器会共享该 Pod 的网络命名空间,这意味着它们拥有相同的网络栈(IP 地址、端口、网络接口等)。

注意:当你创建一个 Pod(podman pod create)时,Podman 会为这个 Pod 创建一个特殊的“基础设施容器”(Infra Container)。这个基础设施容器不运行任何实际应用,它的唯一作用就是持有并维护 Pod 的网络命名空间。

当你执行 podman run --pod 时,新容器不会创建自己的网络命名空间,而是直接加入到 Pod 的基础设施容器所拥有的网络命名空间中。因此,Pod 内的所有容器:

  • 共享同一个 IP 地址(Pod 的 IP)

  • 可以通过 localhost 或 127.0.0.1 互相访问彼此的端口

  • 共享相同的端口映射规则(由 Pod 配置)

简单示例

创建一个 Pod

使用 podman pod create 命令创建一个名为 my-pod 的 Pod,并映射 8080 端口到 Pod 的 80 端口,如下:

podman pod create --name my-pod -p 8080:80

# 示例
C:\Users\Administrator> podman pod create --name my-pod -p 8080:80
f4f035f3eec2a5acaaf7a672d56ddc689e89dc9634d405f065939564c8efe871

C:\Users\Administrator> podman pod ls | findstr my-pod
f4f035f3eec2  my-pod                Created     45 seconds ago  c6959186d247  1

向 Pod 中添加容器

使用 podman run 命令将名为 web 和 tester 的容器添加到 my-pod 中,如下:

# 向 my-pod 中添加一个 Nginx 容器(使用 Pod 的 80 端口)
podman run -d --pod my-pod --name web nginx

# 向 my-pod 中添加一个工具容器(用于测试)
podman run -it --pod my-pod --name tester alpine ash

# 示例
C:\Users\Administrator> podman run -d --pod my-pod --name web nginx
d9b39ec0753a0e7c7a6d8a24bdd2e5e3c95d951ae21eca440b2494b575d43707

C:\Users\Administrator> podman run -it --pod my-pod --name tester alpine ash
Resolving "alpine" using unqualified-search registries (/home/user/.config/containers/registries.conf)
Trying to pull docker.io/library/alpine:latest...
Getting image source signatures
Copying blob sha256:2d35ebdb57d9971fea0cac1582aa78935adf8058b2cc32db163c98822e5dfa1b
Copying config sha256:706db57fb2063f39f69632c5b5c9c439633fda35110e65587c5d85553fd1cc38
Writing manifest to image destination
/ #

使用 podman pod inspect 命令查看 my-pod 的详细信息,如下:

C:\Users\Administrator> podman pod inspect my-pod
[
     {
          "Id": "f4f035f3eec2a5acaaf7a672d56ddc689e89dc9634d405f065939564c8efe871",
          "Name": "my-pod",
          "Created": "2025-11-26T10:08:50.880835433+08:00",
          "CreateCommand": [
               "podman",
               "pod",
               "create",
               "--name",
               "my-pod",
               "-p",
               "8080:80"
          ],
          "ExitPolicy": "continue",
          "State": "Degraded",
          "Hostname": "",
          "CreateCgroup": true,
          "CgroupParent": "/libpod_parent",
          "CgroupPath": "/libpod_parent/f4f035f3eec2a5acaaf7a672d56ddc689e89dc9634d405f065939564c8efe871",
          "CreateInfra": true,
          "InfraContainerID": "c6959186d247f277af9ef44b16defa05ec325ce5036fd0a27819c6bafac16f88",
          "InfraConfig": {
               "PortBindings": {
                    "80/tcp": [
                         {
                              "HostIp": "0.0.0.0",
                              "HostPort": "8080"
                         }
                    ]
               },
               "HostNetwork": false,
               "StaticIP": "",
               "StaticMAC": "",
               "NoManageResolvConf": false,
               "DNSServer": null,
               "DNSSearch": null,
               "DNSOption": null,
               "NoManageHostname": false,
               "NoManageHosts": false,
               "HostAdd": null,
               "HostsFile": "",
               "Networks": null,
               "NetworkOptions": null,
               "pid_ns": "private",
               "userns": "host",
               "uts_ns": "private"
          },
          "SharedNamespaces": [
               "uts",
               "ipc",
               "net"
          ],
          "NumContainers": 3,
          "Containers": [
               {
                    "Id": "c6959186d247f277af9ef44b16defa05ec325ce5036fd0a27819c6bafac16f88",
                    "Name": "f4f035f3eec2-infra",
                    "State": "running"
               },
               {
                    "Id": "d9b39ec0753a0e7c7a6d8a24bdd2e5e3c95d951ae21eca440b2494b575d43707",
                    "Name": "web",
                    "State": "running"
               },
               {
                    "Id": "39d0244be2f9dfa9c895e08544929b925a713686bd42459ed643561d1232b2e2",
                    "Name": "tester",
                    "State": "exited"
               }
          ],
          "LockNumber": 13
     }
]

通过上述输出信息可知,Containers 中存在三个容器,如下:

[
     {
          //...
          "Containers": [
               {
                    "Id": "c6959186d247f277af9ef44b16defa05ec325ce5036fd0a27819c6bafac16f88",
                    "Name": "f4f035f3eec2-infra",
                    "State": "running"
               },
               {
                    "Id": "d9b39ec0753a0e7c7a6d8a24bdd2e5e3c95d951ae21eca440b2494b575d43707",
                    "Name": "web",
                    "State": "running"
               },
               {
                    "Id": "39d0244be2f9dfa9c895e08544929b925a713686bd42459ed643561d1232b2e2",
                    "Name": "tester",
                    "State": "exited"
               }
          ],
          //...
     }
]

注意事项:

  • 端口冲突:由于 Pod 内的容器共享网络栈,它们不能使用相同的端口号。例如,如果一个容器占用了 80 端口,其他容器就不能再绑定 80 端口。

  • 资源隔离:除了网络,容器的进程、存储、用户等仍然是隔离的。只有网络命名空间是共享的。

  • 依赖关系:Pod 是容器的 “父级” 对象。如果删除 Pod,其中的所有容器也会被一并删除。

  • Pod 必须存在:使用 --pod 参数时,指定的 Pod 必须已经创建且处于运行状态。

总结

podman run --pod 的核心是让容器共享 Pod 的网络命名空间,实现 Pod 内容器的 localhost 通信和统一的网络配置。就相当于在本机上面同时启动多个服务,每个服务有不同的端口,如数据库、tomcat、nginx 等等。

注意,Pod 内的容器共享同一个 IP 和端口映射规则,但需注意避免端口冲突。这种模式特别适用于需要紧密协作的服务组合,是实现容器编排的基础模式之一。

  

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