3

我将在我的本地机器(Fedora 31 KDE)上使用podman制作一个服务器包。该包包括:

  1. Web 服务器(图像:php:7.2-apache,体积:$VARIABLE:/var/www/html:Z)
  2. MySQL 服务器(图像:mysql:8,卷:/var/lib/mysql:/var/lib/mysql:Z)
  3. 另一个网络服务器(图片:phpmyadmin/phpmyadmin:5)

现在,我需要一种能够使用单个命令启动 3 个服务器以及使用单个命令停止的方法。因此,我创建了一个pod并将它们放在pod下。我需要从主机访问主 Web 服务器和 phpmyadmin 服务器。这是我用来创建它们的 bash 脚本:

#!/usr/bin/env sh

if [ "$1" != "" ];then
    WEB_PATH="-v $1:/var/www/html:Z"
fi

sudo podman pod create -n servers -p 80:80 -p 8080:80
sudo podman run -dt --pod servers --rm --name web $WEB_PATH php:7.2-apache
sudo podman run -dt --pod servers --rm --name mysql --env MYSQL_ROOT_PASSWORD=iamroot -v /var/lib/mysql:/var/lib/mysql:Z mysql:8
sudo podman run -dt --pod servers --rm --name pma phpmyadmin/phpmyadmin:5

问题是,第一台和第三台服务器都使用端口 80 作为默认端口。我无法弄清楚这个问题。

我需要从主机访问端口 80 上的主 Web 服务器和端口 8080 上的 pma 服务器。

4

2 回答 2

4

我认为您想要完成的基本上是通过更改 pod 的默认共享选项来完成。

一般 Pods 共享cgroup,ipc,net,uts。使容器间通信变得容易。启用此功能(或更确切地说不更改它)不允许您将地图容器移植到 pod 中,解决方法: Error: cannot set port bindings on an existing container network namespace

就像 tgogos 的声明一样,无根容器总是共享同一个网络。这是slirp4netns项目完成的。查看站点以获取有关使用容器联网的更多信息。

我不完全明白你为什么使用,但你也可以使用标志sudo创建自己的网络sudo podman network create <networkname>并将容器分配给这个网络。--network <networkname>


来解决您的问题

创建一个不共享网络命名空间的 pod,因此端口映射将基于容器而不是基于 pod。

  1. 创建 Pod
    • podman pod create --name servers --share cgroup,ipc,uts
  2. 将带有端口的容器分配给您创建的 pod
    • 您现在可以自由地将端口分配给容器,使用 apache/nginx 或其他方式使事情按需要工作。如何在apache上分配多个实例
    • podman run -dt --pod servers --rm --name web -p 80:80 $WEB_PATH php:7.2-apache
    • podman run -dt --pod servers --rm --name mysql --env MYSQL_ROOT_PASSWORD=iamroot -v /var/lib/mysql:/var/lib/mysql:Z -p 8080:8080 mysql:8
    • podman run -dt --pod servers --rm --name pma -p SOMEPORT:80 phpmyadmin/phpmyadmin:5
  3. 寻找 IP
    1. 有根模式
      • sudo podman inspect -f "{{.NetworkSettings.IPAddress}}" <containername>
    2. 无根模式
      • 检查ip addr show任何virtual bridge,或者是否已经创建了cni podman网络
      • 或检查hostname -I这只会显示IP地址,但它们中的任何一个都应该工作
    3. 连接到数据库容器
      • 您的数据库现在应该可以通过您在步骤 3中获得的 IP 地址访问,并且来自步骤 2的端口可能类似于
      • 播客网络10.89.0.1:8080
      • 病毒0192.167.133.1:8080

请注意,步骤 1-2 也可以作为sudo. 让 systemd 服务管理重启等。

于 2020-03-18T13:47:58.597 回答
0

我认为您将无法让 2 个容器使用相同的port编号,因为它们共享相同的网络命名空间。

使用 Podman 配置容器网络

网络和 Podman pod

根据定义,Podman pod 中的所有容器共享同一个网络命名空间。这一事实意味着它们将具有相同的 IP 地址、MAC 地址和端口映射。您可以使用 localhost 在 pod 中的容器之间方便地进行通信。

进一步阅读:

于 2020-03-06T13:14:50.583 回答