跳到主要内容

端口与打开按钮

端口是如何发布的

容器内部的端口在主机把它发布出去之前,是无法从互联网访问的。启动时,每个已声明的容器端口都会被映射到主机上的一个空闲端口,取自这台主机可用的端口范围。你连接的是主机端口,它几乎从不和容器端口同号——原因与你的 SSH 端口不是 22 一样。

容器会被告知它的每个端口落在了哪个主机端口上,方式是为每个已发布的 TCP 端口设置一个环境变量:

# inside the instance
env | grep SUPERHEAT_TCP_PORT_
# SUPERHEAT_TCP_PORT_22=40123
# SUPERHEAT_TCP_PORT_8080=41007

SUPERHEAT_TCP_PORT_<n> 保存容器端口 <n> 对应的已发布主机端口。这只是信息性的:它存在是为了让实例上的进程能正确地对外公布自己的公网地址。UDP 端口没有这样的变量。

各启动模式会发布哪些端口

端口来自模板,再加上启动模式本身需要的那些:

启动模式自动发布此外
ssh容器端口 22加上模板上声明的每一个端口
jupyter容器端口 22 和 8080加上模板上声明的每一个端口
args不自动发布任何端口只有模板上声明的端口
vm容器端口 22加上模板上声明的每一个端口

声明的端口可以带一个标签。标签为 openopen_buttonopen-button 时,该端口会被标记为打开按钮的目标。其他任何标签都只是描述性的,端口按普通应用端口处理。

打开按钮

当模板声明了一个打开按钮端口时,实例的连接标签页会在 SSH 命令上方显示一个打开按钮,指向主机上的那个端口。它是为你的镜像所提供的 Web 界面准备的快捷方式——推理前端、仪表盘、查看器之类——这样你就不必去查已发布的端口号。

端口号也会以 OPEN_BUTTON_PORT 的形式传给容器,以备进程需要知道控制台对外公布的是它的哪个端口。

每种启动模式都可以有打开按钮,args 也不例外。args 模式的模板运行的是镜像自己的入口点,但它仍然会收到 OPEN_BUTTON_PORT,也仍然会有打开按钮 —— 否则提供 Web 界面的镜像就永远无法从控制台打开,而这正是 args 模式最主要的用途。

jupyter 模式的实例除了这个按钮之外,还会有自己的打开 JupyterLab 按钮。参见打开 JupyterLab

访问你自己启动的服务

端口是在实例启动时发布的。在运行中的实例里起一个服务器不会发布任何东西,所以一个刚跑起来的 python -m http.server 8000 从外部访问不到,无论你笔记本上的防火墙怎么设置都一样。

你有两个选择。

在模板上声明该端口,然后重新部署。 对于任何你会跑不止一次的东西,这是长期有效的做法。在模板的端口里加上这个端口,给它一个标签,然后重新部署。参见端口

通过 SSH 转发。 这不需要重新部署,对于事先没有规划的端口可以立即生效:

ssh -N -L 8000:localhost:8000 -p 40123 root@sh-us-tx-01.ssh.superheat.dev

让它一直运行,然后在浏览器里打开 http://localhost:8000。流量走的是你已经建立的 SSH 连接,因此不会有新的东西暴露到互联网上。

无论选哪条路,如果你希望已发布的端口可用,就把服务绑定到 0.0.0.0 而不是 127.0.0.1。只监听回环地址的进程可以通过 SSH 转发访问到,但通过已发布的主机端口访问不到。

协议

声明端口时要指定协议:tcpudphttphttps。前两个才是主机上实际预留的类型。后两个只是关于该端口提供什么服务的提示,它们本身跑在 TCP 之上。

相关内容