發佈和公開連接埠
說明
如果您一直按照指南操作到目前為止,您應該瞭解容器會為應用程式的每個組件提供隔離的行程。每個組件(React 前端、Python API 和 Postgres 資料庫)都在其沙盒環境中執行,與主機上的所有其他內容完全隔離。這種隔離對於安全性和管理依賴關係非常重要,但這也意味著您無法直接存取它們。例如,您無法在瀏覽器中存取網路應用程式。
這就是連接埠發佈的用途所在。
發佈連接埠
發佈連接埠可透過設定轉發規則來突破一些網路隔離。例如,您可以指示主機的連接埠 8080
上的請求應轉發到容器的連接埠 80
。連接埠發佈在使用 -p
(或 --publish
)旗標搭配 docker run
建立容器期間進行。語法為
$ docker run -d -p HOST_PORT:CONTAINER_PORT nginx
主機連接埠
:您希望在主機上接收流量的連接埠號碼容器連接埠
:容器內正在接聽連線的連接埠號碼
例如,要將容器的連接埠 80
發佈到主機連接埠 8080
$ docker run -d -p 8080:80 nginx
現在,傳送到主機上連接埠 8080
的任何流量都將轉發到容器內的連接埠 80
。
重要
發佈連接埠時,預設會將其發佈到所有網路介面。這表示到達您機器的任何流量都可以存取已發佈的應用程式。請注意發佈資料庫或任何敏感資訊。 在此進一步瞭解已發佈的連接埠。
發佈到臨時連接埠
有時,您可能只想發佈連接埠,但不關心使用哪個主機連接埠。在這些情況下,您可以讓 Docker 為您選擇連接埠。為此,只需省略 主機連接埠
設定即可。
例如,下列命令會將容器的連接埠 80
發佈到主機上的臨時連接埠
$ docker run -p 80 nginx
容器執行後,使用 docker ps
將顯示所選的連接埠
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a527355c9c53 nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:54772->80/tcp romantic_williamson
在此範例中,應用程式公開在主機的連接埠 54772
上。
發佈所有連接埠
建立容器映像檔時,會使用 EXPOSE
指令來指示打包的應用程式將使用指定的連接埠。預設不會發佈這些連接埠。
使用 -P
或 --publish-all
旗標,您可以自動將所有公開的連接埠發佈到臨時連接埠。當您嘗試避免在開發或測試環境中發生連接埠衝突時,這非常有用。
例如,下列命令將發佈映像檔設定的所有公開連接埠
$ docker run -P nginx
試用看看
在本實作指南中,您將學習如何使用 CLI 和 Docker Compose 發佈容器連接埠以部署網路應用程式。
使用 Docker CLI
在此步驟中,您將執行容器並使用 Docker CLI 發佈其連接埠。
下載並安裝 Docker Desktop。
在終端機中,執行下列命令以啟動新的容器
$ docker run -d -p 8080:80 docker/welcome-to-docker
第一個
8080
指的是主機埠。這是您本地機器上用來存取容器內執行的應用程式的埠。第二個80
指的是容器埠。這是容器內應用程式監聽連入連線的埠。因此,此指令將主機的8080
埠綁定到容器系統上的80
埠。前往 Docker Desktop Dashboard 的容器視圖來驗證已發佈的埠。
您可以透過選擇容器埠欄位中的連結,或是在瀏覽器中瀏覽 https://#:8080 來開啟網站。
使用 Docker Compose
此範例將使用 Docker Compose 啟動相同的應用程式。
建立一個新的目錄,並在該目錄內建立一個名為
compose.yaml
的檔案,其中包含以下內容:services: app: image: docker/welcome-to-docker ports: - 8080:80
ports
設定接受幾種不同形式的埠定義語法。在本例中,您使用的是與docker run
指令中相同的主機埠:容器埠
格式。開啟終端機,並導覽到您在上一個步驟中建立的目錄。
使用
docker compose up
指令來啟動應用程式。在您的瀏覽器中開啟 https://#:8080。
其他資源
如果您想深入了解此主題,請務必查看以下資源:
後續步驟
現在您已了解如何發佈和公開埠,您可以學習如何使用 docker run
指令覆寫容器預設值。