我在我的家庭实验室中运行 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