在 ROOTLESS podman 设置中,如何在不同 pods 中的容器之间进行通信

In a ROOTLESS podman setup, how to communicate between containers in different pods

我阅读了我能找到的所有内容,但是 podman 关于此场景的文档很少或不清楚。我有以下(设计的)ROOTLESS podman 设置:

我将某些容器放在不同的 pods 中,特别是为了避免 port conflict,并将容器作为组进行管理。

问题:

给出上面的拓扑结构,我如何在p1c1p2c1之间进行通信?换句话说,我将逐步发出什么 podman(1) 命令来为 pod1:p1c1pod2:p2c1 收集必要的 addressing information,然后使用该信息来配置应用程序以便他们可以相互交流?

提前致谢!

编辑:对于搜索者,可以找到更多信息here

Podman 没有任何类似于 Swarm 或 Kubernetes 中的“服务”概念来提供 pods 之间的服务发现。您的选择归结为:

  1. 运行 两者 pods 在同一个网络命名空间中,或者
  2. 通过在主机端口上发布服务来公开服务,然后通过主机访问它们

对于第一个解决方案,我们首先创建一个网络:

podman network create shared

然后创建两个 pods 附加到 shared 网络:

podman pod create --name pod1 --network shared
podman pod create --name pod2 --network shared

两个pods运行在同一个网络,容器可以参考 另一个豆荚的名字。例如,如果您是 运行 中的 Web 服务 p1c1 在端口 80 上,在 p2c1 中你可以 curl http://pod1.

对于第二个选项,您可以执行如下操作:

podman pod create --name pod1 -p 1234:1234 ...
podman pod create --name pod2 ...

现在,如果 p1c1 有服务侦听端口 1234,您可以从 p2c1<some_host_address>:1234 访问它。


If I'm interpreting option 1 correctly, if the applications in p1c1 and p2c1 both use, say, port 8080; then there won't be any conflict anywhere (either within the pods and the outer host) IF I publish using something like this: 8080:8080 for app in p1c1 and 8081:8080 for app in p2c1? Is this interpretation correct?

没错。每个 pod 都使用自己的网络命名空间运行 (实际上,它是自己的 ip 地址),所以不同 pods 中的服务可以 在同一个端口上监听。

Can the network (not ports) of a pod be reassigned once running? REASON: I'm using podman-compose(1), which creates things for you in a pod, but I may need to change things (like the network assignment) after the fact. Can this be done?

一般来说,您不能更改 pod 或 a 的配置 容器;您只能删除它并创建一个新的。假如说 podman-composedocker-compose.yaml格式,应该可以设置网络 正确地在你的 docker-compose.yaml 文件中(你会创建 手动网络,然后将其作为 external 网络引用 你的撰写文件)。

Here 是相关 Docker 文档的 link。我自己还没有用 podman 尝试过。

注意:以上创建网络的方案,只适用于rootful模式。您不能以无根用户身份执行 podman network create。

@larsks 接受的答案仅适用于 rootful 容器。换句话说,运行 每个 podman 命令都带有 sudo 前缀。 (例如,当您从 spring 启动应用程序容器连接 postgres 容器时,您将得到 SocketTimeout 异常)

如果两个容器将在同一个主机上运行,​​则获取主机的 ip 地址,然后 <ipOfHost>:<port>。示例:192.168.1.22:5432

有关详细信息,您可以阅读此博客 => https://www.redhat.com/sysadmin/container-networking-podman