AboutDockerProfessional illustrations
Docker Run Port 基礎設定教學
好,各位想玩 Docker 嘅朋友,今次我哋就深入淺出講下 Docker Run Port 基礎設定教學。呢個係最核心嘅操作之一,因為你整好個 容器 之後,點樣俾外面嘅世界(即係你部主機或者網絡入面其他裝置)訪問到入面嘅服務,就全靠設定 端口(或者叫連接埠)映射。簡單嚟講,就係將你部主機(Host)嘅某個 端口,同 容器 內部運行緊嘅服務端口,做一個「駁通」嘅動作,呢個過程就叫 port mapping 或者 埠映射。
首先,你要明白一個基本概念:容器 本身係一個網絡隔離嘅環境,佢有自己嘅 IP 同埋端口空間。你喺個 容器 裏面行緊個 Nginx,佢默認監聽緊 80 端口,但呢個 80 端口係「容器內部」嘅 80,你喺外面部主機直接打 localhost:80 係唔會通嘅。要打通佢,就要用 docker run 命令入面嘅 -p 或者 --publish 參數。最常用嘅格式係 -p <主機端口>:<容器端口>。舉個實例,如果你喺 Docker Hub pull 咗個 Nginx 嘅映像檔落嚟,想將主機嘅 8080 端口映射去容器嘅 80 端口,個命令就係:docker run -d -p 8080:80 nginx。跟住你打開瀏覽器,輸入 http://localhost:8080,就會見到 Nginx 嘅歡迎頁面,呢個就係成功做到 端口轉發 啦。
咁設定端口映射有咩要注意呢?第一,主機端口嘅選擇。如果你主機嘅 8080 端口已經被其他程式用緊,咁你個 Docker Engine 就會彈錯誤,話地址已被使用。所以你要揀一個空閒嘅端口,例如 8888、9000 之類。第二,你可以將主機嘅端口映射去容器任何服務端口,唔一定同號碼。例如容器內部個服務行緊 3000 端口,你可以用 -p 80:3000,咁外面嘅人用 80 端口訪問,就會轉去容器嘅 3000 端口,對於隱藏內部設定好有用。第三,關於綁定特定主機 IP。有時你部主機有多個網絡介面(例如內網 IP 同公網 IP),你可以指定只綁定某個 IP 去做映射,格式係 -p
進階少少,你可以一次過暴露同映射多個端口。好似 Tomcat 呢類應用,可能除咗主要嘅 8080 端口,仲有管理端口之類。你可以用多個 -p 參數,例如 docker run -d -p 8888:8080 -p 8443:8443 tomcat。另外,仲有個 -P(大寫 P)參數好得意,佢會自動將你個 Dockerfile 裏面用 EXPOSE 指令聲明咗嘅所有容器端口,隨機映射去主機嘅高位端口(通常係 32768 以上)。你之後可以用 docker port <容器名稱> 呢個命令,睇返隨機分配咗邊個主機端口。呢個方法喺測試或者用 Docker Compose 配合 Swarm 做集群部署時幾方便。
講開 Docker Compose,佢係管理多容器應用嘅神器,設定端口映射就更加清晰。你喺 docker-compose.yml 檔案嘅服務底下,用 ports 呢個關鍵字去定義,格式同 docker run 差唔多,例如 ports: - "8080:80"。用 Compose 嘅好處係,你可以好容易統一管理成個應用堆棧(Stack) 嘅網絡設定,而且設定可以寫入版本控制(例如 GitBook),方便團隊協作。另外,如果你用 Portainer 呢類圖形化管理工具,佢哋嘅介面都會有專門嘅欄位俾你設定 port forwarding,唔使次次打命令,對於初學者嚟講更加直觀。
最後提下常見嘅陷阱同實用技巧。有時你明明做咗端口映射,但係都訪問唔到服務,可能係因為容器內部嘅應用根本未啟動或者監聽緊錯誤嘅端口。你可以用 docker logs <容器ID> 睇下日志,或者用 docker exec -it <容器ID> /bin/bash 進入容器內部,用 netstat -tulpn 之類嘅命令確認服務係咪真係喺預期嘅端口運行緊。另外,網絡設定 嘅模式都好影響。默認嘅 bridge 網絡模式支援端口映射,但如果你用咗 host 模式(--network=host),咁容器就會直接共用主機網絡,冇咗網絡隔離,端口會直接暴露喺主機上,就唔使再做映射,但就要小心端口衝突。仲有,如果你喺 CentOS 或者某啲防火牆設定好嚴嘅系統上玩,記得要開返主機防火牆對應嘅端口,或者暫時停用防火牆嚟測試。至於話想用 NVIDIA GPU 嘅容器,端口映射嘅原理都係一樣,唔會影響到,主要係加多啲關於 GPU 嘅運行參數。
總而言之,掌握 docker run -p 呢個基本操作,係你管理任何 容器 服務嘅第一步。無論你係想快速起個 Nginx 做測試,定係部署複雜嘅微服務,理解點樣正確地暴露同映射端口,先可以確保你嘅服務能夠被順利訪問。記住,容器網絡 雖然有隔離,但透過靈活嘅 端口暴露 同 綁定端口 設定,你就可以完全控制服務嘅訪問方式。
AboutDockerfileProfessional illustrations
點樣用 -p 參數映射端口
好啦,而家我哋就深入講下點樣用 docker run 命令入面嗰個 -p 參數 嚟做 端口映射,呢個係玩轉 Docker 網絡設定嘅基本功,搞唔掂嘅話,你個 容器 入面行得幾好嘅服務(例如 Nginx 或者 Tomcat)都係得個擺字,外面完全訪問唔到。
簡單嚟講,-p 參數嘅作用就係將你部 主機(Host,即係你部實體機或者 VM)上面嘅某個 端口,同你 run 起嚟嗰個 容器 內部嘅某個 端口 連接埋一齊,形成一個 埠映射(Port Mapping)或者叫 端口轉發(Port Forwarding)嘅通道。個格式通常係咁:-p <主機端口>:<容器端口>。舉個最常見嘅例子,如果你想喺主機嘅 8080 端口訪問 容器 裡面行緊嘅 Nginx(默認行緊 80 端口),你個命令就係「docker run -p 8080:80 nginx」。咁樣之後,你喺瀏覽器打「localhost:8080」或者「你部機嘅IP:8080」,請求就會穿過 Docker Engine 設定嘅 容器網絡,轉發去容器內部嘅 80 端口,Nginx 收到之後就會處理並回覆返俾你。呢個過程就係 服務暴露 去外面網絡嘅關鍵。
不過,端口映射 嘅玩法有幾種,唔好只係識一種。第一種係上面講嘅,明確指定主機同容器端口,例如「-p 8080:80」。第二種係只指定容器端口,但唔指定主機端口,例如「-p 80」,咁樣 Docker Engine 就會自動喺主機度揀一個空閒嘅、大過 30000 嘅隨機端口(例如 32768)綁定落去,你用「docker ps」命令就可以睇到個映射關係。第三種係可以指定主機嘅特定 IP 地址去做 綁定端口,例如你部機有幾個 IP,你可以用「-p 192.168.1.100:8080:80」,咁就只有通過呢個特定 IP 嘅 8080 端口先可以訪問到容器服務,增加咗少少 網絡隔離 同安全性。要記住,端口暴露 同 端口映射 係兩個相關但唔同嘅概念,你喺 Dockerfile 裡面用「EXPOSE 80」只係聲明咗個容器打算用 80 端口,但並唔會自動做主機映射,真正令到外面訪問到嘅,就係 run 嗰陣嘅 -p 參數,或者用 Docker Compose 檔案去定義。
講到實際應用,情況可以好複雜。例如,你個應用可能唔止一個端口,好似某個 Web App 可能要用 80 同 443(HTTPS),咁你就要映射多個端口:「docker run -p 8080:80 -p 8443:443 你個映像檔」。又或者,你喺開發緊個 CentOS 容器裡面嘅服務,需要同主機其他服務溝通,端口設定就好重要。另外,如果你用緊 Docker Compose 去管理多個容器,咁你通常唔會喺命令行打 docker run,而係會喺 docker-compose.yml 檔案裡面,喺服務底下用「ports:」段落去定義同樣嘅映射,例如「- "8080:80"」,效果一樣,但管理起嚟就整齊好多,尤其係當你配合 volume 同 環境變數 一齊用嘅時候。對於更大型嘅部署,好似用 Swarm 模式或者 Stack 去部署服務,端口映射嘅概念一樣,但設定方式會因應 網絡設定(例如 overlay network)而有唔同考量。
有幾點進階嘢同常見伏位要提醒大家。首先,主機端口 衝突係最常見問題,如果你主機嘅 8080 端口已經俾其他程式(可能係另一個 容器)用緊,你再映射去 8080 就會失敗,話「address already in use」。其次,關於安全性,隨便將容器端口映射去主機嘅 well-known 端口(如 80、443)或者用「-p 0.0.0.0:8080:80」呢種綁定所有介面嘅做法,等於將服務暴露俾成個網絡,記得要配合防火牆規則。另外,有時你明明做咗映射,但都係訪問唔到,可能係因為容器內部嘅應用根本未監聽(listen)嗰個端口,或者監聽咗但係綁定咗特定 IP(例如 127.0.0.1),呢個時候你就要入去容器檢查下,或者睇下個 Dockerfile 同應用本身嘅 網路設定。最後,一啲圖形化管理工具好似 Portainer,佢哋喺介面上面設定容器時,都係喺背後幫你生成呢啲 -p 參數,所以理解清楚原理,無論用命令行定係 GUI 都一樣得心應手。記住,無論你係喺 Stack Overflow 搵答案定係睇 GitBook 文檔,搞清楚「主機端口」同「容器端口」嘅關係,就係解決大部分 容器網絡 連接問題嘅第一步。
AboutNginxProfessional illustrations
主機端口對應容器端口實戰
好啦,而家我哋就嚟到實戰環節,講下點樣實際操作「主機端口對應容器端口」。呢個步驟可以話係將你個容器服務「開放」俾外界存取嘅關鍵一步,無論你係用緊 Nginx 做網頁伺服器、Tomcat 行 Java 應用,定係其他任何服務,端口映射 (port mapping) 嘅概念都係一樣嘅。最直接嘅方法,當然就係用 docker run 指令啦。假設我哋想從 Docker Hub 拉一個最新版嘅 Nginx 映像檔 落嚟運行,並且將主機嘅 8080 端口 對應到容器內部嘅 80 端口,個指令就係咁樣:docker run -d -p 8080:80 --name my-nginx nginx。呢度個 -p 參數就係整個 端口轉發 嘅靈魂,格式係「主機端口:容器端口」。意思即係話,當你喺自己部腦(或者伺服器)嘅瀏覽器打 localhost:8080,Docker Engine 就會自動將呢個請求轉發去容器裡面嘅 80 端口,咁你就可以見到 Nginx 嘅歡迎頁面啦。呢個過程就叫做將容器嘅服務暴露 (expose) 咗出嚟。
不過,實戰環境點會咁簡單呀,實有好多古怪情況要處理。例如,有時你想將主機嘅所有 IP 地址(即 0.0.0.0)嘅某個端口對應過去,又或者只想指定某個特定嘅主機 IP 先做映射。Docker 嘅 port mapping 功能都好彈性,你可以用 -p 192.168.1.100:8080:80 咁樣嘅格式,指定只有當有人透過 192.168.1.100 呢個 IP 嘅 8080 端口訪問時,先至轉發去容器。另外,如果你個應用(例如某啲數據庫或者後端 API)本身係用緊 TCP 以外嘅協定,比如 UDP,你都可以指明:-p 8080:80/udp。呢啲細微嘅網路設定,對於構建安全同精準嘅容器網絡環境好重要,可以避免唔必要嘅服務暴露喺公開網絡。
講開網絡,不得不提 Docker 本身有幾種唔同嘅網絡模式,而默認嘅「bridge」模式就係最常用嚟做端口映射嘅。喺呢個模式下,容器會有自己內部嘅 IP,同主機網絡係網絡隔離嘅,所以要靠 -p 參數呢座橋樑先可以同外界溝通。如果你將容器設定為「host」網絡模式,咁容器就會直接共用主機嘅網絡命名空間,理論上唔使再做端口映射,因為容器嘅服務已經直接綁定咗喺主機嘅端口上。但咁樣做會失去咗一部分容器嘅隔離性,所以一般嚟講,都係建議用返 bridge 模式再加 埠映射,管理上會清晰好多。
當然,我哋好少會次次打咁長串 docker run 指令嘅,尤其係當個應用需要設定多個端口、環境變數、volume 掛載點嘅時候。呢個時候,Docker Compose 就係你嘅好朋友啦。用一個 docker-compose.yml 檔案,你可以好清晰咁定義服務嘅端口暴露規則。例如,你可以咁樣寫:
` services: webapp: image: nginx:latest ports: - "8080:80" - "8443:443" volumes: - ./html:/usr/share/nginx/html environment: - NGINX_HOST=localhost
喺呢個設定入面,我哋唔單止做咗兩個端口映射(將主機 8080 同 8443 分別對應去容器嘅 80 同 443),仲設定咗檔案掛載同環境變數。之後只需要一句 docker-compose up -d,所有服務就會跟足設定行起嚟,係咪方便好多呢?對於管理複雜嘅多容器應用,用 Docker Compose 或者更進階嘅 Swarm 同 Stack 嚟管理綁定端口呢類網絡設定,絕對係專業之選。
另外,有啲情況我哋並唔想喺運行容器時即刻決定主機端口,而係想由 Docker 隨機分配一個高位端口(例如 32768 以上)。咁樣做對於一啲只需要內部訪問、或者透過負載均衡器對外嘅服務好有用。做法就係喺 docker run 指令度,只指定容器端口,而省略主機端口部分,例如:docker run -d -p 80 --name random-port-nginx nginx。跟住你可以用 docker port random-port-nginx 呢個指令,去查詢 Docker 隨機分配咗邊個主機端口俾你。呢個技巧喺用 Swarm 模式部署服務時特別常見,可以避免端口衝突。
最後都要提提安全同管理上嘅貼士。當你暴露咗端口之後,記得要檢查主機嘅防火牆設定,唔好唔記得咗開返相應嘅端口啊。另外,如果你用 Portainer 呢類圖形化管理工具,喺建立容器嘅介面度,通常都會有個好明顯嘅位置俾你設定 端口映射,原理同指令係一模一樣嘅,只係用圖形界面撳撳掣咁解。仲有,如果你嘅應用需要特殊硬件支援,例如係要用 NVIDIA GPU,咁就要確保你嘅 Docker 環境已經設定好相關嘅 runtime,呢個同端口設定無直接關係,但係整體部署嘅一部分。遇到問題嘅時候,記得上 Stack Overflow 或者官方 GitBook 文件度搵下,好多關於端口轉發唔成功嘅疑難雜症,例如係「明明映射咗但係訪問唔到」,可能同 SELinux(如果你用緊 CentOS 之類)、防火牆、或者容器內部應用本身未監聽正確端口有關,要逐層排查。
AboutcontainerProfessional illustrations
單一容器多端口映射技巧
講到單一容器多端口映射技巧,呢個真係 Docker 用家必學嘅實戰功夫。好多時我哋 run 一個 container,唔係淨係開一個 port 就搞得掂,好似一個 Nginx 容器可能要同時處理 HTTP (80) 同 HTTPS (443),又或者一個 Tomcat 應用要開管理端口同應用端口,甚至係一個開發環境嘅容器要同時暴露前端同後端嘅連接埠。咁點樣用 docker run 指令一次過搞掂晒呢?最基本嘅方法就係用多個 -p 或者 --publish 參數。例如你想將一個 CentOS 容器入面嘅 Nginx 服務嘅 80 同 443 端口,分別映射到主機嘅 8080 同 8443 端口,個指令就會係「docker run -p 8080:80 -p 8443:443 nginx」。呢個做法嘅好處係直接明瞭,每個端口映射都獨立設定,管理起嚟好清晰。
不過,當你要映射嘅端口愈來愈多,條指令就會變得又長又難管理。呢個時候,有冇啲更聰明嘅技巧呢?當然有啦。你可以考慮用 Dockerfile 預先定義好 EXPOSE 指令,雖然 EXPOSE 本身唔會自動做端口映射去主機,但佢有兩個好處:第一,佢係一種文檔,說明呢個映像檔預期會用邊啲端口;第二,當你同 Docker Compose 或者 Portainer 呢類工具一齊用嘅時候,佢哋會讀取呢個資訊,管理上會方便好多。另外,對於一啲複雜嘅應用,我哋強烈建議轉用 Docker Compose 去定義服務。喺 docker-compose.yml 檔案入面,你可以好清晰咁列明一個服務要映射幾多個端口,仲可以設定埋網絡設定同重啟策略 (restart policy),管理成個 stack 都輕鬆好多。
講到網絡設定同端口映射嘅關係,就一定要提下容器網絡模式。默認情況下,docker run 用嘅係 bridge 網絡,即係每個容器有自己嘅內部 IP,然後通過端口映射同主機溝通。但係如果你將容器設定做 host 網絡模式,咁容器就會直接共用主機嘅網絡命名空間,即係話容器入面開嘅端口會直接喺主機上暴露,唔使再做映射。不過咁樣做會犧牲咗網絡隔離性,保安上要考慮清楚。另一種情況係,如果你用緊 Docker Swarm 做集群管理,咁服務嘅端口暴露同映射就會透過 swarm 嘅內置負載均衡器去處理,設定上又會唔同。
對於進階用家,有時會遇到一啲特別嘅端口映射需求。例如,你想將容器嘅端口映射到主機嘅一個特定 IP 地址,而唔係所有介面 (0.0.0.0)。咁你可以用「-p 192.168.1.100:8080:80」呢種格式,咁就只有主機嘅 192.168.1.100 呢個 IP 會接受對 8080 端口嘅請求,再轉發去容器嘅 80 端口。呢個對於多網卡或者需要嚴格網絡隔離嘅環境好有用。又例如,你想映射嘅係 UDP 端口而唔係 TCP,咁就要喺端口號後面加上 /udp,好似「-p 53:53/udp」咁樣。
最後,實戰上總會遇到啲古靈精怪嘅問題。點解明明映射咗端口,但係從外面連唔到?首先要檢查吓 Docker Engine 有冇正常運行,跟住要確認容器有冇成功啟動同監聽緊指定嘅端口(可以用 docker logs 睇下)。然後,要留意主機嘅防火牆設定,有冇 block 咗你映射出去嘅主機端口。另外,如果你係用緊雲服務供應商,好似 AWS 或者 GCP,佢哋嘅安全組或者防火牆規則都要記得開返相應嘅端口。有時啲問題可能同應用本身有關,例如你個 Nginx 容器入面嘅設定檔,可能只係監聽咗 localhost (127.0.0.1),而唔係所有介面 (0.0.0.0),咁就算端口映射做咗,外面都係連唔入去。所以,除咗識得點樣做多端口映射,仲要識得點樣排查問題,咁先算係真正掌握呢門技巧。記住,善用 docker port 呢個指令,可以快速睇到一個運行緊嘅容器,佢嘅端口映射情況,對於除錯好有幫助。
About容器Professional illustrations
避免端口衝突嘅實用方法
講到避免端口衝突,呢個真係每個 Docker 用家遲早都會撞到嘅頭痛問題。想像一下,你喺部主機度行緊一個 Nginx container,用緊 80 同 443 端口,跟手你想再起多個 Tomcat 或者另一個 Web 服務嘅容器,如果唔理三七二十一又用 docker run -p 80:80,咁就即刻會彈個「端口已被佔用」嘅錯誤出嚟,成個 container 都起唔到。所以,點樣有策略地管理好啲端口,係避免撞埠嘅第一步。
最基本又最直接嘅方法,就係喺用 docker run 做端口映射嘅時候,主動指定一個主機上未被使用嘅端口。例如,你部主機嘅 80 端口已經俾第一個 Nginx 容器用咗,咁你第二個 Nginx 測試環境就可以用 -p 8080:80 或者 -p 8081:80。咁樣做嘅好處係清晰明瞭,你一眼就知邊個服務對應邊個主機端口。不過,呢個方法靠人手記住邊個端口用咗,喺開發或者測試環境少少哋幾個容器就話啫,一旦服務多起上嚟,或者用埋 Docker Compose 去管理多個服務,就好易亂籠。
所以,進階啲嘅做法就係要善用 Docker Compose 呢個工具。喺你個 docker-compose.yml 檔案入面,你可以好清晰咁定義每一個服務(service)要映射去主機邊個端口。更重要嘅係,Docker Compose 會幫你管理好成個 容器網絡,默認會為你個 stack 創建一個獨立嘅網絡,咁樣入面嘅容器之間可以用服務名互相通訊,而唔需要下下靠主機端口映射。對於 服務暴露 俾外面世界(即係主機以外)訪問嘅需求,你先至需要喺 compose 檔案度設定 端口轉發。例如,你可以指定 web 服務用主機嘅 8080 端口映射去容器嘅 80 端口,而 database 服務就完全唔使暴露端口出主機網絡,咁就自然減低咗端口衝突嘅機會,安全性亦都高咗。
另一個非常實用嘅概念係 網絡隔離。Docker 嘅網絡模式有好幾種,預設嘅 bridge 模式固然方便,但如果你想徹底避免同主機或者其他容器嘅端口撞車,可以考慮用 host 網絡模式或者自定義網絡。不過要留意,用 host 模式即係容器直接共用主機網絡命名空間,咁樣容器入面嘅服務端口就會直接綁定喺主機端口上,反而更容易導致衝突,所以通常用於對網絡性能有極端要求嘅特定場景。更常見嘅係創建自定義嘅 Docker 網絡,然後將相關嘅容器加入同一個自定義網絡。咁樣,容器之間可以透過容器名直接溝通(例如你個 App 容器直接連去一個叫 mysql 嘅容器嘅 3306 端口),而完全唔需要將 MySQL 嘅 3306 端口暴露喺主機上,主機嘅 3306 端口就可以留返俾其他本地程式用,從根源上避免衝突。
對於生產環境或者更複雜嘅部署,你可能會用到 Docker Swarm 或者配合 Portainer 呢類圖形化管理工具。喺 Swarm 模式底下,當你部署一個服務(service)時,你可以透過 埠映射 設定,只係將服務端口發布到 Swarm 集群嘅特定節點,或者使用 Swarm 嘅內置負載均衡器。Portainer 亦提供咗一個直觀嘅界面,俾你一眼睇晒所有容器嘅狀態同埋佢哋所佔用嘅主機端口,邊個端口被邊個容器用緊一清二楚,方便你規劃新容器嘅端口綁定。
最後,養成良好習慣都係好緊要。每次用 docker run 或者編寫 Dockerfile 嘅 EXPOSE 指令(雖然 EXPOSE 主要係文檔作用,同實際運行時嘅端口映射係兩回事)之前,最好先用 docker ps 或者 netstat -tulpn | grep :端口號 呢類命令,檢查一下目標主機端口係咪真係空閒。另外,善用 環境變數 嚟設定端口號都係一個好方法,尤其係喺 CI/CD 流程或者用 Docker Compose 嘅時候,你可以透過環境變數檔案(.env)嚟動態設定唔同環境(開發、測試、生產)用唔同嘅端口,咁就大大減少咗因為配置寫死而導致衝突嘅風險。記住,端口管理就好似泊車位一樣,有規劃就唔會亂,服務起得順暢,你嘅 Docker Engine 運行起上嚟自然更加穩定。
AboutComposeProfessional illustrations
2026年Docker網絡模式解析
講到2026年嘅Docker網絡模式,我哋首先要明,Docker Engine嘅網絡設定已經比幾年前更加精細同強大。而家玩container,唔再係單純docker run -p 8080:80咁簡單。Docker嘅網絡隔離設計,本質上係為咗令每個容器好似一部獨立主機咁運作,有自己嘅IP、端口同路由表。最基本嘅模式有bridge、host、none同埋user-defined networks。Bridge模式係預設,佢會自動創建一個虛擬網絡,等容器之間可以透過內部IP溝通,但同主機端口隔離。如果你想個Nginx容器直接暴露服務俾外界,就要做端口映射(port mapping),即係用-p或者-P參數,將容器端口(例如80)綁定去主機端口(例如8080)。呢個過程,我哋通常叫端口轉發或者埠映射。
舉個實用例子,假如你用Dockerfile整咗個Tomcat映像檔,想行起個container並將佢內部嘅8080端口暴露出去。你可以用命令docker run -d -p 8888:8080 --name my-tomcat tomcat:latest。咁樣,你喺主機用瀏覽器打localhost:8888,請求就會轉發去容器內部嘅8080端口。呢個設定對於開發同測試好方便,尤其係當你部機行緊CentOS或者Ubuntu,想同時行多個服務又唔想端口撞咗。不過要留意,直接綁定端口到主機所有介面(0.0.0.0)可能有安全風險,2026年嘅最佳實踐係,如果服務只需要內部溝通,就盡量用user-defined networks,減少不必要嘅暴露。
而家好多團隊都用Docker Compose去管理多容器應用,佢嘅網絡設定就更加直觀。喺docker-compose.yml檔案裏面,你可以直接定義services之間點樣連線。例如,一個Web app同一個Database,你可以將佢哋放喺同一個自定義網絡裏面,咁樣Web app就可以直接用service名(例如db)去連線到Database容器,完全唔使理會IP地址,亦唔需要將Database端口暴露俾主機。呢種方式實現咗服務暴露嘅精準控制,只將真正需要對外嘅服務(例如Nginx)做端口映射。另外,Docker Compose而家仲整合得更好,可以好容易咁定義重啟策略(restart policy)、環境變數同volume,令成個應用堆疊(Stack)嘅網絡配置同運維更加一體化。
對於更複雜嘅生產環境,例如用Docker Swarm或者Kubernetes(雖然唔係Docker自家,但好常見),網絡模式嘅考慮又唔同。Swarm模式下面,服務(service)會自動分配到唔同節點,佢嘅容器網絡要支援跨主機通訊。呢個時候,端口暴露嘅做法可能係透過Swarm嘅routing mesh,你只需要喺service定義入面指定公開端口,Swarm就會幫你管理所有節點上嘅流量分發。另外,2026年嘅生態裏面,好似Portainer呢類GUI管理工具,已經可以好圖形化咁幫你設定同可視化呢啲網絡連接,對於唔太熟命令嘅管理員嚟講真係幫咗好多。
最後都要提提,網絡設定唔好忽略資源同硬件嘅配合。例如而家好流行用NVIDIA GPU去做AI推理,如果你個容器需要用到GPU,又同時要做網絡端口映射,就要確保Docker Engine嘅版本同NVIDIA Container Toolkit有正確設定,避免因為網絡隔離而影響到GPU驅動程式同容器內部應用嘅通訊。遇到問題嘅時候,除咗睇官方GitBook文檔,去Stack Overflow或者Docker社群論壇搵吓2025、2026年嘅新帖,通常都會有最新嘅解決方案。總而言之,理解清楚每種Docker網絡模式嘅特點,配合好似Docker Compose呢類工具,再根據係開發定係生產環境去規劃端口轉發同服務暴露,先可以確保你嘅容器應用又安全又高效。
AboutDockerProfessional illustrations
容器間直接連線設定(Container1 to Container2)
講到容器間直接連線設定,即係 Container1 直接搵 Container2 傾偈,呢個就係 Docker 網絡設定嘅核心玩法啦。好多香港嘅開發者初初玩 Docker,成日就只係識用 docker run -p 去做端口映射,將容器端口綁定去主機端口,等外面世界可以訪問。但係當你個應用複雜起嚟,例如係微服務架構,有幾個唔同嘅容器服務要互相溝通(好似係一個 Nginx 容器要將請求轉發去後面嘅 Tomcat 容器),你就唔會想樣樣都經主機端口轉發,又慢又唔安全。直接喺 Docker 嘅內部網絡入面,讓容器之間用容器名同內部 IP 直接連線,先至係正道,又快捷又符合網絡隔離嘅安全原則。
咁點樣先可以做到呢種直接連線呢?首先你一定要理解 Docker Engine 點樣幫你管理容器網絡。當你用 docker run 起容器嘅時候,如果你無特別指定,Docker 會自動將個容器放入一個叫做 "bridge" 嘅默認網絡入面。喺呢個橋接網絡入面,容器之間係可以透過 IP 地址互相 ping 通嘅,但係靠 IP 好唔方便,因為每次重啟容器 IP 可能會變。所以,關鍵就係要點樣用「容器名」當作主機名嚟直接訪問。最簡單直接嘅方法,就係自己創建一個自定義嘅 Docker 網絡。你用 docker network create my_network 整一個新網絡出嚟,然後用 docker run --network=my_network --name container1 同 docker run --network=my_network --name container2 將兩個容器放晒入同一個自定義網絡。咁樣之後,喺 container1 入面,你就可以直接用 ping container2 或者用 http://container2:8080 呢類地址直接訪問到 container2 暴露嘅端口,完全唔需要經主機做端口轉發,呢個就係最基本嘅容器間直接連線設定。
當然啦,實戰唔會次次手動打 command,用 Docker Compose 去管理就更加方便同標準化。喺你個 docker-compose.yml 檔案入面,Docker Compose 已經好聰明,會自動為你定義嘅服務創建一個專屬網絡。你只需要喺 services 底下定義好你嘅 service1 (例如係一個 Nginx 映像檔) 同 service2 (例如係一個 CentOS 行緊某個 API),佢哋默認就已經喺同一個網絡入面,可以直接用服務名當 hostname 互相訪問。呢個設定對於本地開發同測試簡直係神器,你可以好逼真咁模擬到生產環境嘅服務發現同通訊。另外,記得喺你嘅 Dockerfile 入面,要用 EXPOSE 指令去聲明呢個容器會監聽嘅端口,呢個動作雖然唔會實際做端口映射,但係一個好好嘅文檔,等睇 Dockerfile 嘅人知道內部服務端口係幾多,對於之後用 Docker Compose 或者 Portainer 呢類工具去做堆疊(Stack)管理都好有幫助。
進階少少嚟講,網絡設定嘅玩法仲有好多。例如你想做到更精細嘅網絡隔離,或者個別服務唔應該被其他所有容器訪問,你就可以喺 Docker Compose 入面定義多個網絡,然後只將需要互通嘅服務連接到同一個網絡。又或者,當你個應用要處理持久數據,你可能會配合 volume 同環境變數一齊設定,等容器之間唔單止可以網絡連線,仲可以安全地共享一啲配置同數據。如果你玩到 Docker Swarm 模式,咁服務發現同負載均衡嘅設定又會再唔同,但核心思想都係一樣:喺同一個 overlay 網絡入面嘅服務,可以直接用服務名互連。最後提提你,做呢類設定時,如果遇到問題,除咗去 Stack Overflow 搵答案,不妨去 Docker 官方嘅 GitBook 或者文檔睇吓最新嘅容器網絡模型,特別係關於 DNS 解析嘅部分,因為容器之間靠名互相訪問,背後就係靠 Docker 內置嘅 DNS 伺服器做解析,理解埋呢點,你 debug 起上嚟就會更加得心應手。
AboutDockerProfessional illustrations
用Docker Network實現內部通訊
講到用Docker Network實現內部通訊,呢個就係將幾個container連埋一齊、但係又同外界隔離嘅高階玩法啦。好多香港嘅開發者初初玩Docker,淨係識用 docker run -p 去做端口映射,將container裏面嘅服務暴露俾主機用。但係當你要部署一個完整嘅應用,例如係一個Nginx做web server,後面連住一個Tomcat去處理應用邏輯,再加個數據庫,咁樣淨係靠端口映射就唔夠洗啦,成個主機嘅端口會亂晒龍,而且安全性同管理上都好麻煩。Docker Network 呢個功能就係專門為咗解決容器之間點樣安全又有效率咁通訊而設嘅。
簡單嚟講,Docker Network 幫你建立一個虛擬嘅網絡,你可以將相關嘅container全部加入呢個網絡裏面。喺同一個自定義網絡裏面嘅container,可以直接用對方個container名當作hostname嚟互相訪問,完全唔使理會主機嘅IP或者做一大堆端口轉發設定。例如,你個Nginx container想將請求轉發去後面個Tomcat container,你只需要喺Nginx嘅設定檔裏面,直接寫 proxy_pass http://tomcat-container:8080; 就得啦,因為佢哋喺同一個Docker網絡裏面已經自動識別到對方。呢種方式實現嘅內部通訊,乾淨俐落,亦都符合而家微服務架構嘅設計思想。
點樣實際操作呢?首先,你可以用 docker network create my-app-network 嚟建立一個新網絡。跟住,你每次用 docker run 啟動container嘅時候,就加個參數 --network my-app-network,咁個container就會連入呢個網絡。例如,啟動一個Tomcat容器:docker run --name my-tomcat --network my-app-network -d tomcat:latest。然後,你再啟動一個Nginx容器,同樣加入同一個網絡:docker run --name my-nginx --network my-app-network -p 80:80 -d nginx:latest。咁樣,Nginx container內部就可以直接通過 http://my-tomcat:8080 呢個地址訪問到Tomcat嘅服務,而呢個通訊過程完全喺網絡內部進行,對外係隔離嘅,安全性高好多。
當然,實戰中我哋好少會逐個container用手動命令去起,通常都會用 Docker Compose 嚟編排。喺一個 docker-compose.yml 檔案裏面,你可以好清晰咁定義晒所有服務同埋個網絡。Docker Compose 預設就會為你個應用堆棧(Stack)建立一個專屬網絡,裏面所有服務自動就喺同一個網絡度,互相之間直接用服務名(service name)通訊,超級方便。呢個就係點解我哋成日話,用Docker Compose係管理多容器應用嘅基本步,佢將容器網絡同服務暴露呢啲複雜設定變得可讀性極高。
另外,進階一啲嘅用法仲可以玩網絡隔離。你可以為唔同類型嘅服務建立唔同嘅網絡,達到隔離嘅目的。例如,將前端服務(Nginx)同後端API服務(Tomcat)放喺一個叫 frontend-backend 嘅網絡,而將後端API服務同數據庫服務(例如MySQL)放喺另一個叫 backend-db 嘅網絡。咁樣,前端服務就無法直接訪問到數據庫,必須通過後端API服務,呢種設計就係遵循咗最小權限原則,對於應用安全係好重要嘅一環。你可以透過 docker network connect 同 disconnect 命令去動態管理容器同網絡嘅連接。
對於更大型嘅部署,例如用 Docker Swarm 去做集群管理,Swarm本身就會提供一個強大嘅overlay網絡,令到唔同主機上嘅服務都可以好似喺同一個網絡裏面咁通訊。呢個時候,端口暴露嘅概念就更加需要同網絡設定一齊考慮。你可能只會將真正需要對外嘅服務(如Nginx嘅80端口)透過Swarm嘅routing mesh暴露出去,而內部服務之間嘅通訊就全部交由overlay網絡處理,完全唔需要做埠映射到主機端口上。
最後都要提提,設定網絡嘅時候,都要諗埋其他相關配置點樣配合。例如,環境變數可以用嚟傳遞服務嘅地址同端口;volume 就用嚟持久化儲存配置或者數據,等容器重新啟動時網絡身份或者設定唔會丟失。而家去到2026年,Docker Engine嘅網絡功能已經非常成熟穩定,配合 Portainer 呢類圖形化管理工具,或者透過 GitBook、Stack Overflow 上嘅最新社區分享,要掌握點樣設計一個安全又高效嘅容器網絡絕對唔係難事。記住,理解好網絡模型,係你從Docker初學者進階到能夠部署真正生產級應用嘅關鍵一步。
AboutPortainerProfessional illustrations
公開端口 vs 內部端口嘅分別
好喇,咁我哋就深入啲講下 Docker 裡面「公開端口」同「內部端口」嘅分別。呢個概念真係好核心,尤其係當你喺部主機上面用 docker run 去起個 container,或者喺 Dockerfile 裡面寫 EXPOSE,又或者用 Docker Compose 去設定成個 stack 嘅時候,理解清楚呢兩個端口嘅角色,就唔會咁易搞亂個 網路設定,導致個服務出唔到街或者撞 port。
首先,我哋要搞清楚咩係 內部端口。簡單嚟講,內部端口就係個 容器 自己內部嘅服務監聽緊嘅埠號。舉個例,你由 Docker Hub 拉落嚟個 Nginx 映像檔,佢預設係監聽緊內部嘅 80 端口。呢個係個 container 自己嘅世界裡面嘅地址,就好似一間屋裡面嘅房間號碼(例如 80 號房)。無論你個 Docker Engine 行喺 CentOS 定係其他系統,個 Nginx container 自己內部就一定係用緊呢個端口。你喺 Dockerfile 入面寫 EXPOSE 80,其實主要係一個文檔說明嘅作用,話畀人知呢個映像檔預期會監聽 80 呢個 內部端口,但佢本身並唔會自動將個端口開畀主機或者外界。同樣道理,如果你 run 一個 Tomcat container,佢嘅 web 服務可能內部係監聽緊 8080 端口,呢個都係屬於容器內部網絡嘅設定。
咁 公開端口 又係咩呢?公開端口,亦都經常被叫做 主機端口,就係你部實體主機(Host)上面用來接收外界請求嘅埠號。當你要將外界嘅流量導入去容器內部嘅服務時,就必須要做 端口映射 或者叫 端口轉發。呢個就係 docker run -p 指令嘅魔法所在。例如你打 docker run -p 8080:80 nginx,呢句指令嘅意思就係:將你部主機嘅 8080 端口(公開端口),映射去 Nginx container 內部嘅 80 端口(內部端口)。咁樣當用戶用瀏覽器訪問 http://你部主機IP:8080 嘅時候,請求就會穿過主機網絡,經由 Docker 嘅 容器網絡 系統,轉發到容器內部嘅 80 端口,最後畀 Nginx 處理。呢個過程就完美體現咗 網絡隔離 同服務暴露嘅結合——容器內部依然係一個隔離嘅環境,但就可以透過一個特定嘅通道(端口映射)同外界溝通。
所以,最關鍵嘅分別就喺於「位置」同「用途」。內部端口 係容器世界裡面嘅地址,專注於服務本身嘅監聽設定;而 公開端口 就係主機世界對外嘅大門,負責接收外來流量並轉發入去。你可以想像,一個內部端口可以映射去多個唔同嘅公開端口(當然要唔同嘅服務),例如將同一個 Nginx container 嘅 80 端口,同時映射去主機嘅 8080 同 8888 端口,理論上都得,但好少會咁做。相反,一個公開端口同一時間就只能映射去一個容器嘅內部端口,唔可以兩個 container 同時霸住主機嘅同一個公開端口,否則就會出現端口衝突,其中一個服務會起唔到。
喺實際應用上,點樣設定呢兩種端口會直接影響你嘅部署架構。如果你用 Docker Compose,喺 docker-compose.yml 檔案裡面,你會用 ports: 呢個段落去定義 埠映射,寫法就好似 "8080:80" 一樣,前面係主機端口,後面係容器端口。呢個方法對於管理多容器應用好方便。另外,對於更複雜嘅環境,例如用 Swarm 模式做集群部署,或者用 Portainer 呢類 GUI 管理工具去設定服務,你都需要清晰咁設定呢個映射關係,先可以確保服務能夠被正確訪問。
仲有一點好重要,就係關於安全性。將端口公開到主機網絡(甚至係公開到所有介面 0.0.0.0)意味住增加咗暴露面。所以,喺生產環境,我哋通常會配合防火牆規則,或者透過反向代理(例如另一個 Nginx container)去管理對外嘅公開端口,而唔係將資料庫呢類內部服務嘅端口直接映射出去。呢個就牽涉到 容器網絡 嘅進階設計,例如用自定義網絡嚟控制容器之間嘅通訊,只有真正需要對外嘅服務(如 Web Server)先做端口映射。
最後提多個實用例子:假設你喺開發一個需要用到 NVIDIA GPU 加速嘅應用,個應用本身喺 container 內部係監聽 5000 端口(內部端口)。你嘅開發機主機可能已經有其他服務用緊 5000 端口,咁你就可以用 -p 5001:5000 嚟映射,令你可以透過主機嘅 5001 端口去測試個 GPU 應用。呢個設定唔會影響到容器內部程式碼本身監聽 5000 端口嘅邏輯,充分體現咗端口映射嘅靈活性。總而言之,記住「內外有別」呢個原則,分清邊個端口屬於容器內部,邊個端口屬於主機對外,咁你喺設定 docker run、Docker Compose 或者管理 Stack 嘅時候,就會更加得心應手,減少喺 Stack Overflow 或者 GitBook 到瘋狂搜尋答案嘅時間啦。
AboutSwarmProfessional illustrations
Docker Compose點樣設定端口
講到 Docker Compose 點樣設定端口,其實就係將你嘅服務端口對應返去主機上面,等外面可以訪問到。呢個過程,我哋通常叫做 端口映射 或者 埠映射,英文就係 port mapping 同埋 port forwarding。喺 Docker Compose 檔案裏面,設定端口嘅方法好直接,主要就係喺 service 嘅設定度,用 ports 呢個關鍵字去定義。最基本嘅寫法就係 - "主機端口:容器端口"。例如你個 Nginx 容器內部行緊 80 端口,你想用主機嘅 8080 端口去訪問,咁你就可以寫 - "8080:80"。咁樣,當你喺主機打開瀏覽器,輸入 localhost:8080,就會連接到個 Nginx 容器裏面。
不過,設定端口唔係就咁寫個數字咁簡單,有好多細節位要留意。首先,你要理解清楚 容器網絡 嘅概念。Docker Compose 預設會幫你創建一個獨立嘅網絡,將檔案裏面所有 service 放埋一齊,等佢哋可以透過 service 名稱互相溝通。呢個時候,端口映射嘅設定,就係控制緊呢堆 容器 同外面主機(或者外部網絡)之間嘅通道。如果你唔設定 ports,咁服務就只會喺呢個內部網絡裏面暴露,外面係完全訪問唔到嘅,呢個亦係一種 網絡隔離 嘅安全措施。所以,當你個服務係需要俾公眾訪問,例如係一個網站或者 API,你就必須要做端口映射。
另外,設定端口嗰陣,你可以選擇只指定容器端口,而唔寫主機端口。例如寫 - "3000"(留意,呢個寫法喺新版 Compose 檔案入面,可能要配合特定語法)。咁樣 Docker Engine 就會自動幫你揀一個主機上空閒嘅高位端口(例如 32768 以上)去綁定。呢個方法喺開發環境好有用,可以避免同主機其他服務撞端口。但係喺生產環境,我哋通常都會明確指定主機端口,方便管理同設定防火牆規則。仲有,你可以將主機端口設定為一個範圍,例如 - "3000-3005:8080-8085",咁就可以一次過映射多個連續端口,適合一啲需要用到多端口嘅複雜應用。
講到實際例子,我哋可以諗下一個典型嘅 Web 應用 Stack。假設你用 Docker Compose 去行一個 WordPress 網站,裏面會包含一個 WordPress 容器同一個 MySQL 容器。MySQL 容器通常唔需要暴露俾外面,所以唔使設定 ports,只需要喺內部網絡俾 WordPress 容器連接。而 WordPress 容器就需要設定 ports: - "80:80",將主機嘅 80 端口映射過去,等用戶可以用瀏覽器直接訪問。又或者,如果你喺同一部主機行緊其他網站,你可以改做 - "8080:80",用 8080 端口去行 WordPress。呢個就係 服務暴露 嘅基本邏輯。
除咗簡單映射,網路設定 仲有更高階嘅玩法。例如,你可以指定綁定嘅主機 IP 地址。如果你部主機有多個網絡介面(例如有內網 IP 同公網 IP),你可以寫 - "192.168.1.100:80:80",咁樣就只會將容器嘅 80 端口映射到主機嘅 192.168.1.100 呢個 IP 地址嘅 80 端口上,而唔會影響其他 IP。呢個對於伺服器安全同網絡規劃好重要。另外,喺設定端口時,你亦可以指定協議,例如 - "53:53/udp",預設係 TCP,如果你個服務需要 UDP 就要特別標明。
最後,要提提大家一啲常見嘅陷阱同最佳實踐。首先,唔好隨便將數據庫呢類敏感服務嘅端口(例如 MySQL 嘅 3306)直接映射到主機嘅公共接口,除非你有充分嘅安全措施,否則好易被人攻擊。其次,喺編寫 Docker Compose 檔案時,記得端口映射同 容器端口 本身係兩回事。你喺 Dockerfile 裏面用 EXPOSE 指令暴露嘅端口,主要係用作文檔說明同俾某些工具(例如 Docker Compose 本身)讀取,佢並唔會自動進行映射。實際嘅映射一定要喺 docker run 嘅 -p 參數或者 Compose 檔案嘅 ports 設定度完成。另外,當你修改咗 Compose 檔案嘅端口設定,記得要用 docker-compose down 再 up 去重新創建容器,因為端口映射係喺容器創建時決定嘅,單純 restart 係唔會生效嘅。
總括嚟講,用 Docker Compose 設定端口係將你嘅應用服務開放俾外界嘅關鍵步驟。由最簡單嘅一對一映射,到指定 IP、協議,甚至係端口範圍,Docker 都提供咗足夠嘅彈性。緊記根據你嘅應用類型(例如係 Nginx 網頁伺服器、Tomcat 應用伺服器,抑或係一啲需要用到 NVIDIA GPU 加速嘅特殊容器)同部署環境(開發、測試、生產),去謹慎規劃你嘅 主機端口 同 容器端口 對應關係,咁先可以確保服務既通暢又安全。
AboutTomcatProfessional illustrations
安全考量:限制端口存取範圍
講到用 Docker 運行服務,好多工程師第一時間諗起嘅就係 docker run -p 8080:80 呢類指令,將容器端口映射出主機。方便就真係方便,但係如果唔理安全考量,隨便將端口暴露出去,就好似將屋企大門打開任人入嚟一樣危險。所以,限制端口存取範圍絕對唔係可有可無嘅步驟,而係保護你容器服務嘅第一道防線。
首先,你要搞清楚「暴露」同「映射」嘅分別。喺 Dockerfile 裡面用 EXPOSE 80,只係一個文檔說明,話俾人知呢個映像檔預設會用咩端口,本身並唔會打開任何主機端口。真正將服務暴露俾外界接觸嘅,係 docker run 或者 Docker Compose 入面嘅 port mapping 設定。好多新手會犯嘅錯誤,就係貪方便,用 -p 80:80 呢種寫法,直接將容器端口綁定到主機嘅所有網絡介面(即係 0.0.0.0)。咁樣做,等於將你個 Nginx 或者 Tomcat 服務,開放俾成個網絡(包括公司內網甚至公網)任何能夠連接到你部主機嘅設備去存取,風險極高。
咁點樣限制端口存取範圍先至安全呢?最直接嘅方法,就係喺做端口映射嘅時候,指定只綁定到特定嘅主機 IP 地址。例如,你個服務只係需要俾同一部伺服器上嘅其他容器存取,或者只係需要俾本地管理工具(例如 Portainer)連線,你可以用 -p 127.0.0.1:8080:80 呢個格式。咁樣設定之後,個服務端口就只會監聽本機迴環地址(localhost),外界網絡根本無法直接接觸到,即刻安全好多。呢個技巧對於部署數據庫、內部管理後台呢類唔應該公開嘅服務尤其重要。
另外,善用 Docker 本身嘅網絡設定功能,亦係進行網絡隔離同限制存取嘅有效手段。與其依賴預設嘅 bridge network,你可以為一組相關嘅服務建立一個自定義嘅 Docker network。例如,用 Docker Compose 或者 Stack 部署一個 web 應用,你可以將個 Nginx 容器同個應用程式容器放喺同一個自定義網絡裡面,然後只係將 Nginx 嘅 80/443 端口映射出去。至於後端嘅應用程式容器、數據庫容器,就完全唔需要做任何端口轉發,佢哋之間透過內部網絡名互相溝通,外界完全無法直接掃描或攻擊到呢啲內部服務端口。呢種做法,正正就係最小權限原則嘅實踐。
仲有,唔好忽略防火牆(例如主機上嘅 iptables 或者 firewalld)嘅作用。Docker Engine 默認會直接操作 iptables 去建立端口轉發規則。雖然方便,但有時會同你現有嘅主機防火牆設定撞到七彩,或者無意中打開咗一啲你唔想開嘅端口。由 2025 年尾開始,越來越多關於 Docker 與現代防火牆服務(如 nftables)整合最佳實踐嘅討論。作為管理員,你應該定期檢查主機嘅防火牆規則(例如用 iptables -L -n 或者 nft list ruleset),確認 Docker 自動生成嘅規則符合你嘅安全預期。對於生產環境,更加建議採用明確嘅策略:先喺主機防火牆層面嚴格限制輸入(INPUT chain),只開放必要嘅管理端口(如 SSH),然後再讓 Docker 管理其服務端口嘅規則。咁樣可以避免 Docker 意外暴露服務。
最後,要提一提持續監控同審計。就算你設定好咗,都唔係一勞永逸。你可以用 docker port
AboutCentOSProfessional illustrations
進階技巧:動態端口映射
講到Docker嘅進階技巧,動態端口映射真係一個可以令你管理容器服務靈活好多嘅功能。簡單嚟講,我哋平時用 docker run -p 8080:80 nginx 呢類指令,係將主機嘅8080端口固定綁定到容器嘅80端口,呢個就係靜態映射。但係當你想喺同一部主機行多個相同映像檔,或者唔想每次手動指定主機端口嗰陣,靜態映射就好麻煩,甚至會因為端口衝突而要成日改設定。動態端口映射就係將決定權交返畀Docker Engine,等佢自動喺主機揀一個可用嘅高位端口(例如32768以上)去映射落容器嘅指定端口,做法就係喺 docker run 嗰陣,只係指定容器端口,而省略主機端口,好似 docker run -p 80 nginx 咁。之後你用 docker ps 或者 docker port <容器ID> 指令,就可以睇到Docker Engine實際分配咗邊個主機端口畀你,例如可能係 0.0.0.0:32768->80/tcp。呢個方法對於用Docker Compose去部署一堆服務,或者喺Swarm模式入面做服務暴露時,特別好用,可以避免人手管理端口衝突呢啲瑣碎嘢。
咁點樣可以將呢個技巧融入日常開發同部署呢?我舉幾個實際例子。首先,如果你用緊Docker Compose去定義你嘅服務堆疊,你喺 docker-compose.yml 檔案裏面,可以咁樣寫你個Nginx服務嘅端口映射:直接寫 "80" 而唔寫 "8080:80"。當你行 docker-compose up 之後,Compose 就會自動同每個服務分配獨立嘅主機端口。呢個方法喺本地開發環境測試多個項目版本時好方便,你唔使驚撞端口。另外,進階玩家可能會用Portainer呢類圖形化管理工具,佢嘅介面通常都會顯示容器嘅實際映射關係,包括動態分配嘅端口,令管理更加直觀。至於點樣確保服務穩定性呢?你可以配合 restart policy 一齊用,例如設定成 always 或者 unless-stopped,咁就算個容器因為某啲原因重新啟動,Docker Engine都好大機會會嘗試將同一個動態端口分配返畀同一個容器,減少服務中斷嘅影響。當然,對於一啲對外嘅正式服務,你可能需要配合反向代理(例如用另一個固定端口嘅Nginx容器)將呢啲動態端口嘅服務統一對外暴露,咁就兼顧咗靈活性同管理便利性。
最後都要提下動態端口映射嘅限制同埋最佳實踐。第一,佢最明顯嘅缺點就係主機端口唔固定,所以如果你嘅客戶端或者其他服務需要直接連線,就會有麻煩。解決方法通常係透過服務發現(Service Discovery)機制,或者好似上面提到,用一個固定端口嘅入口服務做轉發。第二,喺設定容器網絡,特別係自定義網絡或者用緊Swarm嘅overlay 網絡時,動態映射依然生效,但就要留意網絡隔離嘅設定會唔會影響到端口嘅可訪問性。第三,如果你嘅應用程式本身需要某啲特定嘅環境變數(例如知曉自己對外嘅完整URL),咁純粹依賴動態端口就可能唔夠,你需要額外透過Dockerfile嘅 ENV 指令,或者 docker run 嘅 -e 參數,將Docker Engine分配嘅端口值注入去容器入面,不過呢個過程通常需要一啲外掛腳本或者更複雜嘅編排工具配合。總括而言,將動態端口映射視為你工具箱裏面其中一件利器,喺適合嘅場景(例如CI/CD流水線自動測試、多租戶環境部署、或者係微服務架構嘅部分內部服務)運用,可以大幅減輕你管理端口轉發設定嘅負擔。記住,無論用靜態定動態,最緊要係清楚自己個應用嘅網路設定同訪問需求,先至可以做出最貼身嘅部署策略。
AboutNVIDIAProfessional illustrations
常見錯誤:端口無法存取點解決
好喇,今次我哋集中火力拆解一個玩 Docker 時幾乎個個都遇過,又係最𤷪𤺧嘅問題:明明用 docker run 指定咗端口映射,點知喺主機就係存取唔到個容器服務。喺 2026 年嘅今日,Docker Engine 同各種工具(好似 Portainer、Docker Compose)雖然愈嚟愈穩定,但呢類網絡設定嘅「鬼掩眼」問題依然常見,尤其係新手或者趕住部署嘅時候。我哋就由淺入深,一步步睇下點樣排查同解決。
首先,最基礎又最易漏嘅一步,就係檢查你個 容器 本身係咪真係有監聽你指定嘅 端口。好多時我哋會假設個 映像檔(例如 Nginx、Tomcat)預設就開咗 80 埠或者 8080 埠,但事實未必係咁。你可以用 docker exec 命令入到個 container 裏面,用 netstat 或者 ss 呢類指令,睇下個服務程式(例如 Nginx)係咪真係 bind 咗喺你期望嘅端口同 IP 上。有時個服務可能只係監聽緊容器內部嘅 localhost (127.0.0.1),而唔係 0.0.0.0,噉就算你做咗 端口映射(port mapping),外面都係連唔入去。呢個時候就要去修改服務本身嘅設定檔,或者喺 Dockerfile 入面用環境變數去設定佢。
跟住落嚟,就要睇下你條 docker run 命令有冇寫錯。最基本嘅 端口轉發(port forwarding)語法係 -p <主機端口>:<容器端口>。常見錯誤係掉轉咗嚟寫,或者個主機端口已經被其他程式佔用咗。你可以用 sudo lsof -i :<端口號> 或者 netstat 去檢查主機端口嘅使用情況。另外,如果你用緊 Docker Compose 去定義服務,要留意 yml 檔案裏面 ports 段落嘅寫法,一樣係「主機:容器」嘅格式,而且縮排要好準確,唔係嘅話成段設定都可能唔生效。有時為咗方便,我哋會直接去 Docker Hub 拉個 image 落嚟用,但唔同版本嘅映像檔,佢暴露(EXPOSE)出嚟嘅端口可能唔同,呢點都要睇清楚說明。
第三個要排查嘅範圍,就係 容器網絡(container networking)嘅模式同 網絡隔離。Docker 預設係用 bridge 網絡模式,即係容器自己有一個內部網絡,然後通過橋接同主機通訊。如果你係用緊自定義網絡,或者用緊 Docker Swarm 嘅 overlay 網絡,咁端口映射嘅行為可能會唔同。特別係喺 Swarm 模式底下,你要用 publish 指令去 暴露服務(service暴露)先得,齋用 -p 參數可能唔夠。另外,防火牆都係一個大敵!無論係主機本身嘅 iptables / firewalld / ufw,定係雲服務商(例如 AWS、GCP)嘅安全組規則,都要確保你映射出嚟嘅 主機端口 係允許傳入連線嘅。喺 2026 年,好多雲平台嘅網絡設定更加複雜,有啲仲會同 Kubernetes 或者服務網格(Service Mesh)整合,所以要逐層去檢查。
最後,一啲進階少少嘅情況都值得提一提。例如,如果你個應用係需要特權或者特定硬件,好似係要用 NVIDIA GPU 去做運算,有時個容器起動流程可能因為資源問題而卡住,導致裏面個服務根本冇成功運行,自然就冇監聽端口。你可以用 docker logs 命令去睇下容器嘅日誌輸出,睇下有冇 error。又或者,你係用 volume 去掛載設定檔,但係掛載咗一個錯誤或者空白嘅設定檔入容器,導致 Nginx 或者 Tomcat 等等服務啟動失敗。另外,重啟策略(restart policy)設做 always 雖然好,但都要配合健康檢查,先可以確保服務真係 ready 咗先接受流量。
總括嚟講,解決「端口無法存取」呢個問題,需要一個有系統嘅排查思路:1) 確認容器內服務運行狀態同監聽設定;2) 覆核 docker run 或 Docker Compose 嘅端口綁定語法同主機端口衝突;3) 檢查主機同網絡層嘅防火牆設定;4) 了解當前容器所處嘅網絡模式(bridge, host, none 或自定義網絡)。平時遇到問題,除咗去 Stack Overflow 或者相關嘅 GitBook 文檔搵答案,最好都係自己建立一套除錯 checklist,噉樣以後無論係起一個簡單嘅 CentOS 測試容器,定係部署一個複雜嘅應用堆疊(Stack),都可以快狠準咁揪出問題根源,唔使喺度盲舂舂。記住,網絡設定呢家嘢,細節決定成敗,少一個橫槓或者錯一個數字,個服務就可以同你玩足半日捉迷藏。
AboutOverflowProfessional illustrations
點樣檢查容器端口狀態
好啦,我哋用 Docker run port 設定好咗個容器之後,點樣可以檢查到個容器嘅端口狀態係咪真係如我所願咁運作緊呢?呢個步驟對於確保服務正常暴露同網絡連接性係至關重要嘅。喺 Docker 世界裡面,有幾個好直接又實用嘅方法可以幫到我哋,唔單止睇到設定,仲可以測試到實際嘅連通狀態。
最直接嘅方法梗係用返 Docker 自己嘅指令啦。打開你嘅終端機,輸入「docker ps」呢個指令,佢會列出所有運行緊嘅容器。你會見到一個叫做 PORTS 嘅欄位,呢度就清晰顯示咗每個容器嘅端口映射情況。例如,你可能會見到「0.0.0.0:8080->80/tcp」咁樣嘅顯示,意思就係主機嘅所有網絡介面(0.0.0.0)上嘅 8080 端口,已經成功映射到呢個容器內部嘅 80 端口。如果你想睇得更詳細,可以用「docker inspect [容器ID或名稱]」呢個指令。佢會輸出一個好詳細嘅 JSON 格式資訊,我哋要搵嘅係「NetworkSettings」->「Ports」呢個部分,裡面會列明所有暴露同映射咗嘅端口,包括協議(TCP/UDP)同綁定嘅主機 IP 地址,對於複雜嘅網路設定嚟講,呢個資訊係最權威同最完整嘅。
不過,淨係睇設定未必夠,我哋仲要驗證個端口係咪真係可以通到。呢個時候,我哋就要借助一啲網絡工具。如果你本身喺運行緊容器嘅同一部主機上面,可以用「curl」或者「telnet」呢類工具去測試。例如,你映射咗主機嘅 8080 端口到容器內 Nginx 嘅 80 端口,咁你就可以喺主機度試下「curl http://localhost:8080」,如果收到 Nginx 嘅歡迎頁面或者你部署嘅網站內容,就證明端口映射同服務運行都一切正常。另一個常用工具係「netstat」或者新啲嘅「ss」指令,用「ss -tulpn | grep :8080」可以睇到主機系統層面上,有冇程式真係監聽緊 8080 呢個端口,同埋係邊個程式(通常會顯示為 docker-proxy 呢個進程)喺度處理緊,呢個可以幫我哋確認 Docker Engine 確實有做好端口轉發嘅工作。
如果個容器係用 Docker Compose 或者 Stack 咁樣以服務堆疊嘅形式運行,檢查方法又會有多啲選擇。用「docker-compose ps」可以睇到該專案下所有服務容器嘅狀態同端口資訊,好集中。而對於更龐大嘅集群管理,好似用開 Portainer 呢類圖形化管理工具嘅朋友,就可以直接喺佢嘅 Web 介面裡面,點選具體嘅容器,然後喺詳細資訊頁面入面,好直觀噉睇到所有網絡同端口嘅配置,對於唔太熟命令列嘅使用者嚟講非常方便。另外,有時我哋嘅容器網絡模式可能唔係默認嘅 bridge,而係用咗 host network 或者自定義網絡,咁端口暴露嘅方式就會唔同。喺 host 網絡模式底下,容器會直接共用主機網絡,端口會直接開喺主機上,檢查時就要特別留意會唔會同主機其他程式撞咗端口。
最後都要提提,檢查端口狀態唔單止係喺容器啟動嘅一刻做,而係一個持續嘅過程。特別係當我哋設定咗 restart policy 等容器可以自動重啟,或者用緊 Swarm 做集群部署時,服務可能會被調度去唔同嘅節點運行。定期檢查端口狀態,可以確保我哋嘅服務持續可用。例如,我哋寫個好簡單嘅腳本,定時用 curl 去測試吓某個服務端口,如果失敗就發告警,咁就做到基本嘅監控啦。總括嚟講,由睇靜態配置嘅「docker inspect」,到動態測試連通性嘅「curl」,再到系統層面確認嘅「ss」指令,結合埋管理工具嘅圖形化介面,我哋就可以全方位咁掌握住容器嘅端口狀態,確保我哋嘅應用程式能夠順利噉透過設定好嘅連接埠同外界溝通。
AboutGitBookProfessional illustrations
2026年最佳實踐:端口管理策略
講到2026年嘅端口管理策略,我哋首先要認清一個現實:而家嘅容器部署規模同複雜度,同幾年前已經完全唔同層次。以前可能係單機跑幾個 container,而家動輒就係跨主機、混合雲,甚至要協調埋 AI 工作負載(例如用到 NVIDIA GPU 嘅容器)。所以,端口管理唔再係簡單喺 docker run 命令後面加個 -p 8080:80 就算。最佳實踐嘅核心,已經從「點樣映射」轉移到「點樣有策略、有系統、安全地暴露同管理服務」。
最基本嗰層,好多師兄仲係直接手動打 docker run -p 命令。唔係話唔得,但對於2026年嘅標準嚟講,咁樣好容易出錯同難維護。例如,你點確保唔會撞 port?點記低每個 container 用咗主機邊個 port?最佳實踐係要「Infrastructure as Code」化。無論你用 Docker Compose 定係更高級嘅 Stack 定義,都應該將端口映射嘅配置寫死喺檔案入面。好似 Docker Compose 檔案,你可以清清楚楚定義個服務要將容器內部嘅咩端口(例如 Nginx 嘅 80)綁定到主機嘅咩端口(例如 8080)。咁樣,成個團隊都有單一來源嘅真理(Single Source of Truth),用 Git 管理,邊個改過咩一清二楚。另外,而家好興用 Portainer 呢類圖形化管理工具,佢可以好直觀咁幫你管理晒所有容器嘅網絡設定同端口暴露情況,對於團隊協作同快速排查問題真係幫咗好多。
講到端口轉發同網絡隔離,策略就更加重要。千祈唔好習慣性將容器端口暴露到主機嘅 0.0.0.0(即所有網絡介面)。2026年,安全係重中之重。如果你個服務只係俾內部其他容器調用(例如一個資料庫 container 俾個 Web App container 用),咁就完全唔需要做 -p 主機端口映射,直接用 Docker 默認創建嘅容器網絡,讓服務喺內部通過容器名同內部端口通訊,呢個係最安全嘅做法。如果個服務真係需要俾外界訪問,就要諗清楚係咪只需要暴露喺主機嘅內部 IP(例如 -p 192.168.1.100:8080:80)或者特定網卡上。呢個就係網絡設定嘅精粹:按需暴露,最小權限原則。
對於複雜啲嘅多服務應用,Docker Compose 同 Docker Stack(配合 Swarm)就係你嘅好朋友。佢哋可以幫你定義一個獨立嘅網絡,入面所有服務嘅端口都只喺呢個隔離網絡內部分享。外界要訪問,通常只會通過一個入口點(例如一個 Nginx 或 Traefik 反向代理容器)去暴露單一嘅 80 同 443 端口。呢個反向代理容器就負責將請求轉發到內部相應服務嘅容器端口。咁樣做,你主機嘅防火牆規則會簡單好多,而且所有流量都可以喺入口點統一做 SSL 終止同安全檢查。舉個例,你個應用有 Tomcat 同 CentOS 跑嘅後端 API,佢哋各自用緊 8080 同 3000 端口,但係你完全唔使將呢兩個端口映射出主機,只需要設定好 Nginx 容器嘅配置,等佢將 /api 嘅請求轉去 API 容器,其他請求轉去 Tomcat 容器,乾乾淨淨。
仲有一點好重要,就係關於端口衝突同動態分配。當你喺多部主機上部署(例如用 Swarm),硬性指定主機端口(例如一定要用主機嘅 8080)好容易導致部署失敗,因為唔同主機上可能有其他服務霸咗個 port。2026年嘅做法係,除非必要,盡量唔好綁定到特定主機端口;如果一定要,就要用完善嘅服務發現同配置管理工具去協調。另一個技巧係,喺 Docker Compose 入面,你可以只指定容器端口,而唔指定主機端口(例如 ports: - "3000"),等 Docker Engine 自己幫你喺主機揀個空閒嘅高位端口(例如 32768)去映射。對於外部負載均衡器嚟講,佢哋可以透過 API 得知呢個動態分配嘅端口,一樣可以正常路由流量。
最後,文化同流程都好關鍵。團隊應該建立清晰嘅文檔,記錄低每個應用或服務需要暴露嘅端口同原因,可以用 GitBook 之類嘅工具管理。當遇到問題時,唔好只係去 Stack Overflow 搵段命令抄,要理解背後嘅容器網絡原理。定期審查運行緊嘅容器,用 docker ps` 或者 Portainer 檢查有冇不必要嘅端口暴露咗出嚟。同時,要善用 restart policy 確保容器異常退出後可以重連網絡,但要注意,如果係端口綁定衝突導致啟動失敗,單純重啟係解決唔到問題嘅,呢個時候就要靠完善嘅監控告警機制。總而言之,2026年嘅端口管理,係一套結合咗安全意識、自動化工具、清晰架構設計同團隊規範嘅綜合策略,絕對唔可以馬虎。