釋出和暴露埠

解釋

如果您一直關注到目前為止的指南,您就會明白容器為應用程式的每個元件提供了隔離的程序。每個元件——React 前端、Python API 和 Postgres 資料庫——都在自己的沙盒環境中執行,與您主機上的其他所有東西完全隔離。這種隔離對於安全和管理依賴關係非常有用,但它也意味著您無法直接訪問它們。例如,您無法在瀏覽器中訪問 Web 應用程式。

這就是埠釋出的作用所在。

釋出埠

釋出埠提供了透過設定轉發規則來突破一點網路隔離的能力。例如,您可以指定主機埠 8080 上的請求應轉發到容器的埠 80。埠釋出在容器建立期間使用 docker run-p(或 --publish)標誌進行。語法是

$ docker run -d -p HOST_PORT:CONTAINER_PORT nginx
  • HOST_PORT:您希望接收流量的主機上的埠號
  • CONTAINER_PORT:容器內正在監聽連線的埠號

例如,要將容器的埠 80 釋出到主機埠 8080

$ docker run -d -p 8080:80 nginx

現在,任何傳送到您主機上埠 8080 的流量都將被轉發到容器內的埠 80

重要

當一個埠被髮布時,預設情況下它會發布到所有網路介面。這意味著任何到達您機器的流量都可以訪問已釋出的應用程式。請注意釋出資料庫或任何敏感資訊。 在此處瞭解更多關於已釋出埠的資訊

釋出到臨時埠

有時,您可能只想釋出埠,但不在乎使用哪個主機埠。在這種情況下,您可以讓 Docker 為您選擇埠。為此,只需省略 HOST_PORT 配置即可。

例如,以下命令會將容器的埠 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 來發布容器埠以部署 Web 應用程式。

使用 Docker CLI

在此步驟中,您將執行一個容器並使用 Docker CLI 釋出其埠。

  1. 下載並安裝 Docker Desktop。

  2. 在終端中,執行以下命令以啟動一個新容器

    $ docker run -d -p 8080:80 docker/welcome-to-docker
    

    第一個 8080 指的是主機埠。這是您本地機器上用於訪問容器內執行的應用程式的埠。第二個 80 指的是容器埠。這是容器內應用程式監聽傳入連線的埠。因此,該命令將主機的埠 8080 繫結到容器系統上的埠 80

  3. 透過轉到 Docker Desktop 儀表板的 Containers(容器)檢視來驗證已釋出的埠。

    A screenshot of Docker Desktop Dashboard showing the published port
  4. 透過選擇容器的Port(s)(埠)列中的連結或在瀏覽器中訪問 https://:8080 來開啟網站。

    A screenshot of the landing page of the Nginx web server running in a container

使用 Docker Compose

此示例將使用 Docker Compose 啟動相同的應用程式

  1. 建立一個新目錄,並在該目錄內建立一個名為 compose.yaml 的檔案,內容如下

    services:
      app:
        image: docker/welcome-to-docker
        ports:
          - 8080:80

    ports 配置接受幾種不同形式的埠定義語法。在這種情況下,您使用的是與 docker run 命令中相同的 HOST_PORT:CONTAINER_PORT

  2. 開啟一個終端並導航到您在上一步中建立的目錄。

  3. 使用 docker compose up 命令來啟動應用程式。

  4. 在瀏覽器中開啟 https://:8080

其他資源

如果您想更深入地瞭解這個主題,請務必檢視以下資源

後續步驟

既然您已經瞭解瞭如何釋出和公開埠,您就可以學習如何使用 docker run 命令覆蓋容器的預設設定了。

覆蓋容器預設值