我正在尝试创建一个运行我的 Node-js Web 服务器的 Podman 容器。虽然由于某种原因,我无法通过 localhost:443 访问它,但我可以通过容器私有 IP 地址访问它,例如 (10.88.0.5:443)
当我curl私有IP时你可以看到:
curl https://10.88.0.5
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.se/docs/sslcerts.html
curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above
(失败只是因为SSL证书是为我的域颁发的,但至少它可以实际联系网站。)
curl https://localhost --connect-timeout 5
curl: (28) SSL connection timeout
连接超时。
看着
sudo netstat -tulp | grep https
您可以看到网络服务器已正确绑定到 443:
tcp 12 0 0.0.0.0:https 0.0.0.0:* LISTEN 4991/conmon
podman 报告了同样的事情:
sudo podman port -l
443/tcp -> 0.0.0.0:443
这也是我的容器文件:
FROM node:22.2.0
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 443
CMD ["node", "."]
可以看到443端口暴露了。
这是容器运行的网络配置:
[
{
"name": "podman",
"id": "2f259bab93aaaaa2542ba43ef33eb990d0999ee1b9924b557b7be53c0b7a1bb9",
"driver": "bridge",
"network_interface": "podman0",
"created": "2024-07-10T12:43:23.144060349-04:00",
"subnets": [
{
"subnet": "10.88.0.0/16",
"gateway": "10.88.0.1"
}
],
"ipv6_enabled": false,
"internal": false,
"dns_enabled": false,
"ipam_options": {
"driver": "host-local"
}
}
]
和我的路由表:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default mynetwork 0.0.0.0 UG 0 0 0 eno2
10.88.0.0 0.0.0.0 255.255.0.0 U 0 0 0 podman0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.100.0 0.0.0.0 255.255.255.0 U 0 0 0 eno2
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
我尝试禁用 UFW。我尝试完全重新安装 Podman。两者都没有起作用。如果我做错了什么或者您希望我尝试什么,请告诉我。我已经尝试解决这个问题四天了。如果有人可以提供帮助,我们将不胜感激。
仅供参考。我正在运行最新版本的 Debian。
如果您正在使用 Cockpit 并且您想知道为什么容器可能无法在网络外部正确访问,Cockpit 实际上可能是根本原因。无论出于何种原因,即使正确绑定,通过 Podman 初始化容器时似乎还是存在问题。
解决方案非常简单,只需确保先创建容器并通过 Podman 运行容器即可。就我而言,我必须使用这个命令:
sudo podman run -d -p 443:443/tcp --restart always --name webserver localhost/nodeserver
请记住,这是使用发布标志 (-p) 的语法:
-p=[[ip:][hostPort]:]containerPort[/protocol]
根据文档。
现在您已经有了一个正在运行的容器,实际上可以通过 Cockpit 进行管理,因为看来您只需要担心初始化。因此,您仍然可以停止、启动和使用Cockpit提供的所有其他管理功能,如下图所示。我可能决定在Cockpit的官方Github上创建错误报告。