podman 容器如何建立连接和端口问题?

How do podman containers make connections and port issues?

问题一:非root用户无法创建端口号为80的nginx应用?

Podman can not create containers that bind to ports < 1024.

Non priv users are not allowed to bind to ports < 1024, so this requires root.

所以我只能在root下创建nginx? 而且我还需要 PHP 和 mariadb 来支持我的站点,我尝试在 nginx 的配置文件中引用 PHP:

location ~ \.php(.*)$ {
    fastcgi_pass   php:9000;
    ...
}

nginx -t核对,报错: nginx: [emerg] host not found in upstream "php" in ...

但是 docker 就是这样工作的

我该怎么办?

docker 守护程序,运行 根权限,在系统级别管理网络。它创建额外的网络,其中 docker 容器有一个 IP 地址,并将主机连接到这些网络。

据我所知,无根 podman 进程也会创建这些网络,但无法将主机连接到这些内部 podman 网络,因为它没有足够的权限。

但是 rootless podman 可以将容器的端口映射到大于 1024 的端口,因为这不需要 root 权限。

我的解决方法:

  1. 我将我的无根 podman 容器中的 Web 应用程序 运行ning 公开到像 8090 这样的高端口,只能从 127.0.0.1 访问(因此只有来自您的主机的流量可以到达那里)。
  2. 我设置了一个 NGINX 反向代理来 proxy_pass 从端口 443 到端口 8090 的传入流量。

这样,Web 应用程序可以 运行 在无根容器中,并且仍然可以在标准端口(如 80 或 443)上访问。使用 nginx 作为反向代理,您甚至可以在以下位置管理 Let's Encrypt 证书一个中心点。

注意:在第 1 步中,您必须在 podman 命令中指定端口映射。类似于 podman run -p 127.0.0.1:8090:80 image.

为了完整起见,我的 nginx 配置类似于:

server {
        server_name example.org;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                #try_files $uri $uri/ =404;
                proxy_pass http://127.0.0.1:8080/;
        }
}