AboutDockerProfessional illustrations
Docker run -it 詳解 (2026最新)
好喇,等我哋深入淺出咁講下2026年最新嘅 Docker run -it 點用啦。呢個指令可以話係玩 Docker 嘅基本功,尤其係當你想同個容器(Container)進行即時互動嗰陣,-it 呢兩個參數就係你嘅好朋友。簡單啲講,-i 同 -t 通常會一齊用,-i 係 interactive 嘅意思,即係話保持標準輸入(stdin)打開,等你可以打指令入去;而 -t 就係 allocate 一個 pseudo-TTY,即係虛擬終端機,令到個容器嘅輸出好似你平時用緊個 Terminal 咁樣,有齊啲顏色同格式,唔會出啲亂碼。所以,docker run -it 就係用嚟啟動一個容器,並且即刻進入一個互動模式(interactive mode),同佢裏面嘅 shell(例如 bash)直接對話。
舉個最經典嘅例子,你想即刻拉一個 Ubuntu 鏡像落嚟,然後入去個容器裏面行吓指令睇吓,你就可以打「docker run -it ubuntu bash」。咁樣 Docker 就會幫你拉最新嘅 Ubuntu 鏡像(如果本地冇嘅話),然後用互動模式啟動一個容器,並且執行 bash 呢個 shell。一瞬間,你就會發現自己個終端機已經「進入咗」呢個全新嘅 Ubuntu 容器裏面,可以隨便行 ls、pwd 呢啲指令,好似用緊一部獨立嘅 Linux 主機咁。呢個對於快速測試、安裝吓套件、或者檢查鏡像內容係超級方便。記住,當你打 exit 離開呢個 bash shell 嘅時候,成個容器就會因為主進程結束而停止運行,因為佢唔係喺後臺運行(detached mode)。
咁可能你會問,如果我唔係想即刻互動,而係想個容器好似 Nginx 或者 MySQL 呢啲常駐服務咁,一開波就喺背景執行(後臺運行)呢?咁你就要用 -d 參數,即係 detached mode。例如「docker run -d -p 80:80 nginx」,咁樣個 Nginx 容器就會喺背景默默運行,唔會霸住你個終端機。但係,如果個 Nginx 容器行行下有事,你想入去睇吓個設定檔或者 log 檔,咁點算呢?呢個時候,-it 嘅兄弟指令 docker exec 就出場喇。你可以用「docker exec -it 你個容器名或ID bash」嚟附加到一個已經喺運行緊嘅容器裏面,同樣開啟一個互動式終端。呢個方法係 2026 年做容器偵錯(debug)嘅標準做法,因為佢唔會影響到原本容器主進程嘅運行,安全又靈活。
講開又講,有啲新手可能會將 docker attach 同 docker exec -it 搞亂。docker attach 係直接連接到容器最初啟動時嘅主進程,如果你當初係用 docker run -it 啟動咗個容器然後行緊 bash,咁 attach 翻上去係冇問題。但如果你個容器係行緊 Nginx 呢類服務,你 attach 上去就會睇到 Nginx 嘅輸出 log,但你打指令係冇反應嘅,因為主進程唔係 shell。所以,普遍嚟講,想同運行中嘅容器交互,用 docker exec -it 會更加穩陣同可控。好似 Will 保哥喺 The Will Will Web 都提過,互動模式係管理容器嘅利器。
另外,-it 呢個組合對於一啲輕量級工具鏡像亦都好有用。例如你想快速測試一個網絡指令,可以拉個 busybox 鏡像落嚟,用「docker run -it --rm busybox」嚟行一個即用即棄嘅容器,用完 --rm 參數會自動幫你清理,唔使驚留低一堆停止咗嘅容器。又或者,你想測試吓 SQL Server 喺 Linux 容器裏面嘅連線,都可以用 -it 模式啟動,再配合 docker exec 入去行 sqlcmd。總而言之,掌握 -it 同 -d 呢兩個命令列參數嘅分別同應用場景,係由菜鳥教程階段升級去實戰嘅關鍵一步。記住,互動模式(-it)用於需要即時輸入輸出嘅任務,而卸離模式(-d)就用於需要長期背景執行嘅服務,好似係 MySQL 或者網站伺服器咁。搞清楚呢點,你喺 Stack Overflow 或者 CSDN博客 睇人哋嘅 Docker 教學時,就會更加得心應手,知道點解人哋有時用 -it,有時又用 -d,甚至有時 -itd 一齊用(即係後臺運行但保留互動能力嘅配置)啦。
About容器Professional illustrations
必學:-it 參數核心作用
好啦,各位Docker新手同老手,今次我哋一定要深入拆解吓 docker run -it 呢個組合拳嘅核心作用。好多朋友,尤其係啱啱睇完菜鳥教程或者係Stack Overflow上面嘅例子,都會有個疑問:點解人哋run個容器,好似Ubuntu或者busybox呢類鏡像,總係要加個 -it?唔加又會點?同埋點解我run MySQL 或者 Nginx 呢類常駐服務嘅時候,又唔見要用 -it,反而用 -d 多?呢個就係今次要搞清楚嘅重點,亦係掌握容器交互嘅關鍵第一步。
首先,我哋要拆開 -i 同 -t 呢兩個命令列參數嚟睇。-i 係 interactive 嘅縮寫,意思係開啟互動模式。佢嘅核心作用,就係保持住標準輸入輸出 (stdin) 嘅通道打開。簡單啲講,即係個容器入面嘅程式,可以「聽到」你喺外面(即係宿主機嘅終端機)打嘅指令,同埋可以將輸出「講返」俾你聽。如果冇咗 -i,你個容器程式可能一啟動就自己行完,或者停咗喺度等你輸入,但係你根本冇辦法傳任何指令入去,個通道係閂咗嘅。而 -t 呢,就係 tty 嘅縮寫,佢會幫你分配一個虛擬終端機 (pseudo-terminal)。呢個參數嘅作用,係令到你同容器嘅互動,好似真係登入咗一部Linux伺服器咁,有齊終端機嘅功能,例如可以清屏、用方向鍵翻查歷史命令、甚至支援啲彩色輸出同特別格式。通常 -i 同 -t 係一齊用,所以先會寫成 -it。呢個組合就係為咗俾你一個完整、好用嘅交互模式終端體驗。
咁實際應用係點呢?舉個最常見嘅例子。你想即時咁,喺一個乾淨嘅Ubuntu 容器入面行吓命令,探索吓或者裝啲嘢試吓。你就會用 docker run -it ubuntu bash。呢句命令嘅意思係:請Docker幫我開一個新容器,用Ubuntu鏡像,並且用互動模式同分配虛擬終端機,一開波就執行 bash 呢個Shell程式。因為有咗 -it,個容器一啟動,你就會直接進入到一個可以打命令嘅bash環境入面,好似SSH入咗部機咁。你可以行 ls, pwd, apt update 等等。呢個時候,個容器嘅生命週期,就同你呢個互動模式嘅會話綁埋一齊。如果你打 exit 或者按 Ctrl+D 離開bash,咁成個容器就會因為主要進程(bash)結束而一齊停止運行。呢個就係典型嘅互動模式用途,非常適合做臨時檢查、測試或者學習。
但係,如果你冇加 -it,直接 docker run ubuntu bash,會發生咩事?個容器會啟動,執行bash,但因為冇開啟標準輸入,bash 發現冇嘢好做,亦等唔到你嘅輸入,於是就會即刻結束。結果就係,個容器會「閃退」,你喺 docker ps -a 睇返,會見到佢狀態係 Exited (0)。你根本冇機會同佢互動。同樣道理,如果你淨係加 -i 而冇 -t,個互動體驗會好奇怪,你可能可以打字入去,但個輸出格式會亂晒,冇咗終端機嘅好多便利功能。所以,當你想「進入」一個容器嘅命令列環境時,-it 呢對孖寶幾乎係必須嘅。
咁係咪所有情況都要 -it 呢?梗係唔係啦!呢度就要講到另一個常見嘅 -d 參數,即係 detached mode(卸離模式)。當你要運行一啲常駐服務,例如 MySQL、Nginx 或者 SQL Server 呢類容器,你嘅目的唔係要同佢嘅命令列互動,而係想佢喺背景執行,默默提供服務。呢個時候,你就會用 docker run -d mysql。個容器一啟動就會喺後臺運行,唔會霸住你而家個終端機視窗。你可以繼續用呢個視窗做其他嘢,或者直接閂咗佢都得,個容器服務會繼續運行。呢個就係 -d 嘅核心作用,同 -it 嘅用途完全相反。好似Will 保哥喺佢個網誌 The Will Will Web 都經常提,要識得分清楚咩時候用 -it 做互動測試,咩時候用 -d 做背景服務。
講開又講,好多新手會混淆 docker run -it 同 docker exec -it 同埋 docker attach。我哋順便釐清吓。docker run -it 係用嚟「創建並啟動」一個新容器,然後即刻進入互動。而 docker exec -it 就係用喺一個「已經運行緊」嘅容器身上。例如你個 MySQL 容器用 -d 模式行緊,但你想入去檢查吓入面嘅文件,你就可以用 docker exec -it [容器ID] bash 去開一個新嘅互動模式會話,連入去呢個運行中嘅容器。至於 docker attach,就係直接連接到容器「最初啟動時」嘅主進程,如果主進程唔係一個Shell(例如係MySQL服務進程),你attach入去可能只會見到一堆日誌,打命令係冇反應嘅,而且如果你按Ctrl+C,可能會直接殺死個主進程導致容器停止,所以使用要好小心。網上唔少 CSDN博客 嘅文章都會提醒呢一點。
總結返,-it 參數核心作用就係為咗畀你一個完整、順暢嘅終端機介面,去同你個容器進行即時互動。無論你係想快速試用一個新鏡像,定係要喺容器內進行除錯、安裝軟件,-it 都係你打通呢條交互模式通道嘅鎖匙。記住,當你想「入去行下命令」嘅時候,就諗起 -it;當你想「放個服務喺後台」嘅時候,就諗起 -d。掌握呢個基本概念,你對Docker容器生命週期嘅控制,就已經踏出咗非常紮實嘅一步。
AboutbashProfessional illustrations
背景執行 (-d) 實戰教學
好啦,講完互動模式,今次我哋就專注喺 背景執行,即係用 -d 參數 嘅實戰教學。呢個係 Docker 日常操作嘅核心技巧,尤其當你想運行一啲 常駐服務,好似 MySQL、Nginx 或者 SQL Server 呢類 容器,你總唔會想個 虛擬終端機 霸住你個主機 Terminal 掛?用 -d 參數(Detached Mode,即係 卸離模式)就可以完美解決呢個問題,令到個 容器 喺 後臺運行,唔會阻塞你而家嘅命令列,你可以繼續做其他嘢。
咁點用呢?好簡單,基本句式就係「docker run -d [鏡像名]」。我哋即刻用 busybox 呢個細鏡像做個簡單示範。如果你直接打「docker run busybox sleep 30」,你會發現個 Terminal 會卡住三十秒,因為佢係前臺運行。但如果你用「docker run -d busybox sleep 30」,命令一執行完,Docker 即刻會俾返個 容器 ID 你,然後個 容器 就已經喺背景靜靜雞執行緊個 sleep 命令啦。你可以用「docker ps」去確認佢係咪真係行緊,三十秒後再用「docker ps -a」就會見到佢完成咗任務然後停止咗。呢個就係 背景執行 嘅最基本概念:容器 自己獨立運行,同你當前嘅 標準輸入輸出 脫鉤。
當然,實戰唔會只係 run 個 sleep 咁簡單。我哋嚟 run 一啲真正有用嘅服務。例如,你想喺本地快速起個 MySQL 資料庫做測試,條命令會係類似「docker run -d --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql:latest」。見到冇?我哋加咗「-d」,所以個 MySQL 容器 會喺背景啟動,仲幫佢改咗個名(--name)同設定環境變數(-e)。同樣道理,運行一個 Nginx 網頁伺服器都係一樣:「docker run -d --name my-web -p 8080:80 nginx」。呢度多咗個「-p」參數做 端口映射,將主機嘅 8080 port 對應去 容器 嘅 80 port。執行之後,你喺瀏覽器打「localhost:8080」就已經見到 Nginx 歡迎頁面,而你的 Terminal 一路都係自由身,可以繼續打其他 docker run 命令或者做任何 Linux/Ubuntu 操作。
咁問題嚟啦,個 容器 行咗喺背景,我點樣同佢互動或者睇佢嘅 Log 呢?呢度就引出
AboutdockerProfessional illustrations
常見 Docker run 錯誤解法
好啦,講到 Docker run 嘅常見錯誤,真係可以寫到一本書咁厚,尤其係啲新手,好易喺啲參數同模式之間撈亂晒,搞到個容器唔係行唔到,就係一閃即逝,或者入唔到去操作。呢度就同大家拆解幾個最常見嘅「中伏位」同埋點樣拆彈。
首先,最多人撞板嘅一定係 docker run 嘅 互動模式 (interactive mode) 同 後臺運行 (detached mode) 嘅分別。好多朋友想行一個好似 Ubuntu 或者 busybox 呢類 鏡像 嚟玩下 bash,好自然就會打 docker run ubuntu bash,但打完之後個 容器 好似冇反應,即刻就停咗,心諗「咩事呀?」。其實呢,咁樣 run 完,個容器執行完 bash 命令就會自動退出。你要同個容器保持 互動,就一定要加返 -it 參數(即係 -i 用於保持標準輸入輸出,-t 用於分配一個 虛擬終端機 (pseudo-terminal))。所以正確做法係 docker run -it ubuntu bash,咁你先可以喺入面打命令。相反,如果你係要行一個 常駐服務,例如 MySQL、Nginx 或者 SQL Server,你就要加 -d 參數 等佢喺 背景執行,例如 docker run -d -p 3306:3306 mysql。記住口訣:想入去玩就用 -it,想佢靜靜雞後臺服務就用 -d,兩隻模式好唔同。
跟住另一個熱門錯誤,就係點樣「進入」一個已經喺後臺運行緊嘅容器。好多新手會混淆 docker attach 同 docker exec 嘅用法。如果你用 docker attach 去連一個行緊 MySQL 服務嘅容器,你會發現個終端機一片空白或者卡住,因為你 attach 咗去服務本身嘅輸出,但唔係一個可以互動嘅 Shell。更慘嘅係,如果你喺呢個 attach 咗嘅視窗按 Ctrl+C,好可能會直接停埋個主要服務進程,殺死個 容器!正確做法係用 docker exec,呢個命令係喺運行中嘅容器額外開一個新進程。想入去行 bash 或者睇嘢,就應該用 docker exec -it 你的容器ID bash(如果個 鏡像 有 bash 的話)。咁樣你入去檢查完,就算你 exit 咗,個主服務都唔會受影響,安全好多。呢個技巧喺管理 Linux 容器時極之重要。
仲有,關於 端口映射 嘅錯誤都唔少。成日有人問:「點解我 run 咗個 Nginx 容器,但係用 localhost:80 訪問唔到?」十居其九都係漏咗 -p 參數。Docker run 嘅 命令列參數 次序雖然有時冇所謂,但最好養成習慣。例如 docker run -d -p 8080:80 --name my-web nginx,呢度就將宿主機嘅 8080 端口映射到容器內部嘅 80 端口。記住,唔做映射,個容器服務係同外界隔絕嘅。另外,如果話端口已被佔用,就要檢查吓係咪之前 run 過嘅容器未剷乾淨,或者係其他程式用緊。
最後提一提資源問題。有時 run 一啲大型數據庫如 SQL Server,如果冇指定足夠嘅記憶體,個容器可能會啟動失敗或者好慢。雖然 docker run 本身有參數可以限記憶體同 CPU,但預設通常係用宿主機嘅資源。如果遇到性能問題,可以去 Stack Overflow、CSDN博客,或者台灣 Will 保哥 嘅 The Will Will Web 呢類技術博客度睇吓,好多人分享過點樣優化。當然,內地嘅 菜鳥教程 都有齊基礎嘅參數解釋,幫你打好個底。總之,玩 Docker 撞板好正常,最緊要係識得睇錯誤訊息,同埋搞清楚每個參數背後嘅概念,咁就唔使驚啦。
AboutdockerProfessional illustrations
互動模式 vs 背景模式點揀?
好啦,講到 Docker 嘅 docker run 命令,新手最常問嘅問題就係:「究竟我應該用互動模式定係背景模式嚟行個 容器 呢?」呢個問題冇絕對答案,但揀錯咗真係會好麻煩,搞到你個 Container 唔聽話。等我哋用香港人最鍾意嘅「睇餸食飯」方式,拆解吓點樣揀先至最醒目。
首先,你要搞清楚兩者嘅本質分別。互動模式 通常就係用 -it 參數(即係 -i 同 -t 嘅組合)。-i 代表保持標準輸入(stdin)開啟,等你可以同個容器「對話」;-t 就係分配一個 虛擬終端機,令到個輸出似模似樣,好似你直接喺部 Ubuntu 或者 Linux server 度打 command 咁。例如你想即時入去個 容器 度玩吓,試吓啲命令,咁你就會打 docker run -it ubuntu bash。呢個時候,你個 terminal 就會直接連住個容器嘅 bash shell,你可以即時執行 ls、pwd 呢啲指令,好似 remote login 咁,非常直接。但問題係,你一閂咗個 terminal 視窗,或者按 Ctrl+C,成個容器過程就會跟住停埋,因為你係「黏住」咗喺個互動 session 度。所以,呢個模式最適合啲一次性嘅偵錯、測試、或者學習用途,就好似你上 菜鳥教程 或者跟 Will 保哥 嘅 The Will Will Web 學嘢咁,要即時見到反應。
相反,背景模式(又叫 卸離模式,英文係 detached mode)就係用 -d 參數。呢個模式嘅精髓在於「放低佢自己行」。你打 docker run -d nginx,命令一執行完,Docker 只係俾返個 容器 ID 你,然後就返返去你本身嘅命令列,個 Nginx 容器就喺後臺運行緊,默默咁處理啲 web request。呢個就係用來行常駐服務嘅王道,例如 MySQL、SQL Server、Nginx 呢啲,你唔會需要成日同佢個主程序「傾偈」,你只係想佢喺背景提供服務。想同呢啲背景容器互動點算?呢個時候就要出動 docker exec 呢個神器。例如你個 MySQL 容器行緊,你想入去整啲設定或者睇吓 log,你就可以打 docker exec -it 你個容器ID bash,咁就可以開一個新嘅互動式終端機連入去,做完嘢你 exit 咗,個主容器服務完全唔會受影響,繼續行緊,呢個就係 docker exec 同直接用 docker run -it 嘅最大分別。至於 docker attach,我哋一般少用,因為佢係直接連返去個容器最初嘅主進程,如果你用佢連去一個背景行緊嘅服務,你亂按鍵盤可能會搞停佢,所以新手要小心。
咁到底「點揀」呢?我俾幾個實戰情境你諗諗: 1. 你要測試一個新嘅鏡像,或者想即時探索一個輕量系統:例如你想拉個 busybox 鏡像落嚟,睇吓入面有咩工具,毫無疑問就用 docker run -it busybox sh。玩完,直接 exit,個容器任務完成就會自動停止,乾淨俐落。 2. 你要部署一個網站或者數據庫:呢個時候一定要用 -d 參數行背景模式。例如 docker run -d -p 8080:80 nginx,個 Nginx 就會喺背景常駐,仲做埋端口映射,等你用 browser 去 access。如果你唔小心用咗 -it 嚟行 Nginx,咁你個 terminal 就會被霸住,一閂就成個網站 down 咗,大鑊! 3. 你要行一個需要長期互動嘅應用程式:呢個情況比較少,但都有。例如你個程式係一個需要持續接收用戶輸入嘅腳本,咁你可能真係要用 -it 嚟行,並且唔可以閂 terminal。但更專業嘅做法,其實係將個程式設計成服務,用 -d 行,然後需要時先用 docker exec 去互動,咁樣彈性大好多。
簡單嚟講,記住一個口訣:「服務用 -d,偵錯用 -it」。你喺 Stack Overflow 或者 CSDN博客 睇到啲教學,如果叫人行 web server 但冇用 -d,你就要打醒十二分精神,睇清楚個 context。另外,有時啲複雜情況可以合併參數,例如 docker run -itd,呢個係乜嘢玩法?其實就係用 -it 分配好互動式終端機,但同時用 -d 叫佢行背景,呢個組合可以確保個容器準備好接受互動,但同時又唔會霸住你而家個 terminal,等你之後隨時用 docker exec 或者 docker attach 連入去都得,提供咗更大嘅靈活性。不過對於新手,我建議先清晰分開兩者用途,熟習咗先玩進階參數組合。
最後提多句,無論用邊個模式,都要記住 容器 嘅生命週期。背景行嘅容器,記得用 docker ps 睇住佢哋,唔用嘅就要識得 docker stop 同 docker rm 去清理,唔好令部機留低一大堆停咗嘅 容器,食晒你啲資源。揀啱模式,管理先會得心應手,唔會一頭煙。
AboutdockerProfessional illustrations
容器保持運行嘅秘訣
好啦,講到點樣令到 Docker 容器保持運行,唔好咁快自己停咗,呢個真係好多新手(甚至係睇完菜鳥教程之後)都會遇到嘅核心問題。好多時你 run 完一個容器,佢閃一下就退出了,個狀態變咗 Exited,搞到一頭霧水。其實呢,容器保持運行嘅秘訣,好大程度取決於你點樣理解同運用 docker run 嘅參數,特別係決定容器生命週期嘅關鍵:你 run 嘅係一個「任務」定係一個「服務」。
首先,你要搞清楚一個根本概念:一個 Docker 容器嘅生命,同佢裏面運行緊嘅前臺進程(foreground process)係完全掛鉤嘅。個主進程一完,個容器就會自動停止。呢個設計好合理,因為容器本身就係為咗包裝一個特定進程而生。所以,如果你想個容器長開,你就要確保裏面有個進程係「長命」嘅,唔會做完就退出。例如,你 run 一個 Ubuntu 鏡像,如果只係執行 echo "hello" 呢類瞬間完成嘅命令,個容器自然會完。但如果你 run 嘅係 Nginx 或者 MySQL 呢類常駐服務,佢哋個主進程(例如 nginx -g 'daemon off;')就會一直運行,個容器就會一直保持 Up 狀態。
咁點樣喺命令行度控制呢?關鍵就喺 docker run 後面嗰堆參數度。最經典嘅組合就係 -it 呢對孖寶。-i(interactive)同 -t(pseudo-terminal)參數一齊用,就係為咗開啟一個互動模式,等你可以同容器入面嘅標準輸入輸出進行交互。好多時,我哋用 -it 嚟運行一個 bash shell(例如 docker run -it ubuntu bash),咁樣個容器嘅主進程就係 bash 呢個交互式 shell。只要個 bash 唔退出(即係你唔打 exit),個容器就會一直運行。呢個方法對於做測試、開發或者喺容器入面執行一系列 Linux 命令好有用,因為你可以「黏住」個虛擬終端機慢慢操作。但留意,呢個模式通常係「黏住」你當前嘅終端機,你一關閉終端或者按 Ctrl+C,個進程就會收到信號,可能導致容器停止。
如果你唔想被個終端機綁住,想個容器喺後臺運行(即係 detached mode),咁就要出動 -d 參數。用 docker run -d 嚟啟動容器,佢會立即返回一個容器 ID 俾你,然後個容器就會喺背景默默執行。呢個就係運行常駐服務嘅標準做法,例如 docker run -d -p 80:80 nginx,或者 docker run -d -e MYSQL_ROOT_PASSWORD=your_password mysql。呢啲服務鏡像本身嘅 Dockerfile 已經設定咗一個長運行嘅主進程,所以用 -d 模式就可以令佢喺背景保持運行,唔會阻塞你當前嘅命令行。你可以隨時用 docker logs 嚟睇佢嘅輸出,或者用 docker exec -it 容器名 bash 進入一個已經喺後臺運行緊嘅容器,開一個新嘅 bash 進程去做維護,而完全唔會影響到原本運行緊嘅 Nginx 或 MySQL 主進程。docker exec 呢個命令對於管理運行中嘅容器真係不可或缺。
不過,有時你會遇到一啲情況,個鏡像本身唔係設計做常駐服務,但又想佢保持運行唔好退出。除咗用 -it 運行交互式 bash 之外,仲有啲小技巧。例如,你可以用一啲永遠做唔完嘅命令嚟「撐住」個主進程。經典做法係用 tail -f /dev/null 或者 sleep infinity。你可以咁樣運行:docker run -d ubuntu tail -f /dev/null。咁樣,個 tail 命令會一直監住一個空文件,理論上永遠唔會結束,於是個容器就會一直喺後臺運行,等你隨時用 docker exec 入去執行其他命令。Busybox 呢類輕量鏡像都好常用呢招。另外,對於 SQL Server 或者一啲數據庫鏡像,佢哋本身已經有完善嘅初始化同進程管理,只要你配置正確(例如環境變數、volume 掛載),用 -d 模式運行就可以穩定常駐。
仲有一個命令叫 docker attach,可以將你本地嘅標準輸入輸出連接到一個已經喺運行中(通常係用 -d 啟動)嘅容器嘅主進程。呢個要小心使用,因為如果你 attach 去一個運行緊 Nginx 嘅容器,你可能睇唔到任何輸出(因為 Nginx 嘅日誌通常去咗其他地方),而且如果你按 Ctrl+C,可能會殺死個主進程,導致容器停止。一般嚟講,對於後臺服務,用 docker exec 進入會更安全同靈活。
總結番幾個實用要點:想容器保持運行,第一,要揀啱鏡像同命令(用常駐服務進程,或者用交互式 shell);第二,識得用對參數(前臺交互用 -it,後臺服務用 -d);第三,識得用 docker exec 呢把「萬能鎖匙」進入運行中嘅容器做嘢。網上好多資源好似 Stack Overflow、CSDN博客 或者 Will 保哥 嘅 The Will Will Web 都有大量真實案例討論,例如點樣解決「容器啟動後立即退出」呢類經典問題,核心都係圍繞住檢查主進程、睇日誌、同埋理解 -it 同 -d 嘅分別。記住,容器唔係虛擬機,佢係進程嘅封裝,掌握呢個思想,你就掌握咗令容器聽話長命嘅秘訣。
AboutMySQLProfessional illustrations
端口映射 (-p) 設定指南
好啦,講完點樣用 docker run -it 同 -d 去控制個 容器 點樣行,係前臺定後臺,係時候要講下點樣將個 容器 裡面嘅服務,開放俾出面世界訪問啦。呢個就係 端口映射 (-p) 嘅魔法,亦係 Docker 入面最常用、最緊要嘅設定之一。簡單嚟講,端口映射 就係將你部 Ubuntu 或者 Linux 主機上面嘅某個埠號,同你 run 緊嘅 Container 裡面嘅埠號,做一個「橋樑」連接。如果無做呢個映射,就算你個 容器 裡面行緊 Nginx(聽緊 80 埠)或者 MySQL(聽緊 3306 埠),你係冇辦法直接從你部電腦嘅瀏覽器或者數據庫客戶端連入去嘅,因為個服務收埋咗係個隔離嘅環境入面。
點解要用 -p 參數?想像下你起咗個 MySQL 容器 嚟做開發,或者用 Nginx 做 web server,你總唔會次次都入去個 容器 裡面用 bash 睇嘢掛?你係想係自己部機,用工具直接連去個數據庫,或者係瀏覽器打 localhost 就見到個網頁。呢個時候,-p 就大派用場。個基本格式好簡單:-p [主機端口]:[容器端口]。例如你好經典咁 run 一個 Nginx 鏡像,命令就係 docker run -d -p 8080:80 nginx。呢句嘢意思係,將主機嘅 8080 端口,映射去 容器 內部嘅 80 端口(即係 Nginx 默認聽緊嗰個)。跟住你係自己部電腦開瀏覽器,打 http://localhost:8080,就會見到 Nginx 個歡迎頁面啦!個流量嘅路徑就係:你瀏覽器 -> 你電腦嘅 8080 埠 -> Docker 幫你轉發 -> 容器 內部嘅 80 埠 -> Nginx 服務。係咪好直接呢?
設定 -p 嘅時候有幾個實用技巧同常見情況要留意。首先,主機端口係可以隨便你揀嘅,只要唔衝突就得。比如你部機已經有個服務用緊 80 埠,你就可以好似上面咁,映射去 8080、8888 呢啲空閒端口。相反,容器端口 就一定要跟返個 鏡像 本身設計係聽緊邊個埠,呢個資訊通常可以去 Docker Hub 睇返個 鏡像 嘅說明,或者睇下個 Dockerfile 入面有冇 EXPOSE 指令。好似 MySQL 就係 3306,SQL Server 就係 1433。所以 run MySQL 嘅命令可能係 docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=your_password mysql。咁樣你部機嘅數據庫管理工具就可以用 localhost:3306 連入去個 容器 裡面嘅 MySQL 啦。
進階少少,個映射仲可以玩得更靈活。你可以指定主機嘅 IP 地址,例如 -p 127.0.0.1:3306:3306,咁樣就只有你部機自己(localhost)可以連到呢個映射,出面網絡嘅其他機器就連唔到,安全啲。另外,如果你唔想諗主機用咩埠,可以只寫容器端口,例如 -p 80,咁 Docker 就會自動幫你揀一個主機嘅高位隨機端口(例如 49153)。你用 docker ps 命令就可以睇到實際映射咗去邊個埠,對於測試或者短暫服務好方便。不過要記住,-p 參數係可以同時用多次嘅!如果你個 容器 提供多個服務端口,你可以 -p 80:80 -p 443:443 咁樣一齊映射晒。
有啲朋友可能會撈亂,docker run 入面嘅 -p 同 Dockerfile 裡面嘅 EXPOSE 有咩分別?呢個係好多 菜鳥教程 同 Stack Overflow 都多人問。簡單講,EXPOSE 只係一個「聲明」,話俾人知呢個 鏡像 設計上會用邊個端口,同埋方便用 --link 呢類舊式通信(而家唔多提倡用)。但係 EXPOSE 本身係 唔會 自動做端口映射去主機嘅!真正將個端口開放俾外面世界用,必須要靠 docker run(或者 docker-compose.yml)裡面嘅 -p 參數。所以,你係 CSDN博客 或者 The Will Will Web 睇 Will 保哥 嘅文章,都會強調呢個實際操作上嘅分別。
最後提多個實際情況。有時你 run 咗個 容器 係 後臺運行(用咗 -d 參數),之後先發現漏咗設定端口映射,點算好?唔使驚,Docker 係唔支援直接修改一個運行緊嘅 容器 嘅端口映射嘅。你要做嘅係,停咗舊嗰個 容器,再用正確嘅 docker run 命令,連同 -p 參數重新起過一個新嘅。呢個時候,如果你之前有將數據 volume 映射出嚟,或者 set 咗環境變數,記得要一齊加返落新命令度。所以一開始設定嗰陣諗清楚個端口規劃,可以省返唔少麻煩。總括嚟講,熟練運用 -p 呢個 命令列參數,係掌控 Docker 容器 網絡對外溝通嘅關鍵一步,無論你係行緊常駐服務定係做緊測試,都一定要掌握好。
AboutNginxProfessional illustrations
實例示範:Nginx 容器部署
好,等我哋即刻用一個實例示範點樣用 docker run 嚟部署一個 Nginx 容器。呢個例子非常經典,可以幫你清楚理解點樣將一個鏡像變成一個運行緊嘅服務容器。我哋會由最簡單嘅指令開始,再逐步深入,講解點樣控制容器嘅運行模式,同埋點樣同佢互動。
首先,最基本嘅做法就係直接喺終端機打指令。假設我哋想用最新版嘅 Nginx 鏡像,個指令好簡單,就係 docker run nginx。當你執行呢句,Docker 會先檢查本地有冇呢個鏡像,冇嘅話就會自動去 Docker Hub 拉落嚟,然後啟動一個容器。不過,咁樣做有個問題,就係個容器會霸住你個 虛擬終端機,而且你一按 Ctrl+C,個 Nginx 容器就會停埋,唔係好適合用來運行 常駐服務。所以,我哋通常會加返個 -d 參數,即係 detached mode(卸離模式)。完整指令係 docker run -d --name my-nginx nginx。呢個 -d 選項就係等個容器去 背景執行,唔會 block 住你個 command line,個控制權會即刻返返俾你,非常之方便。而 --name 就係幫個容器改個名,方便之後管理,唔使下下對住堆亂碼嘅 Container ID。
跟住落嚟,我哋要處理 端口映射 呢個關鍵步驟。因為容器自己有個隔離嘅網絡環境,入面嘅 Nginx 默認喺 80 埠監聽,但係外面嘅世界係訪問唔到嘅。要將佢暴露出嚟,就要用 -p 參數。例如,我想將宿主機(Host)嘅 8080 端口,映射去容器嘅 80 端口,個指令就會變成 docker run -d --name my-nginx -p 8080:80 nginx。打咗呢句之後,你就可以打開瀏覽器,輸入 localhost:8080,應該就會見到 Nginx 嘅歡迎頁面,咁就代表你成功咗啦!呢個 -p 參數嘅用法,喺 Stack Overflow 或者 CSDN博客 上面都有海量討論,係初學者必學嘅 命令列參數 之一。
部署好之後,我哋好多時都需要入去個容器裡面睇吓 Log,或者修改一啲設定檔。呢個時候,就要出動 docker exec 呢個神器。記住,對於呢啲喺 後臺運行 嘅服務容器,我哋絕對唔好用 docker attach,因為 attach 係連去個容器嘅主進程(即係 Nginx 進程)嘅 標準輸入輸出,你一但斷開(detach),有可能會搞到成個容器停咗,好危險。正確做法係用 docker exec -it。例如,想入去個容器嘅 bash shell 睇睇,就執行 docker exec -it my-nginx bash。呢度嘅 -it 其實係兩個參數嘅組合:-i(interactive)保持 標準輸入 打開,等你可以打指令;-t(tty)就係分配一個 pseudo-terminal(偽終端),令到個 交互模式 有齊正常 terminal 嘅功能,好似係睇到彩色輸出、用到上下箭頭 history 咁。入到去之後,你就可以好似操作一部 Ubuntu 或者 BusyBox 嘅 Linux 機咁,去檢查 /usr/share/nginx/html 下面嘅網頁文件,或者睇睇 /var/log/nginx 嘅日誌。
最後,我想強調一下 -it 同 -d 呢兩個 選項 嘅設計哲學。佢哋其實係應付唔同場景:-d 係俾 常駐服務 用,例如係 MySQL、SQL Server 或者我哋而家講緊嘅 Nginx,等佢哋安安靜靜喺後面做嘢。而 -it 就係俾你需要同個容器進行 互動 嘅時候用,例如係做一些臨時嘅偵錯、測試,或者運行一個互動式嘅工具環境。有啲資深玩家好似 Will 保哥 喺佢個 The Will Will Web 博客都提過,理解清楚呢幾種模式,係玩轉 Docker 命令嘅基礎。好多新手喺 菜鳥教程 學完基礎後,就係喺呢啲實際操作細節上卡住,搞唔清楚點解個容器一閃就停,或者點解入到去乜都打唔到。希望透過呢個由拉取鏡像、背景執行、端口映射到進入容器檢查嘅完整 實例示範,可以幫你將 docker run 嘅核心概念牢牢掌握。
AboutUbuntuProfessional illustrations
點解我個容器即刻退出?
好多朋友喺用 docker run 嘅時候,都會遇到一個好頭痛嘅問題:點解我個容器一開即刻就退出咗?明明我打咗命令,但個容器狀態就變咗 Exited (0) 或者 Exited (1),好似乜都冇發生過咁。呢個情況真係好常見,尤其係啱啱開始玩 Docker 嘅新手。其實呢個問題嘅核心,同你點樣理解 docker run 嘅運行模式有好大關係。
首先,你一定要記住一個最基本嘅概念:一個 容器 嘅生命週期,係完全綁定喺佢裏面運行緊嗰個主進程(PID 1)上面嘅。當呢個主進程一結束,個容器就會跟住停止。呢個設計就係為咗模擬一個獨立嘅服務或者任務。所以,如果你 docker run 一個 Ubuntu 或者 busybox 嘅鏡像,但係冇指定要運行乜嘢長期任務,佢自然就會執行完預設命令(例如 /bin/bash)之後即刻退出。舉個例,如果你就咁打 docker run ubuntu,佢會啟動一個容器,運行預設嘅 shell,然後因為冇任何互動模式嘅設定,個 shell 冇嘢做就會直接關閉,連帶成個容器都退出咗。呢個就係最典型嘅「即刻退出」場景。
咁點樣解決呢?關鍵就在於點樣使用 docker run 嘅命令列參數。最常用嘅就係 -it 呢個組合拳。-i(interactive mode)同 -t(pseudo-TTY)參數一齊用,就係為咗開啟一個互動模式嘅虛擬終端機,等你可以同容器入面嘅進程(例如 bash)進行交互。當你打 docker run -it ubuntu bash,你其實係做緊兩件事:第一,用 -it 參數分配一個交互式終端並保持標準輸入輸出打開;第二,明確指定容器啟動後要運行 bash 呢個命令。咁樣個 bash shell 就會喺前台運行,等你輸入命令,只要個 shell 唔退出,個容器就會一直運行落去。呢個方法對於調試或者想即時操作容器內部環境(例如檢查檔案、安裝套件)係非常有用嘅。
不過,如果你嘅目的唔係要同個容器「傾偈」,而係想佢好似 MySQL、Nginx 或者 SQL Server 呢類常駐服務咁,喺背景執行,咁你就應該用 -d 參數,即係 detached mode(卸離模式)。docker run -d nginx 呢個命令會將 Nginx 服務放喺後台運行,容器啟動後就會交返個控制權俾你嘅主機終端,但個容器會繼續喺背後運行緊 Nginx 嘅主進程。呢個模式先係運行網站伺服器或者數據庫呢類服務嘅正確姿勢。好多初學者會混淆 -it 同 -d,記住:-it 係「我要入去同你互動」,-d 係「你喺後台自己乖乖做嘢」。
有時就算你加咗 -it,個容器都係會秒退,咁就可能同你指定嘅命令有關。例如,你運行一個只執行單次任務嘅腳本,佢執行完自然就會完。又或者,你個鏡像本身嘅設計就唔係為咗常駐運行。好似某啲只係用來編譯程式嘅工具鏡像,佢做完編譯工作就會自動退出,呢個係正常嘅。另外,一個常見嘅錯誤係將 -it 同 -d 一齊用,例如 docker run -itd ubuntu,咁樣做個容器確實會喺後台啟動並分配一個終端,但因為你冇指定一個長期運行嘅進程(例如冇加 bash),佢一樣會啟動後即刻退出。正確嘅做法係 docker run -itd ubuntu bash,等佢喺後台運行住個 bash。
如果你已經啟動咗一個後臺運行嘅容器,但想入去睇下裏面發生咗乜事,或者執行啲命令,你可以用 docker exec。docker exec -it <容器ID> bash 呢個命令可以讓你「附身」到一個已經運行緊嘅容器裏面,打開一個新嘅交互式終端。呢個方法比 docker attach 更安全,因為 attach 係直接連接到容器嘅主進程(例如 Nginx),如果你喺嗰度按 Ctrl+C,好可能會直接殺死個主進程令容器停止,而 exec 就係開一個新會話,唔會影響原有服務。當你發現容器無故退出,用 docker logs <容器ID> 睇下日誌,再用 docker exec 入去檢查,係基本嘅除錯步驟。
最後,都要提下配置錯誤導致嘅退出。例如,你運行一個 MySQL 容器,但冇設定必要嘅環境變數(如 root 密碼),或者掛載嘅卷(volume)權限有問題,都可能令到資料庫服務啟動失敗,跟住成個容器退出。呢個時候就要仔細睇日誌訊息。網上有好多資源可以幫手,例如 Stack Overflow 上面有無數關於容器退出的討論,CSDN博客、菜鳥教程 呢類中文站亦有大量基礎教學,台灣嘅 The Will Will Web(Will 保哥)嘅部落格亦經常分享深入嘅容器技術心得,遇到問題去搜尋下,好大機會已經有人遇到過同樣情況。總而言之,理解容器生命週期同進程嘅關係,靈活運用 -it、-d 等參數,再配合日誌同執行命令來檢查,就能夠解決大部分「容器即刻退出」嘅惱人問題。
AboutLinuxProfessional illustrations
組合參數 (-dit) 應用場景
好啦,講完單獨嘅 -d 同 -it 參數,係時候將佢哋合體,睇下點樣用 docker run -dit 呢個組合技喇!呢個指令可以話係 Docker 日常操作嘅「萬能Key」之一,特別係當你想個 容器 一開波就喺後臺運行(detached mode),但同時又想保留一個可以隨時入去互動嘅門口,呢個時候 -dit 就大派用場。簡單啲講,佢結合咗 -d(背景執行)、-i(保持標準輸入開啟)同 -t(分配一個虛擬終端機)嘅優點,令個容器開機就默默做嘢,唔會霸住你個主機終端機,但你又可以隨時用 docker exec -it 跳入去個容器度行命令,好似 bash 或者檢查檔案,非常靈活。
咁實際有咩應用場景呢?我哋舉幾個貼地例子。第一個最經典就係用來運行一啲需要常駐服務,但間中又要入去管理嘅伺服器軟件。例如你想喺部 Ubuntu 主機度快速起個 MySQL 或者 SQL Server 做測試,你就可以用 docker run -dit --name my-db -p 3306:3306 mysql。咁樣個資料庫容器就會喺背景靜靜雞啟動同運行,唔會搞到你當前個 Linux 終端機。之後你想入去資料庫做啲 SQL 查詢或者設定,只需要另開一個終端機視窗,用 docker exec -it my-db bash(或者 mysql 呢類客戶端)就可以連入去互動操作,搞掂晒又可以退出,完全唔影響資料庫服務本身。同樣道理,對於 Nginx 呢類網頁伺服器都係一樣,用 -dit 行起佢,之後隨時用 exec 入去改 config 檔案或者睇 log,個服務就永遠唔使停,對於生產環境或者持續開發都好方便。
第二個場景係用來運行一個長期喺背景,但又需要保持基本互動能力嘅工具容器。例如,你可以用一個輕量級嘅 busybox 鏡像,以 -dit 模式運行,佢就會變成一個喺背景待命嘅小型工具盒。你可能會問,點解唔直接用 -d 呢?因為加上 -it 參數,就算係後臺運行,個容器內部嘅互動模式環境都已經準備好,標準輸入輸出同 pseudo-terminal 都設定妥當。當你突然需要喺呢個乾淨環境入面測試一啲網絡指令(例如 ping、wget)或者處理一啲文字檔,你就可以瞬間用 docker attach 連返上去(雖然 attach 通常用於重連返原本嘅主進程,要小心用法),或者更穩陣地用 docker exec -it 去開個新會話,效率高好多。呢個技巧喺 Stack Overflow 或者 CSDN博客 上面,好多高手都會提到,用來做快速測試好正。
第三,對於開發者嚟講,-dit 模式亦好適合用來初始化一啲需要預先設定嘅開發環境容器。假設你個應用程式需要某個特定版本嘅 Linux 發行版同埋一堆基礎工具,你可以寫個 Dockerfile 去整一個自訂鏡像,然後用 docker run -dit --name dev-env my-custom-image 將佢行起嚟。個容器就會變成一個隨時待命、獨立隔離嘅開發沙盒。你隨時可以 exec 入去,喺入面寫 code、試行腳本,甚至安裝一啲臨時套件。因為係 detached mode,你閂咗終端機或者 logout 主機,個開發環境容器都依然運行緊,下次開工直接用 exec 返入去就得,唔使重新安裝同設定所有嘢,節省大量時間。好似 The Will Will Web 嘅 Will 保哥 都經常分享呢類用容器做標準化開發環境嘅心得。
最後都要提少少注意位。雖然 -dit 好方便,但都要理解清楚每個命令列參數嘅意義。記住,-i 同 -t 通常一齊用(即係 -it)先可以模擬出完整嘅交互模式,令到你個終端機可以正常處理輸入同輸出。而加咗 -d 就係將成個容器丟去背景。所以 docker run -dit 本質上就係「請你喺背景開個有互動終端機準備好嘅容器」。另外,對於一啲本身設計成只做一件事就退出嘅容器(例如執行單次腳本),就唔適合用 -dit,因為佢哋根本唔會常駐。反而係 MySQL、Nginx、長期運行嘅應用程式伺服器,或者係你想養住嘅工具盒呢類常駐服務,先係 -dit 發揮最大威力嘅舞台。掌握好呢個組合,你管理 Docker 容器 嘅彈性就會大大提升,無論係設端口映射定係日常維護都更加得心應手。
AboutContainerProfessional illustrations
2026 年 Docker 運行最佳實踐
講到2026 年 Docker 運行最佳實踐,我哋首先要搞清楚一個核心概念:點樣聰明噉使用 docker run 嘅各種參數。好多新手(或者叫 菜鳥教程 嘅常客)一開始都會亂咁用,搞到個 容器 唔係行唔到就係控制唔到。最基本嘅原則就係,你要分清楚個容器係用來做咩嘅——係一個需要同你互動嘅工具,定係一個默默喺後臺運行嘅常駐服務。
如果你要運行好似 MySQL、Nginx 或者 SQL Server 呢類常駐服務,咁 -d 參數(即係 detached mode)就係你嘅好朋友。用 docker run -d 可以令個容器喺背景靜靜雞執行,唔會霸住你個虛擬終端機。例如你要起個MySQL測試,命令就係 docker run -d --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql:latest。咁樣個容器就會喺後臺運行,你可以用 docker logs 去睇佢嘅輸出,或者用 docker exec 跳入去執行命令,完全唔會影響你而家個 terminal 做其他嘢。記住,呢個係 2026 年處理服務類鏡像嘅標準做法,唔好再用舊時嗰套掛住個 terminal 唔放啦。
相反,如果你要同個容器互動,例如要即時喺入面行 bash 命令、測試一啲腳本、或者用 busybox 呢類輕量工具做即時操作,咁 -it 參數(-i 同 -t 嘅組合)就必不可少。呢個 -it選項 會為你分配一個 pseudo-terminal,令到個容器嘅標準輸入輸出同你而家個 terminal 連接埋一齊,做到真正嘅交互模式。舉個例,你想喺一個 Ubuntu 容器入面探索下,命令就係 docker run -it --rm ubuntu:latest bash。個 --rm 參數係 2026 年好推崇嘅做法,用完即棄,唔會留低一堆停止咗嘅容器搞到系統亂糟糟。呢種模式非常適合開發同偵錯階段,你可以即時得到反饋。
不過,好多中級玩家都會混淆 docker run -it、docker exec -it 同 docker attach 呢三兄弟。簡單嚟講: docker run -it 係用嚟啟動一個新容器並立即進入互動模式。 而 docker exec -it 就係用嚟喺一個已經運行緊嘅後臺容器入面,開一個新嘅互動會話。例如你個 MySQL 喺背景行緊,突然想入去睇睇,就用 docker exec -it some-mysql bash(如果個鏡像有 bash 嘅話)。 * 至於 docker attach,我哋 2026 年嘅建議係:除非你好清楚自己做緊咩,否則盡量少用。因為佢係直接連接到容器嘅主進程,如果你喺個 attached 嘅 terminal 打 Ctrl+C,好有可能會殺咗個主進程,令成個容器停止。所以,對於常駐服務,用 docker exec 去進入會安全得多。
另外,端口映射呢個命令列參數都係運行實踐嘅關鍵。無論你用 -d 模式定係 -it 模式,記得要透過 -p 8080:80 呢類參數將容器嘅端口暴露俾主機。咁先可以令到你喺本地用瀏覽器訪問到個 Nginx 服務,或者用客戶端連接到個 SQL Server。
總括嚟講,2026 年嘅最佳實踐就係要「因材施教」:服務類用 -d 參數行背景執行;需要即時操作同偵錯就用 docker run -it 進入互動模式;而管理運行中容器就用 docker exec。呢啲心得唔單止喺 Stack Overflow 或者 CSDN博客 上經常被資深開發者討論,好似 The Will Will Web 嘅 Will 保哥 呢類技術博主亦都不斷強調,靈活運用呢幾種模式,先至係高效使用 Docker 同 Container 技術嘅不二法門。記住,喺 Linux 環境下,理解好 標準輸入輸出 同 虛擬終端機 嘅關係,你對 Docker 運行嘅掌握就會更上一層樓。
AboutServerProfessional illustrations
監控運行中容器 (docker ps)
好啦,講完點樣用 docker run -it 或者 -d 去啟動 容器,無論係用互動模式定係背景執行,下一步梗係要識得點樣「睇住」佢哋啦!呢個時候,docker ps 就係你個「天眼」,係監控運行中容器最基本又最重要嘅命令。你諗下,你開咗十個八個容器,有啲係 MySQL 數據庫,有啲係 Nginx Web伺服器,有啲可能係個 Ubuntu 嘅測試環境,你點知邊個打邊個、佢哋行緊定死咗、用緊咩端口映射?全靠 docker ps 一覽無遺。
簡單喺 terminal 打個 docker ps,佢就會列出所有運行中嘅容器。你會見到每個容器都有個獨一無二嘅 CONTAINER ID(縮寫)同個成日令人頭痛嘅隨機名(好似 peaceful_mcclintock 呢啲)。好彩你可以用 --name 參數自己改個易記名。表格仲會顯示佢用緊咩鏡像(例如 mysql:latest、nginx:alpine)、個容器係幾時創建嘅、而家行咗幾耐、狀態(通常係 Up 幾多分鐘)、同埋最緊要嘅端口映射資訊。例如你會見到 0.0.0.0:8080->80/tcp,即係話你將宿主機嘅 8080 端口,駁咗去呢個容器內部嘅 80 端口,咁你喺瀏覽器打 localhost:8080 就可以訪問到個 Nginx 服務。
不過,淨係 docker ps 睇到嘅係「而家進行緊」嘅容器。如果你想睇晒所有,包括已經停止咗嘅,就要加個 -a 參數,即係 docker ps -a。呢個好有用,尤其係當你試緊唔同 docker run 嘅命令列參數,整咗一堆停止咗嘅容器出嚟,你要清理嘅時候,就可以靠佢睇清楚,再用 docker rm 剷走佢哋。記住,養成定期清理嘅習慣,唔係好快就會有一大堆
docker ps 仲可以配合其他參數做篩選,好似 docker ps --filter "status=running" 就淨係睇運行中嘅,或者 --filter "name=mysql" 搵返個名有 mysql 字眼嘅容器。對於管理一大堆容器嘅環境,呢啲過濾功能好幫到手。
知道咗個容器仲行緊,咁點樣同佢互動呢?呢度就要引出另外兩個常用命令:docker exec 同 docker attach。兩者都可以進入個容器入面做嘢,但用法同後果好唔同,新手好易混淆。如果你個容器係用 docker run -d 咁後臺運行嘅(例如一個 MySQL 或者 SQL Server 呢類常駐服務),你想入去行啲指令睇下 log 或者檢查設定,就應該用 docker exec -it。例如 docker exec -it my_mysql_container bash(如果個鏡像係基於 Ubuntu 之類,有 bash 嘅話),或者 docker exec -it my_mysql_container sh(如果係 alpine 或者 busybox 呢啲輕量鏡像)。呢個 -it 參數同 docker run 嗰個一樣,都係分配一個虛擬終端機同保持標準輸入輸出開啟,等你互動。最大好處係,你用 docker exec 進入呢個容器,係開一個新嘅 process,就算你之後打 exit 離開,你原本用 docker run -d 啟動嗰個主要服務 process 係唔會停嘅,個容器會繼續行,安全好多。
至於 docker attach,就真係要小心使用。佢係直接「附著」返你當初用 docker run -it 啟動嗰個主要 process(通常就係個 bash 或者 sh shell)。如果你當初係用 docker run -it ubuntu bash 啟動,之後用 docker attach 連返入去,你就會見到同一個 bash session。問題係,如果你喺呢個 attached 嘅 terminal 打 exit,咁個主要 process (bash) 就會結束,跟住成個容器都會停止!所以,一般嚟講,docker attach 比較多用喺觀察容器嘅標準輸入輸出,而唔係用嚟執行指令。想安全地互動,絕大部分情況都係首選 docker exec。
講開又講,好多香港嘅開發者同初學者,遇到 Docker 問題,除咗官方文檔,都好鍾意去 Stack Overflow、CSDN博客 或者台灣技術大神 Will 保哥 嘅 The Will Will Web 搵答案。而內地嘅 菜鳥教程 亦都有好多淺白嘅入門例子。睇得多你就會發現,佢哋都強調要識得用 docker ps 做監控,同埋分清 exec 同 attach 嘅應用場景。
最後提多樣,當你用 docker ps 見到個容器狀態係 Up,但係個服務(例如網站)訪問唔到,你可以點做?第一步,梗係用 docker exec 入去個容器度,檢查下個服務係咪真係有行起嚟(例如用 ps aux 睇 process),同埋檢查下內部嘅 log。好多時問題可能係配置錯誤,而唔係個容器本身死咗。學識點樣監控同埋進入運行中容器,係你掌握 Docker 日常操作嘅關鍵一步,由開發到除錯都少不了。
AboutbusyboxProfessional illustrations
常用參數速查表
好啦,各位 DevOps 老手同埋 Docker 新手,而家就同大家整理一份常用參數速查表,等你哋下次用 docker run 或者 docker exec 嗰陣,唔使再成日去 Stack Overflow 或者 CSDN博客 度搵答案,可以自己手到拿來。呢個表唔單止係俾你睇,仲會解釋埋點解要咁用,同埋實際應用喺邊啲場景,例如係行一個 MySQL 容器 定係想同個 Ubuntu 容器 嘅 bash 互動。
首先,最最最常用嘅一定係 -it 參數,呢個係進入互動模式嘅黃金組合。個 -i 係 interactive 嘅意思,即係保持標準輸入輸出打開,等你可以打指令入去。個 -t 就係 allocate 一個 pseudo-terminal,即係虛擬終端機,令到個 容器 嘅輸出有齊顏色同格式,好似真係用緊一部 Linux 主機咁。例如你想即時拉一個 busybox 鏡像 落來玩下,就會打 docker run -it busybox sh,咁你就可以即刻喺個 容器 入面行命令。冇咗個 -t,個畫面可能會亂碼或者冇提示符,體驗差好遠。Will 保哥嘅 The Will Will Web 都經常強調,開發階段用 -it 係必須嘅。
跟住就係 -d 參數,即係 detached mode,我哋通常叫後臺運行或者背景執行。當你個容器係一個常駐服務,好似 Nginx 或者 SQL Server,你唔想佢霸住你個 terminal 視窗,就要用 -d。例如 docker run -d -p 8080:80 nginx,咁個 Nginx 容器 就會靜靜雞喺後面行緊,仲做埋端口映射,將宿主機嘅 8080 port 指去容器嘅 80 port。想睇返佢嘅 log 就用 docker logs,想入返去互動就用 docker exec,呢個下面會講。
講開 docker exec,佢同 docker run 嘅參數好多時係共用嘅。當你個容器已經用 -d 模式行緊,但係突然要入去整啲設定或者睇下 log file,你就唔會再用 docker run(因為會開多個新容器),而係用 docker exec。同樣地,你想喺呢個運行緊嘅容器入面開個互動 shell,就要加返 -it,例如 docker exec -it 你個容器ID bash。呢個係管理常駐服務嘅日常操作。另外有個 docker attach 都可以連返去運行緊嘅容器,但係佢係直接連去主進程,如果主進程係 shell 就 okay,但如果係 Nginx 呢類,你打 Ctrl+C 可能會直接殺咗個容器,所以通常都係建議用 docker exec 更安全。
除咗互動同後台,仲有幾個實用到爆嘅命令列參數。例如 --name,幫你個容器改個易記嘅名,唔使次次對住堆亂碼 ID。-p 就係上面提過嘅端口映射,格式係 -p 宿主機端口:容器端口。-v 就係掛載 volume,等你可以將宿主機嘅目錄同步去容器入面,數據唔會因為容器刪除而消失,對於 database 類容器好似 MySQL 係必備。-e 就係設定環境變數,例如 set 個 MySQL root 密碼:-e MYSQL_ROOT_PASSWORD=yourpassword。
最後提多兩個特別啲但好有用嘅。一個係 --rm,呢個參數表示當個容器停止運行嘅時候,會自動刪除佢。好適合用來做一次性嘅測試任務,唔會留低一堆 stopped container 搞到部機好亂。另一個係 --restart,可以設定容器嘅重啟策略,例如 --restart=always 就係話俾 Docker 聽,無論咩原因退出咗(包括宿主機 reboot),都要重新啟動呢個容器,對於要確保服務永遠在線嘅情況非常之重要。
總之,記熟呢幾個核心參數,你操作 Docker 容器 嘅效率一定會大大提升。無論你係跟緊網上啲菜鳥教程學緊,定係已經係經驗豐富嘅工程師,手上有呢張速查表,都可以快速組合出你需要嘅 docker run 指令,輕鬆管理各種鏡像同容器,唔使下下靠撞或者死背。
About鏡像Professional illustrations
除錯技巧:查看容器日誌
好啦,講到用 docker run -it 或者 docker run -d 起咗個 容器 之後,無論係好似 MySQL、Nginx 呢類 常駐服務,定係一個簡單嘅 Ubuntu bash 會話,總有機會遇到個容器唔聽話,例如服務啟動失敗、程式出錯,或者純粹想睇下佢內部發生緊咩事。呢個時候,「查看容器日誌」就係你必須要識嘅 除錯技巧 啦。好多 Linux 背景嘅朋友,第一反應可能係想用 docker exec 或者 docker attach 接入個容器去睇 log 檔案,但其實 Docker 本身已經提供咗一套更直接、更統一嘅日誌管理機制,尤其係對於用 -d 參數 行 後臺運行 嘅容器嚟講,呢個方法係最方便嘅。
最基本又最常用嘅指令就係 docker logs。假設你用 docker run -d 起咗個 MySQL 容器,但係用 docker ps 發現佢好快就停止咗,咁點算?你第一時間就應該用 docker logs [容器名稱或ID] 去睇下佢死前吐咗咩錯誤訊息出嚟。好多時,問題可能係配置錯誤、端口被佔用,或者係權限問題,所有呢啲錯誤都會輸出到容器的標準輸出(stdout)同標準錯誤(stderr),而 docker logs 就係捕捉呢啲訊息嘅工具。呢個方法好過你特登入去個容器裏面搵 log 檔案,因為 Docker 引擎會幫你管理同儲存呢啲輸出流,即使個容器已經停止咗,你依然可以撈到佢最後嘅日誌嚟睇,對於快速診斷 Container 啟動失敗原因真係好幫到手。
如果你想持續監睇日誌,就好似喺 Linux 用 tail -f 咁,你可以加上 -f 參數,即係 docker logs -f [容器名稱]。呢個對於監察緊 Nginx 嘅存取記錄,或者睇住個應用程式嘅即時運行狀況,真係一流。例如你個網站突然慢咗,你可以即刻開個 虛擬終端機,用呢個指令去追蹤 Nginx 容器嘅即時日誌,睇下有冇奇怪嘅請求或者錯誤。另外,docker logs 仲有 --tail 參數可以指定睇最後幾行,同埋 --since 參數睇某個時間點之後嘅日誌,呢啲選項令到日誌排查更加精準。
不過,有啲情況淨係靠 docker logs 可能唔夠。譬如話,你個應用程式係將日誌寫入到容器內部嘅檔案,而唔係輸出到標準輸出,咁 docker logs 就睇唔到啦。呢個時候,你就要出動 docker exec 呢個「進入容器」嘅神器。你可以用 docker exec -it [容器名] /bin/bash(或者 /bin/sh,好似 busybox 呢類精簡 鏡像 就常用 sh)去啟動一個 互動模式 嘅 bash 會話,然後直接去相關目錄(例如 /var/log)用 cat、less 或者 tail 呢啲傳統 Linux 命令去查閱日誌檔案。呢個方法直接俾你一個 偽終端機 (pseudo-terminal),就好似你真係 SSH 入咗一部伺服器咁樣操作,對於需要深入檢查配置檔案或者特定應用日誌嘅情況,係不可或缺嘅。
講到 docker exec 同 docker attach 嘅分別,新手好易搞亂。docker attach 係直接附加到你用 -it 參數 行 互動模式 嘅容器嘅主進程(通常就係 bash),你會見到同控制到佢嘅 標準輸入輸出。但係如果你 attach 去一個行緊 Nginx 呢類服務嘅容器,你可能只會見到一片空白,因為 Nginx 本身唔會持續輸出嘢去終端機,而且如果你按 Ctrl+C,好可能會直接殺死個 Nginx 主進程,導致容器停止!所以,除非你好清楚自己做緊咩,否則除錯時,用 docker exec 去開一個新會話會安全同方便好多,唔會影響到主進程嘅運行。
最後都要提下,日誌嘅配置同驅動程式都好重要。默認情況下,Docker 用 json-file 驅動程式嚟儲存日誌,但對於生產環境,日誌量好大嘅時候,你可能要考慮配置日誌輪替(log rotation),避免日誌檔案食爆你主機嘅硬碟空間。你可以喺 docker run 嘅時候用 --log-opt 參數去設定 max-size 同 max-file,咁樣 Docker 就會自動幫你處理日誌檔案嘅大小同數量。呢啲進階設定,喺 菜鳥教程、CSDN博客 或者 Stack Overflow 呢類技術社區都有好多討論,The Will Will Web 嘅站長 Will 保哥 亦不時會分享呢類實用嘅 Container 管理心得,好值得參考。總之,熟練運用日誌查看技巧,係管理同維護任何 Docker 容器,無論係 SQL Server 定係自訂應用,都係最基本而又最重要嘅一環。
About菜鳥教程Professional illustrations
進階:資源限制參數設定
講完基本嘅互動模式同背景執行,係時候深入啲,講下點樣用 docker run 嘅資源限制參數,嚟管好你啲 容器 嘅食量啦。喺真實環境,無論你係行緊 MySQL、Nginx 定係 SQL Server,都唔可以任由個 Container 食盡宿主機嘅資源,搞到其他服務跪低。Docker 提供咗一系列參數,等你可以好似管理實體伺服器咁,設定 CPU、記憶體(RAM)同 I/O 嘅使用上限,呢啲就係進階維運嘅必修課。
首先講最常用嘅記憶體限制。你可以用 -m 或者 --memory 參數,直接設定個容器最多可以用幾多 RAM。例如,你喺 Linux 主機度,想行一個 Ubuntu 容器專門處理某個任務,但唔想佢食多過 512MB RAM,個命令就會係 docker run -it -m 512m ubuntu bash。呢度個 -it 參數,就係之前提過,用嚟開啟一個互動式嘅 虛擬終端機,等你可以即時入去個容器嘅 bash 環境度操作。點解要咁做?因為設定完之後,你可以即時用 free -m 之類嘅命令,去驗證下個記憶體限制係咪真係生效。呢個設定對於行 常駐服務 尤其重要,例如你個 MySQL 容器,如果唔設上限,一多人連線查詢就可能會瘋狂食 RAM,拖垮成個宿主機。記住,設定記憶體時,仲可以配合 --memory-swap 參數,呢個係設定記憶體加埋交換空間(swap)嘅總和上限,玩法會複雜少少,但對於精細調控好有用。
跟住到 CPU 資源嘅限制。Docker 喺 CPU 方面嘅限制選項都幾靈活,最基本係用 --cpus 參數。假設你部宿主機有 4 個核心,你只想個容器最多用到 1.5 個核心嘅計算力,你就可以喺 docker run 嘅時候加上 --cpus="1.5"。另外一個常用方法係用 --cpuset-cpus,呢個係指定個容器可以喺邊幾個實體 CPU 核心上面運行。例如你宿主機核心 0 同 1 比較忙,你想將個新 Nginx 容器綁定去核心 2 同 3 度行,避免爭搶,命令就會係 docker run -d --cpuset-cpus="2,3" nginx。呢度我哋用咗 -d 參數,即係 detached mode 背景執行,好適合呢類唔需要即時 交互模式 嘅 常駐服務。呢種精細嘅 CPU 綁定,對於高效能應用或者避免 容器 間互相干擾,效果非常顯著。
除咗記憶體同 CPU,磁碟 I/O 嘅限制都好關鍵,尤其係當你個容器需要頻繁讀寫數據庫或者日誌嘅時候。你可以用 --device-read-bps、--device-write-bps、--device-read-iops 同 --device-write-iops 呢類參數,去限制個容器對塊設備(block device)嘅讀寫速度同每秒輸入輸出操作次數。呢啲參數可以防止某個瘋狂寫 log 嘅容器,塞死成個系統嘅磁碟 I/O,影響晒其他容器嘅效能。設定嘅時候,你需要指定宿主機上嘅設備路徑,例如 /dev/sda。
最後提一提,點樣喺運行中嘅容器調整資源?其實 docker run 嘅資源參數,主要係喺創建容器時設定。如果容器已經行緊,你可以用 docker update 命令去動態調整某啲資源限制,例如即時改動記憶體上限。不過,唔係所有參數都支援熱更新,所以最好嘅做法,仲係喺規劃同編排階段(例如用 Docker Compose 或者 Kubernetes),就已經寫明資源需求同限制。好似 Will 保哥 嘅 The Will Will Web 技術博客,或者 CSDN博客、Stack Overflow 上面嘅深度討論,都經常強調事前規劃嘅重要性。總而言之,善用 docker run 嘅資源限制參數,唔單止可以提升系統穩定性,仲可以令你嘅宿主機資源分配得更有效率,等每個 容器 都乖乖哋,唔會變成資源怪獸。呢啲實戰經驗,對於由 菜鳥教程 階段進階嘅朋友嚟講,絕對係必學之技。