因此,我有一个名为的 Docker 网络home
,其中包含所有基于根的容器(或难以移植到 podman 的 Docker 容器)。
sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
9d5788b45048 bridge bridge local
b1f4756feab4 home bridge local
5d7ee6579f19 host host local
8678a773e2f2 none null local
而且,对于 podman,我有一个非常相似的配置。
podman network ls
NETWORK ID NAME DRIVER
8b17ae3d5d67 home bridge
2f259bab93aa podman bridge
问题是什么?好吧,事实证明,我的容器名称解析在一个网络到另一个网络之间不起作用。例如,我nginx-proxy-manager
在 podman 上运行,我想http://domain/freshrss
通过指定和关联的端口号重定向到 freshrss 服务freshrss
。这不起作用,这对我来说很有意义,因为 docker 网络和 podman 网络从根本上是彼此分离的。
所以我的问题很简单:有没有办法将这两个网络桥接在一起,将它们视为一个网络,而不会损害个性化网络配置的完整性?或者,有没有办法让我解决这个通信问题,而不必在转发名称和端口中重新指定域名?例如,我认为转发到127.0.0.1:<freshrss port>
会起作用,因为它会转到主机,然后连接到适当的端口,但那不起作用。
docker/podman compose
欢迎提供有针对性的答案,因为这就是我配置我的服务的方式。
127.0.0.1
在容器内,始终表示“此容器”(除非您在主机网络模式下运行)。如果要引用主机上发布的端口,则需要使用分配给主机接口之一的 IP 地址。在许多情况下,您可以使用魔术主机名来引用您的主机;在 Podman 的最新版本中,默认情况下可以使用此功能,而在 Docker 中,如果 (a) 您在 Windows 或 MacOS 上使用 Docker Desktop,或者 (b) 您使用的是 Linux 并在命令行中host.docker.internal
包含此功能,则可以使用此功能。--add-host host.docker.internal:host-gateway
docker run
这意味着如果你运行这样的容器:
然后,您可以从 podman 或 docker 容器像这样访问该服务:
没有简单的方法可以在两个环境之间进行名称解析。
最简单的解决方案是选择 podman 或 docker 中的一个。从你的问题中看不出你为什么要同时使用两者。请注意,
docker compose
如果你启用了 docker 兼容性 API,那么使用 Podman 作为容器引擎就可以正常工作。在这里我们启用 podman 用户(非 root)套接字并设置指向该套接字的 docker 上下文:
我们可以将
DOCKER_HOST
环境变量指向 podman 套接字:现在 docker 命令将与 podman 交互。例如:
该
docker context
命令允许您创建引用不同远程套接字的命名配置。我们可以创建podman-user
这样的上下文:如果我们激活上下文:
所有后续 Docker 命令都将针对 podman 套接字进行操作。然后,您可以
docker context use default
切换回连接到本地 Docker 守护程序的默认上下文。