連接埠與開啟按鈕
連接埠如何被發布
容器內的連接埠在主機把它發布出去之前,是無法從網際網路連上的。啟動時,每個宣告的容器連接埠都會被對應到主機上的一個空閒連接埠,取自該主機可用的範圍。你連的是主機連接埠,而它幾乎不會和容器連接埠是同一個號碼 — 原因和你的 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 | 加上範本上宣告的每一個連接埠 |
宣告的連接埠可以帶一個標籤。標籤為 open、open_button 或 open-button 會把該連接埠標記為開啟按鈕的目標。其他所有標籤都只是描述性的,該連接埠會被當成一般的應用程式連接埠處理。
開啟按鈕
當範本宣告了一個開啟按鈕連接埠時,執行個體的 連線 頁籤會在 SSH 指令上方顯示一個 開啟 按鈕,指向主機上的那個連接埠。它是你的映像檔所提供的網頁介面的捷徑 — 推論前端、儀表板、檢視器 — 讓你不必自己去查已發布的連接埠。
連接埠號碼也會以 OPEN_BUTTON_PORT 交給容器,以防處理程序需要知道主控台正在宣傳它的哪一個連接埠。
每一種啟動模式都可以有開啟按鈕,args 也不例外。args 模式的範本執行的是映像檔自己的 entrypoint,但它仍然會收到 OPEN_BUTTON_PORT,也仍然會有開啟按鈕 —— 否則提供網頁介面的映像檔就永遠無法從主控台開啟,而那正是 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。只監聽 loopback 的處理程序可以透過 SSH 轉送連上,但無法透過已發布的主機連接埠連上。
協定
宣告的連接埠會指定一種協定:tcp、udp、http 或 https。前兩者才是實際在主機上保留的。後兩者只是關於該連接埠提供什麼服務的提示,而且都是走 TCP。
相關內容
- 連接埠 — 在範本上宣告連接埠
- 透過 SSH 連線
- 開啟 JupyterLab