以下是原文翻译成繁體中文的Markdown格式:

Docker - Managing Ports

# Docker - 管理端口:初學者指南

你好,未來的Docker愛好者!我很興奮能成為你進入Docker端口管理世界的導航者。作為一個教了多年計算機科學的人,我親眼見證了Docker如何革新我們開發和部署應用的方式。所以,讓我們一起深入探索Docker中管理端口的概念吧!

## EXPOSE 與 PUBLISH:理解差異

在我們開始編寫代碼之前,讓我們先澄清一個許多學生遇到的常見困惑:Docker中的EXPOSE和PUBLISH之間的差異。

### EXPOSE

EXPOSE就像在房子上掛一個「出售」的牌子。它表示容器正在监聽特定端口,但它並不會實際上讓這些端口從容器外部訪問。

### PUBLISH

另一方面,PUBLISH就像打開前門並邀請人們進來。它將容器中的一個端口映射到主機機器上的端口,使其可以从外部訪問。

我們來看一個簡單的表格來總結:

| 命令 | 目的 | 從外部訪問? |
|-------|-------|----------------|
| EXPOSE | 文档端口 | 否 |
| PUBLISH | 映射端口 | 是 |

現在,我們已經澄清了這一點,讓我們看看如何在實踐中真正使用這些!

## 如何使用PUBLISH在Docker中暴露端口?

當你運行一個容器時,你可以使用`-p`或`--publish`標誌來映射容器端口到主機端口。假設我們在容器中有一個運行在端口8080的網頁應用程序,我們想在其上訪問端口80的主機機器。

這樣做:

```bash
docker run -p 80:8080 my-web-app

讓我們分解一下:

  • docker run:這個命令運行一個容器
  • -p 80:8080:這個映射容器中的端口8080到主機上的端口80
  • my-web-app:這是我們的Docker镜像名稱

運行這個命令後,你可以通過在網頁瀏覽器中導航到http://localhost來訪問你的網頁應用程序。這不是很棒嗎?

但如果我們想映射多個端口怎麼辦?沒問題!我們可以使用多個-p標誌:

docker run -p 80:8080 -p 443:8443 my-web-app

這將端口8080映射到80以進行HTTP流量,並將8443映射到443以進行HTTPS流量。這就像給你的應用程序一個前門和一個後門!

如何在Dockerfile中暴露端口?

現在,讓我們談談我們如何在Dockerfile中直接暴露端口。這在你構建自己的Docker镜像時非常有用。

這是一個簡單的Node.js應用程序的Dockerfile:

FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "node", "server.js" ]

讓我們分解一下:

  • FROM node:14:這將我們的基礎镜像設置為Node.js版本14
  • WORKDIR /app:這設置我們容器中的工作目錄
  • COPY package*.json ./:這將我們的package.json文件複製到容器中
  • RUN npm install:這安裝我們的依賴
  • COPY . .:這將我們的應用程序代碼複製到容器中
  • EXPOSE 8080:這告訴Docker,容器將监聽端口8080
  • CMD [ "node", "server.js" ]:這是啟動我們應用程序的命令

在這裡,EXPOSE指令就像我們之前提到的「出售」牌子。它告訴Docker,「嘿,這個容器將會使用這些端口!」

但記住,僅僅使用EXPOSE不會發布端口。要讓端口在運行容器時真正可訪問,我們仍然需要使用-p標誌:

docker run -p 80:8080 my-node-app

這將容器中暴露的端口8080映射到主機機器上的端口80。

結論

這就是了,各位!我們一起穿越了Docker端口管理的領地,從理解EXPOSE和PUBLISH的差異,到在我們的Dockerfile和運行命令中實際使用它們。

記住,在Docker中管理端口是關於通信的。EXPOSE就像告訴Docker,「嘿,我會使用這些端口」,而PUBLISH則像告訴你的計算機,「我想要你聽這個Docker容器上的這些端口。」

隨著你繼續你的Docker冒險,你會發現理解端口管理對於部署應用程序尤其重要,尤其是在複雜的微服務架構中。但別擔心,隨著練習,它會變得習以為常!

常見問題

以下是一些學生經常問的問題:

  1. 問:我可以在docker run命令中使用EXPOSE嗎? 答:不,EXPOSE只在Dockerfile中使用。對於運行時端口映射,使用-p標誌。

  2. 問:如果我在運行容器時不使用PUBLISH會怎麼樣? 答:容器會運行,但你無法從Docker網絡外部訪問它。

  3. 問:我可以將容器端口映射到多個主機端口嗎? 答:可以!你可以使用多個-p標誌將單個容器端口映射到多個主機端口。

  4. 問:暴露或發布端口有數量限制嗎? 答:在Docker中沒有硬性限制,但你的操作系統可能對可用端口有限制。

  5. 問:docker run中的-p-P有什麼區別? 答:-p允許你指定端口映射,而-P會將所有暴露的端口發布到主機上的隨機端口。

記住,最好的學習方式是實踐。所以打開終端,開始創建一些Dockerfile,並且開心地編程吧!

Credits: Image by storyset