在 ROOTLESS podman 设置中,如何在不同 pods 中的容器之间进行通信
In a ROOTLESS podman setup, how to communicate between containers in different pods
我阅读了我能找到的所有内容,但是 podman
关于此场景的文档很少或不清楚。我有以下(设计的)ROOTLESS
podman
设置:
pod-1 名称:pod1
pod1
中的容器名称:
p1c1
-- 这也是它在 pod1
中分配的 hostname
p1c2
-- 这也是它在 pod1
中分配的 hostname
p1c3
-- 这也是它在 pod1
中分配的 hostname
pod-2 名称:pod2
pod2
中的容器名称:
p2c1
-- 这也是它在 pod2
中分配的 hostname
p2c2
-- 这也是它在 pod2
中分配的 hostname
p2c3
-- 这也是它在 pod2
中分配的 hostname
我将某些容器放在不同的 pods
中,特别是为了避免 port conflict
,并将容器作为组进行管理。
问题:
给出上面的拓扑结构,我如何在p1c1
和p2c1
之间进行通信?换句话说,我将逐步发出什么 podman(1)
命令来为 pod1:p1c1
和 pod2:p2c1
收集必要的 addressing information
,然后使用该信息来配置应用程序以便他们可以相互交流?
提前致谢!
编辑:对于搜索者,可以找到更多信息here。
Podman 没有任何类似于 Swarm 或 Kubernetes 中的“服务”概念来提供 pods 之间的服务发现。您的选择归结为:
- 运行 两者 pods 在同一个网络命名空间中,或者
- 通过在主机端口上发布服务来公开服务,然后通过主机访问它们
对于第一个解决方案,我们首先创建一个网络:
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-compose
对
docker-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
我阅读了我能找到的所有内容,但是 podman
关于此场景的文档很少或不清楚。我有以下(设计的)ROOTLESS
podman
设置:
pod-1 名称:
pod1
pod1
中的容器名称:p1c1
-- 这也是它在pod1
中分配的 p1c2
-- 这也是它在pod1
中分配的 p1c3
-- 这也是它在pod1
中分配的
hostname
hostname
hostname
pod-2 名称:
pod2
pod2
中的容器名称:p2c1
-- 这也是它在pod2
中分配的 p2c2
-- 这也是它在pod2
中分配的 p2c3
-- 这也是它在pod2
中分配的
hostname
hostname
hostname
我将某些容器放在不同的 pods
中,特别是为了避免 port conflict
,并将容器作为组进行管理。
问题:
给出上面的拓扑结构,我如何在p1c1
和p2c1
之间进行通信?换句话说,我将逐步发出什么 podman(1)
命令来为 pod1:p1c1
和 pod2:p2c1
收集必要的 addressing information
,然后使用该信息来配置应用程序以便他们可以相互交流?
提前致谢!
编辑:对于搜索者,可以找到更多信息here。
Podman 没有任何类似于 Swarm 或 Kubernetes 中的“服务”概念来提供 pods 之间的服务发现。您的选择归结为:
- 运行 两者 pods 在同一个网络命名空间中,或者
- 通过在主机端口上发布服务来公开服务,然后通过主机访问它们
对于第一个解决方案,我们首先创建一个网络:
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-compose
对
docker-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