使用 rootless podman 公开端口

cle*_*ens 5 rhel podman

我正在尝试在 RHEL 8.3 上使用无根 podman 公开端口 8080。

我使用的podman版本是:

$ podman --version
podman version 2.2.1
Run Code Online (Sandbox Code Playgroud)

我正在使用一个简单的FlaskAPI 来测试它:

from flask import Flask

app = Flask(__name__)


@app.route("/")
def hello():
    return "Hello from the container!\n"


if __name__ == "__main__":
    app.run(host="0.0.0.0")
Run Code Online (Sandbox Code Playgroud)

容器文件如下所示:

FROM python:3.6-alpine

RUN pip3 install flask

COPY app.py app.py

EXPOSE 5000

ENTRYPOINT python3 app.py

Run Code Online (Sandbox Code Playgroud)

我正在使用以下方法构建图像:

FROM python:3.6-alpine

RUN pip3 install flask

COPY app.py app.py

EXPOSE 5000

ENTRYPOINT python3 app.py

Run Code Online (Sandbox Code Playgroud)

我正在创建一个 Pod 并在该 Pod 中启动一个容器

$ podman build -t testapi .
Run Code Online (Sandbox Code Playgroud)

所有容器都按预期运行:

$ podman pod create --name testpod -p 8080:5000
$
$ podman run -d --rm --name testapi --pod testpod testapi 
Run Code Online (Sandbox Code Playgroud)

但是,我无法连接到该端口:

$ podman ps
CONTAINER ID  IMAGE                     COMMAND  CREATED             STATUS            PORTS                   NAMES
85289290cc7a  localhost/testapi:latest           3 seconds ago       Up 2 seconds ago  0.0.0.0:8080->5000/tcp  testapi
4b1ac2354a1a  k8s.gcr.io/pause:3.2               About a minute ago  Up 3 seconds ago  0.0.0.0:8080->5000/tcp  81aa31a38084-infra
Run Code Online (Sandbox Code Playgroud)

当我使用 netstat 查看正在使用哪个端口时,我得到以下信息:

$ telnet <IP> 8080
Trying <IP>...
telnet: Unable to connect to remote host: No route to host
Run Code Online (Sandbox Code Playgroud)

使用 lsof 我得到:

$ netstat -tulpn | grep LISTEN
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::8080                 :::*                    LISTEN      638593/containers-r 
tcp6       0      0 :::22                   :::*                    LISTEN      -                   
Run Code Online (Sandbox Code Playgroud)

当我使用 rootfull podman 做同样的事情时,它有效,即:

$ lsof -i -P -n | grep LISTEN
exe     638593   ds   13u  IPv6 593362      0t0  TCP *:8080 (LISTEN)

Run Code Online (Sandbox Code Playgroud)

现在的回应是:

$ sudo podman pod create --name testpod -p 8080:5000 
$ sudo podman run -d --rm --name testapi --pod testpod testapi
Run Code Online (Sandbox Code Playgroud)

网络统计返回:

$ telnet 10.100.2.220 8080
Trying 10.100.2.220...
Connected to 10.100.2.220.
Run Code Online (Sandbox Code Playgroud)

和lsof:

$ netstat -tulpn | grep LISTEN
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::22                   :::*                    LISTEN      -      
Run Code Online (Sandbox Code Playgroud)

有没有办法使用无根 podman 公开端口,以便我可以从 podman 主机访问它?

小智 4

使用 rootless pod 时请仔细检查此步骤:

$ telnet 8080 正在尝试... telnet:无法连接到远程主机:没有到主机的路由

我重现了你的环境和你的形象,没有发现任何问题。

PS:可能与firewalld有关,尝试打开8080端口。

# firewall-cmd --add-port=8080/tcp --permanent 
# firewall-cmd --reload
Run Code Online (Sandbox Code Playgroud)