在 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 配置)
使用 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
使用 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 和端口映射规则,但需注意避免端口冲突。这种模式特别适用于需要紧密协作的服务组合,是实现容器编排的基础模式之一。