容器到容器网络在 podman / podman-compose 中如何工作?

容器到容器网络在 podman / podman-compose 中如何工作?

我在我的家庭实验室中运行 RHEL 9.0 兼容操作系统,以及 podman 版本 4.0.2 和 podman-compose 版本 1.0.3。如果您需要任何其他信息,请告诉我!

我正在尝试从使用 docker 容器过渡到使用无根 podman 容器。为此,我引入了一组非常简单的服务,这些服务将在我尝试过的几乎所有 *nix 操作系统上新安装的 docker 设置上运行。简单吧?没有

首先,我必须提供容器映像的完整路径,只需在它们出现在 docker 库中时引用它们即可。那还不错。

我的撰写文件声明了一个桥接网络,并且每个服务都附加到该网络。

网络上的任何其他计算机都可以访问其端口从容器公开的任何服务。端口 8080、8443、3306 都可以从我的笔记本电脑访问。

问题在于容器之间无法通信。通过 docker 网络,容器可以仅使用容器名称作为主机名来相互解析。我已经在每个容器上安装了 ping,并且发现它们在引用自己的容器名称时都可以 ping 自己,但无法 ping 其他容器。这确实阻碍了我的无根容器计划。

在我的撰写文件中,我首先声明网络:

version: 3.1

networks:
  neta:
    driver: bridge

每个服务声明一个容器名称并附加到该网络,例如:

    container_name: httpd
    networks:
      - neta
...
    container_name: mariadb
    networks:
      - neta

我没有发布完整的撰写文件,因为我相信这个问题并非特定于我的文件,而是与 podman 的无根性质有关。

我的问题是 httpd 容器无法访问 mariadb,反之亦然。

我的 podman 之旅还不到 24 小时,实际上,不到 4 小时。我只是假设容器网络会“正常工作”,但现在我错了。

任何意见、链接或建议将不胜感激。

谢谢

答案1

我建议将 docker compose 文件转换为 kubernetes yaml 文件。这样您就可以利用 podman play kube。https://docs.podman.io/en/v3.4.1/markdown/podman-play-kube.1.html

在 yaml 文件本身中,您可以定义端口,类似于在 docker compose 文件中的操作。由于所有容器都在同一个 pod 中,因此它们可以使用 localhost。

  - name: container_A
    image: docker.io/container_A
    ports:
      - containerPort: 27017
        hostPort: 27017
        protocol: TCP
  - name: container_B
    image: docker.io/container_B
    ports:
      - containerPort: 8081
        hostPort: 8081
        protocol: TCP

相关内容