一篇看懂3大重點:docker compose stop指令、優雅關閉、與down差異

喺2026年嘅Docker容器管理入面,識得正確使用「docker compose stop」指令絕對係每位開發者同DevOps工程師嘅必備技能。呢個指令嘅主要作用,就係幫你停止由Docker Compose管理緊、正在運行嘅容器,但唔會將佢哋移除。換句話講,所有容器嘅設定、網絡配置同埋數據卷(Volume)都會原封不動保留下來,等你隨時可以用「docker compose start」或者「docker compose up」重新啟動返,非常適合用喺日常開發調試、短暫暫停服務,或者係進行系統維護嘅時候。好多新手會混淆「stop」同「down」嘅分別,簡單嚟講,「stop」只係暫停,而「down」就會停止兼移除容器,連帶網絡都會拆埋,動作大好多。本文會詳細拆解「docker compose stop」嘅三大核心知識點:指令嘅正確用法同參數、點樣實現優雅關閉(Graceful Shutdown)避免強制終止程序,以及同「docker compose down」嘅實際應用場景比較,等你可以根據唔同情況,精明選擇最合適嘅操作指令。
docker compose stop - Docker

AboutDockerProfessional illustrations

Docker Compose Stop 基本指令

講到 Docker Compose Stop 基本指令,我哋首先要明嘅係,呢個指令係你管理容器生命週期管理嘅核心工具之一。好多香港嘅開發者同 DevOps 團隊,喺本地開發或者測試環境,都會用 Docker Compose 去編排多個服務,例如一個 Web App 可能背後有齊 Varnish 做快取、Liquibase遷移去處理資料庫更新,再加幾個微服務。當你想暫停成個環境,但又唔想剷走所有嘢嘅時候,docker-compose stop 就係你嘅好朋友。佢同 docker-compose down 最大分別在於,stop 只會停止運行緊嘅容器,但會保留住所有容器、Docker網絡、同埋最重要嘅 Docker卷(即係資料卷冊)入面嘅持久化數據。換句話說,你啲數據唔會無咗,下次用 docker-compose start 或者 up 就可以好快恢復返個狀態,好適合中途食個飯或者轉換工作 context 嘅時候用。

具體點用呢?基本語法好簡單,就係喺你個 docker-compose.yml 檔案所在嘅目錄,打開 CLI(命令列介面)打 docker-compose stop 就得。默認情況下,佢會停止你 compose 檔案裡面定義嘅所有服務。如果你想指定只停某個服務,可以喺後面加服務名,例如 docker-compose stop web-server,咁就只會停咗個 web 服務,其他 database 或者 cache 服務會繼續行。呢個對於服務更新或者 Debug 單一部件好有用。要留意嘅係,stop 指令會向容器入面嘅主進程發送一個 SIGTERM 信號,等個進程有機會進行 Graceful Shutdown(優雅關閉),例如完成手頭上嘅請求、關閉資料庫連接、寫埋最後嘅 Log 之類。如果個進程喺一段時間(默認 10 秒)後都未停,Docker 就會送出 SIGKILL 強制結束佢。所以,你寫自己個應用嘅時候,要好好處理 SIGTERM 信號,確保數據完整性,呢點喺生產環境尤其重要。

有冇啲實際場景可以分享?當然有啦。假設你喺度用緊一個 Makefile 去自動化你嘅開發流程,你可能會定義一個 target 叫 make halt,入面就係 call docker-compose stop。又或者,你喺 Medium 睇到啲教學,佢哋可能會教你用 docker-compose stop 之後,再配合 docker-compose exec 去檢查停咗嘅容器嘅 Log,或者用 docker-compose run 去起一個一次性嘅容器做資料清理。另外,當你個 Stack 好複雜,涉及多個 Docker容器 同 Docker網絡 嘅時候,單純 stop 可以幫你釋放電腦資源(CPU、RAM),但又唔使重新拉取 Docker鏡像 或者重建 Volume,省返唔少時間。不過,要記住 stop 咗嘅容器,佢嘅狀態係「Exited」,但依然會佔用你嘅磁碟空間,因為容器層仲喺度。如果你確定呢組容器暫時唔再用,想徹底環境清理,就要用返 docker-compose down 去移除容器。

最後提多幾個進階貼士。第一,docker-compose stop 默認係有 10 秒超時,如果你啲服務需要更長時間去做 Graceful Shutdown(例如個數據庫要做完整檢查點),你可以用 -t 或者 --timeout 參數去延長,例如 docker-compose stop -t 30 就等 30 秒。第二,停容器嘅次序,Compose 會跟據你檔案裡面服務嘅依賴關係去決定,但呢個通常係 start 嘅時候先重要,stop 就未必完全反向,所以如果你有嚴格嘅關閉次序要求,可能要自己分開逐個停。第三,如果你成日喺 Stack Overflow 見到人問點解停咗容器但 Port 仲被佔用,好多時係因為個進程未完全釋放資源,或者係 Docker網絡 未即時更新,通常等幾秒或者 restart 一下 Docker Daemon 就解決到。總之,將 docker-compose stop 視為你 容器編排 工具箱裡面一個暫停掣,善用佢可以令你嘅開發運維流程更加順暢。

docker compose stop - Compose

AboutComposeProfessional illustrations

停止服務嘅正確步驟

好啦,各位開發同運維嘅朋友,講到用 Docker Compose 停止服務,真係唔係就咁打句 docker-compose stop 咁簡單㗎。要正確停止服務,其實係一個關於容器生命週期管理嘅學問,搞得好可以優雅關閉,保存好所有數據;搞唔好隨時會數據損壞,或者下次啟動時撞曬鬼。首先,最基本嘅步驟當然係喺你個 Docker Compose 項目嘅目錄入面,打開 CLI,輸入 docker-compose stop。呢個命令會向所有喺 docker-compose.yml 檔案入面定義嘅服務容器,發送一個 SIGTERM 信號。呢個信號就好似有禮貌咁同容器講:「喂,麻煩你準備好自己,要收工啦。」容器收到之後,就會開始執行預先設定好嘅關閉腳本,例如完成最後嘅數據庫寫入、關閉網絡連接、或者完成好似 Liquibase遷移 呢類數據庫變更嘅收尾工作,確保數據一致性。

不過,如果你發現用 docker-compose stop 等咗一陣,個容器都仲未停到,咁就可能係個應用程式入面嘅信號處理邏輯寫得唔好,或者個程式 hang 咗機。呢個時候,Docker 就會失去耐性,等一段預設時間(通常係10秒)之後,就會使出殺手鐧 SIGKILL,強制終止個容器SIGKILL 係冇得攔截亦冇得處理嘅,即係話你個程式會即刻被殺死,任何進行中嘅操作都會中斷,如果當時正寫緊數據去 Docker卷,咁就有機會造成數據損壞。所以,作為一個專業嘅開發運維,你應該要檢查同優化你應用程式入面處理 SIGTERM 嘅邏輯,確保佢可以喺收到信號後快速、安全咁完成手頭上嘅工作然後自己退出,實現真正嘅 Graceful Shutdown

除咗直接用 stop 命令,有時我哋都需要一啲更精細嘅操作。例如,你個 Docker Compose 項目可能係一個好複雜嘅容器編排設定,入面有 web server(好似 Varnish)、應用程式同數據庫。如果你只係想停止其中一個服務嚟做更新或者 debug,你可以用 docker-compose stop [服務名稱]。譬如話 docker-compose stop backend,就只會停咗後端服務個容器,而前面嘅 Varnish 緩存同個數據庫容器仲會繼續運行,咁樣做局部維護就方便好多。又或者,你可以用 docker-compose exec 先進入容器,執行一啲清理命令,再嚟停止佢,令到環境清理做得更徹底。

跟住落嚟,就要講下 docker-compose stop 同 docker-compose down 嘅重大分別,好多新手都好容易混淆。簡單嚟講,stop 只係停止容器,但所有容器Docker網絡、同埋掛載嘅資料卷冊都仲會保留喺度,容器嘅狀態會被暫停。呢個方法好適合你暫時唔想用呢組服務,但好快(可能幾分鐘或幾小時後)就會用 docker-compose start 或者 docker-compose up 去重啟容器。因為所有嘢都原封不動,重啟速度會好快。相反,down 就係一個核彈級命令,佢唔單止會停止容器,仲會移除所有容器、網絡,默認情況下唔會移除Docker卷,但如果你加 -v 參數,連持久化數據嘅卷都會剷埋!所以,除非你肯定成個Stack 可以成個剷起重新部署,或者你想徹底做環境清理,否則日常服務管理入面,都係用 stop 多過用 down。

另外,喺真實工作流程入面,我哋好多時會將呢啲命令封裝起嚟,令到團隊協作更加流暢。例如,好多團隊會用 Makefile 去定義一系列常用命令。你可能會喺個 Makefile 入面寫一條 make stop 嘅指令,背後其實就係執行 docker-compose stop,甚至可能仲會加入一啲額外步驟,好似係停服務之前,先自動觸發一個數據庫備份腳本,確保持久化數據萬無一失。又或者,你個應用係用 Go 語言 寫嘅,你可以利用 Go 對信號處理嘅良好支持,喺程式碼入面監聽 SIGTERMSIGINT,然後執行資源釋放,咁樣就能夠同 Docker Compose 嘅停止機制完美配合。

最後都要提下一啲常見嘅陷阱同最佳實踐。有時你喺 Medium 或者 Stack Overflow 會見到有人問,點解停咗服務之後,個端口仲係被佔用?好多時呢個問題同容器狀態有關,可能係個容器進程未完全釋放資源。你可以用 docker-compose ps 睇下啲容器係處於 Exited 定係其他狀態。另外,如果你係用 docker-compose run 去啟動咗一個一次性容器做測試,記住呢類容器唔會受 docker-compose stop 影響,你需要手動用 docker-compose down --rmi local 之類嘅命令去清理。總而言之,理解清楚 docker-compose stop 背後嘅原理,同埋佢同其他命令點樣協作,係做好容器生命週期管理、確保系統穩定同數據安全嘅關鍵一步。

docker compose stop - compose

AboutcomposeProfessional illustrations

同 docker stop 有咩分別

好喇,而家我哋就深入講下 docker compose stopdocker stop 呢兩個命令,究竟有咩分別。好多初學 Docker 嘅朋友,甚至係一啲有經驗嘅開發運維,都可能覺得佢哋好似差唔多,都係停咗個 容器 啫。但其實,呢個諗法係一個誤區,兩者喺設計理念、操作對象、以及對 容器生命週期管理 嘅影響上,都有住根本性嘅唔同。

首先,最核心嘅分別在於「操作嘅層級」同「管理嘅對象」。docker stop 係一個針對單一個 Docker容器CLI 命令。你嘅操作目標好明確,就係一個特定嘅容器 ID 或者容器名。例如你喺部機度行緊一個 Nginx 嘅 Container,你想停咗佢,你就直接用 docker stop nginx-container。呢個命令會直接向呢一個特定容器發送 SIGTERM 信號,進行 Graceful Shutdown,等佢有時間處理完手頭上嘅工作(例如完成緊嘅資料庫交易、寫完 log 檔)先至停止。如果容器唔響應,佢之後仲會發送 SIGKILL 來強制結束。所以,docker stop 就好似你用手去逐個熄滅每一盞獨立嘅燈泡。

docker compose stop 又係咩玩法呢?佢係 容器編排 層面嘅操作,屬於 Docker Compose 工具嘅一部分。佢唔係針對單一容器,而係針對你個 docker-compose.yml 檔案所定義嘅「整個服務堆棧」(或者叫 Stack)。當你喺個 docker-compose.yml 所在嘅目錄行 docker-compose stop,佢會按照檔案入面定義嘅服務順序(或者依賴關係),逐一向所有正在運行嘅服務容器發送 SIGTERM 信號。呢個過程係批量式、有管理嘅。例如你個專案用 docker-compose 定義咗一個 web 服務、一個 database 服務同一個 cache 服務(例如 Varnish),一個 docker-compose stop 命令就可以優雅地停晒三個服務嘅所有容器,而唔使你逐個搵佢哋嘅容器名去停。呢個就係「熄總掣」同「逐個熄燈掣」嘅分別。

其次,兩者對於 容器狀態環境清理 嘅影響都好唔同。用 docker stop 停咗個容器之後,個容器其實仲喺度,只係狀態由「運行中」變成「已退出」。你之後可以用 docker start 去重新啟動同一個容器實例,裡面嘅檔案改動(如果冇用 Docker卷 持久化)同狀態都會保留。而 docker compose stop 都係一樣,佢只會停止容器,但唔會移除容器、Docker網絡、或者 Docker卷。啲數據同配置都仲喺度,方便你之後用 docker-compose start 或者 docker-compose up 去快速重啟整個應用環境。呢點同 docker-compose down 有巨大分別,down 係會移除容器同網絡嘅,但 stop 就純粹暫停。

另一個好實際嘅應用場景,就係處理服務之間嘅依賴同 優雅關閉 嘅順序。雖然 docker-compose stop 默認嘅停止順序未必百分百完美處理所有複雜依賴,但佢提供咗一個基礎框架。相比之下,如果你用一堆 docker stop 命令手動去停一個多服務應用,你好大機會會停錯次序。例如,你個應用程式容器需要喺停止前,通知一個 Liquibase遷移 容器去完成某啲數據回滾操作,又或者你需要先停用面向用戶嘅服務,再停內部數據庫,以避免錯誤。用 docker compose stop,你可以透過 Compose 檔案嘅配置去部分管理呢個次序,但用手動逐個 docker stop 就好易出錯,導致數據不一致。

最後,從工作流程同自動化嘅角度睇,分別亦都好大。docker compose stop 天生就同 docker-compose.yml 呢個「基礎設施即代碼」檔案綁定,非常適合整合到 Makefile 或者 CI/CD 腳本入面,成為一個標準化步驟。例如,你喺部署新版本前,可以先執行 make stop-services(背後就係 call docker-compose stop)來優雅停止舊服務。而 docker stop 就更靈活,但更底層,通常用喺一啲需要對特定容器進行精細操作嘅情境,或者喺緊急情況下喺 Stack Overflow 搵到某個解決方案需要對某個問題容器進行操作。

總括嚟講,記住一個簡單口訣:docker stop 係「微觀操作,針對單一容器」,而 docker compose stop 係「宏觀管理,針對整個項目服務堆棧」。明咗呢個根本分別,你喺管理本地開發環境、測試環境,甚至係一啲簡單嘅生產部署時,就知道幾時應該用總掣(Compose),幾時需要逐個檢查同操作(單一 docker 命令),從而更有效咁管理你嘅 容器生命週期,確保服務可以 優雅關閉 同順利 重啟容器,唔會因為亂咁停服務而整爛啲 持久化數據 或者搞到 Docker鏡像 嘅狀態出問題。

docker compose stop - 容器

About容器Professional illustrations

點樣優雅停止 Container

講到點樣優雅停止 Container,呢個真係開發同運維日常好關鍵嘅一環,尤其係用 Docker Compose 管理多個服務嘅時候。好多新手可能就咁撳 Ctrl+C 或者直接 kill 個 process,但咁樣好易搞到數據唔一致,甚至整爛個 database。所謂「優雅停止」,即係俾個容器一個機會,喺完全閂機之前,完成手頭上嘅工作,例如寫完最後一筆數據、關閉網絡連接、釋放資源,然後先至安然退場。呢個過程,就係 Graceful Shutdown 嘅精髓。

要實現優雅停止,首先要理解 Docker 同 Docker Compose 嘅信號處理機制。當你喺 CLI 打 docker-compose stop 嘅指令,Docker Compose 預設會向容器內嘅主進程發送一個 SIGTERM 信號。呢個信號就好似一個友善嘅通知:「喂,準備收工啦,你仲有少少時間執嘢。」容器裏面嘅應用程式(例如用 Go 語言寫嘅 server)就應該要捕捉呢個 SIGTERM,然後啟動關閉程序。如果個應用寫得好,佢會停止接受新請求,但會繼續處理緊嘅請求,等所有嘢做完先至自己退出。呢個就係容器生命週期管理入面好重要嘅一環。

但係,現實往往冇咁完美。如果個容器喺收到 SIGTERM 之後一段時間(預設係 10 秒)都未自己退出,Docker 就會不耐煩,派出殺手 SIGKILL。SIGKILL 係冇得商量嘅,會即時強制終止個進程,咩善後工作都做唔到。所以,你嘅應用程式一定要喺呢段寬限期內搞掂所有嘢。點樣確保呢?你可以喺寫應用嘅時候,就加入信號處理嘅邏輯,特別係對於有狀態嘅服務,例如行緊 Liquibase遷移 嘅 database container,或者係 Varnish 呢類 cache 服務,一定要確保遷移完成或者 cache 寫入磁碟先好停。

喺 Docker Compose 嘅層面,你仲可以透過設定去微調呢個行為。例如,你可以在 docker-compose.yml 檔案裏面,為每個 service 設定 stop_grace_period,即係將嗰 10 秒嘅寬限期改長啲或者改短啲。呢個對於一啲關閉程序比較漫長嘅服務(例如要等大量數據持久化到 Docker卷 嘅服務)就好有用。另外,善用 docker-compose down 同 docker-compose stop 嘅分別都好重要。前者會停止並移除容器、網絡,屬於比較徹底嘅環境清理;後者就只係停止容器,但保留住佢哋,方便之後用 docker-compose start 快速重啓容器。根據你係想開發運維中途休息下,定係想完全移除容器嚟更新 Docker鏡像,就要識得揀用邊個指令。

另外,一個常見嘅優雅停止場景,就係涉及多個容器之間嘅協調,即係容器編排嘅基本概念。例如,你個 stack 有個 web app container 同個 database container。如果你就咁停晒佢哋,個 web app 可能仲有 request 未處理完,但個 database 就已經斷咗線,咁就會出錯。比較好嘅做法,係有次序地停止:先停 web app(等佢停止接收新流量並完成現有請求),然後先停 database。雖然標準 docker-compose stop 係同時向所有容器發信號,但你可以透過編寫 Makefile 或者用一啲進階腳本,去實現呢種有次序嘅關閉,確保服務管理得更順暢。

最後,都要提提日常操作嘅小貼士。好多時我哋喺開發階段,會用 docker-compose up 嚟啟動服務,然後用 Ctrl+C 去停止。呢個方法其實都會發送 SIGTERM,所以都算係優雅停止嘅一種。但如果你係用 docker-compose run 去執行一次性任務,就要留意佢嘅行為。至於點樣檢查容器狀態,確認佢係優雅關閉定係被強殺?你可以用 docker-compose logs 去睇吓應用程式最後嘅日誌,或者用 docker inspect 去查看容器退出嘅狀態碼,從中診斷問題。記住,做好優雅停止,唔單止令你重啓容器 同 服務更新 時更穩定,亦係對你數據(尤其係放喺 資料卷冊 入面嘅持久化數據)嘅一種基本尊重同保護。

docker compose stop - Container

AboutContainerProfessional illustrations

停止指定服務嘅方法

好啦,講完基本嘅停止指令,而家我哋要深入啲,講下點樣精準地停止指定服務嘅方法。呢個係日常開發運維好常用嘅技巧,尤其係當你個 Docker Compose 檔案入面定義咗十幾個服務,但係你只係想更新或者重啟其中一個,例如係個 Varnish 快取服務或者個 Liquibase遷移 容器,咁就唔使成個 Stack 停晒,可以針對性處理。

最直接嘅方法,就係用 docker-compose stop [服務名稱] 呢個 CLI 指令。例如你個 docker-compose.yml 入面有個服務叫 web_app,另一個叫 database,你淨係想停咗個 web_app 嚟做服務更新,咁你只需要喺終端機打 docker-compose stop web_app 就得。呢個指令會向指定服務入面嘅所有容器發送 SIGTERM 信號,等佢哋可以進行 Graceful Shutdown,即係優雅關閉,等應用程式有時間處理完手上嘅工作(例如完成緊要嘅資料庫交易)先至收工。呢個過程對於容器生命週期管理好重要,可以避免數據損壞。之後,你可以用 docker-compose ps 嚟檢查個容器狀態,應該會顯示 Exited (0) 之類,表示正常停止。

不過,有時個服務可能因為各種原因(例如個應用程式冇正確處理信號)卡住咗,等好耐都未停到。遇到呢種情況,你可以考慮用 docker-compose kill [服務名稱]。呢個指令會直接送出 SIGKILL 信號,即係強制殺死個容器,冇得商量。但係要小心,呢個係最後手段,因為可能會導致數據唔完整,特別係如果個服務正在處理緊持久化數據Docker卷嘅時候。所以,正常情況下都係建議先用 stop,俾啲耐心。

另外一個進階啲嘅情景,就係你想停止服務嘅同時,清理埋佢相關嘅Docker網絡(如果係自定義網絡)或者想執行一啲自定義腳本。咁你可以配合 Makefile 嚟用,將複雜嘅指令包裝成一個簡單嘅 make stop-service 命令。例如,你個 Makefile 可以寫到咁:先執行 docker-compose stop target_service,然後再執行一啲清理臨時檔案或者記錄日誌嘅指令。呢種容器編排嘅自動化技巧,可以令團隊協作更加流暢。

仲有,你可能會問,docker-compose stop 同 docker-compose down 有咩分別呢?記住,stop 只係停止容器,但係唔會移除佢哋。啲容器Docker鏡像Docker卷同網絡都仲喺度,啲數據會保留住。呢個好適合你短暫停止服務嚟 debug,或者更換某個容器嘅配置。而 down 就犀利好多,佢會停止兼移除所有相關資源(除非你指明保留卷冊),屬於比較徹底嘅環境清理。所以,當你只想針對單一服務進行操作時,用 stop 同之後嘅 start 或 restart 就最啱數。

最後提多個實用貼士,就係點樣喺停止指定服務前,確保佢嘅數據已經安全落咗資料卷冊。例如,你個服務係負責處理訂單嘅,你可以先用 docker-compose exec [服務名稱] [一些備份指令] 嚟手動觸發數據保存,然後先再執行停止。雖然現代應用程式應該要自己處理好 SIGTERM 信號去做保存,但多一重手動保險,尤其係面對緊要數據時,絕對唔係壞事。總括嚟講,掌握精準停止指定服務嘅方法,就等於掌握咗服務管理嘅主動權,可以好靈活咁控制你嘅開發同測試環境,又唔會影響到其他正在運行緊嘅服務。

docker compose stop - Docker容器

AboutDocker容器Professional illustrations

背後運作原理解析

好啦,各位開發同運維嘅朋友,今次我哋就深入啲,拆解下當你喺終端機打 docker-compose stop 呢個指令嘅時候,背後究竟發生緊咩事。呢個過程唔係單純「熄機」咁簡單,而係一套涉及容器生命週期管理信號處理服務管理嘅精細操作。首先你要明白,Docker Compose 本身係一個用 Go 語言 寫嘅 CLI 工具,佢嘅工作就係解讀你個 docker-compose.yml 檔案,然後同 Docker Daemon(即係 Docker 引擎)溝通,幫你管理成個由多個容器組成嘅應用Stack

當你執行 docker-compose stop,Compose 首先會根據你 YAML 檔入面定義嘅服務順序(如果有 dependencies 設定就會按依賴關係),逐個服務、逐個容器去處理。佢唔會好似 docker-compose down 咁,一下子剷走晒所有容器網絡,而係專注喺「停止」呢個動作。核心步驟係,Compose 會向每個目標容器嘅主進程(PID 1)發送一個 SIGTERM 信號。呢個 SIGTERM 就係所謂 Graceful Shutdown(優雅關閉)嘅關鍵。個信號係通知個容器:「喂,你準備好可以收工啦,執埋手尾先。」例如,你個容器入面行緊一個 Web Server(好似 Nginx 或者你個 Node.js App),收到 SIGTERM 之後,佢應該要停止接受新請求,但係會繼續處理緊嘅連線,等佢哋完成先至真正退出。又或者你個容器入面有 Liquibase遷移 或者數據庫,優雅關閉可以確保佢哋完成當前交易,唔會整爛啲數據。

呢度就帶出一個重要概念:容器生命週期。一個設計得好嘅應用,必須要識得處理 SIGTERM 信號,先至算係對容器編排友好。如果你個應用唔理 SIGTERM,咁 Docker 喺等待一段預設時間(默認係 10 秒)之後,就會失去耐性,發出更強硬嘅 SIGKILL 信號。SIGKILL 係冇得攔截、冇得處理嘅,會即時強制殺死個進程,就好似直接掹電掣一樣,有可能導致數據唔一致或者檔案損毀。所以,喺 Stack Overflow 或者 Medium 上面,好多資深開發者都會提醒,寫 Dockerfile 嘅 CMD 或者 ENTRYPOINT 指令時,要確保你嘅進程可以接收到呢啲信號並作出適當反應。

跟住落嚟,我哋講下 docker-compose stop 同其他指令嘅互動同區別。好多人會混淆 stopdown。簡單嚟講,stop 只係停止容器,但所有相關嘅資源都仲喺度。即係話: 容器會處於「Exited」狀態,但係佢哋嘅配置、檔案系統(包括 Docker卷 裏面嘅持久化數據)都原封不動。 Docker網絡(即係 Compose 自動創建嗰個 network)依然存在。 * Docker鏡像更加唔會受到影響。

呢個狀態好有用,因為你可以好快咁用 docker-compose start 或者 docker-compose restart重啟容器,所有嘢都會番番去停止前嘅狀態,對於快速測試同開發運維嚟講好方便。相反,docker-compose down 就係一套完整嘅環境清理動作,佢會停止容器,然後移除容器,跟住再移除創建出嚟嘅網絡(默認情況下),但會保留 Docker卷 以防你啲數據無咗。所以,如果你只想暫停服務,之後想快速恢復,就用 stop;如果你想清場,重新嚟過,就用 down。

另外,有時我哋會用 Makefile 去包裝呢啲複雜嘅 Docker 指令,令工作流程更自動化。例如,你個 Makefile 裏面可能有一個 make stop 嘅 target,裏面就係呼叫 docker-compose stop,仲可以喺之前加入自定義步驟,例如通知某個容器入面嘅 Varnish 快取服務開始清空,令到個關閉過程更順暢。

最後都要提一提,docker-compose stop 嘅操作對象係「服務」,而唔係單一容器。如果你個服務定義咗 scale,例如 replicas: 3,咁 stop 就會一次過停止晒三個副本容器。呢個就體現咗 容器編排 工具幫你管理一組容器嘅便利性。總括嚟講,理解 docker-compose stop背後運作原理,唔單止幫你更精準地控制你嘅開發同測試環境,更重要係令你意識到編寫可應對信號、實現優雅關閉嘅應用程式,對於現代化、雲原生嘅服務管理係幾咁基本同必要。下次你停服務嘅時候,就會知道,呢個簡單指令背後,其實係一場同你啲容器進程之間嘅禮貌對話同合作。

docker compose stop - Docker網絡

AboutDocker網絡Professional illustrations

常見錯誤同解決方法

好啦,講咗咁多 docker compose stop 嘅基本操作,係時候要面對現實啦!喺實際開發同運維嘅時候,唔少人(包括我哋自己)都會撞到一啲古靈精怪嘅錯誤,搞到個容器停唔到,或者停得唔乾淨,最後要出動 SIGKILL 呢個「殺手鐧」先搞得掂。呢度就同大家拆解幾個最常見嘅錯誤情境同埋點樣解決佢,等你可以更順暢咁管理你嘅容器生命週期。

首先,最常見嘅問題就係 「容器停咗,但係個服務仲霸住個端口」。呢個情況好多時發生喺一啲網絡服務,例如你用緊 Varnish 或者某啲 Web Server。你用 docker compose stop 之後,CLI 顯示所有容器都停咗,但當你想用 docker-compose up 重新啟動時,就彈個錯誤話端口已被佔用。點解會咁?好多時係因為個容器入面嘅主進程(通常係用 Go 語言或者其他語言寫嘅)冇妥善處理 SIGTERM 信號,導致個進程冇真正結束,而 Docker 默認嘅 10 秒等待時間一到,就會強制 SIGKILL。但有時呢個「僵屍」進程仲喺宿主機層面留低咗啲嘢。解決方法係要確保你嘅應用程式碼有實現 Graceful Shutdown,即係收到 SIGTERM 時,會先完成手頭上嘅工作(例如完成緊嘅資料庫請求、寫完 log),關閉網絡連接,然後先退出。另外,你亦可以喺 docker-compose.yml 嘅服務設定入面,用 stop_grace_period 呢個參數去延長等待時間,例如 stop_grace_period: 30s,俾多啲時間個容器做清理。

另一個頭痛位係 「數據持久化嘅混亂」。假設你個服務用緊 Docker卷 (Volume) 或者 bind mount 去保存數據,例如係一個數據庫,或者用緊 Liquibase遷移 呢類工具去管理 Schema。如果你直接用 docker compose stop,跟住用 docker-compose start,數據通常冇事。但係,如果你唔小心行咗 docker-compose down(呢個命令會移除容器同網絡),但冇指定保留 Docker卷,咁你所有嘅持久化數據都可能冇晒!呢個係新手嘅致命錯誤。正確做法係,如果你只想停止服務但保留所有嘢(容器、鏡像、網絡、卷)以備下次快速重啟,就用 docker compose stop。如果你真係要清理環境,用 docker-compose down 時,記得要加 -v 參數先會移除卷,但千祈唔好亂用!最好嘅習慣係,將重要嘅數據卷定義喺 docker-compose.yml 嘅頂層 volumes: 部分,咁就算行 down 唔加 -v,呢啲命名卷都唔會被自動刪除,安全好多。

跟住講下 「依賴服務關閉次序搞到 Graceful Shutdown 失敗」。尤其係當你個 Stack 入面有幾個服務係有依賴關係,例如 App Server 要等 Database 做完最後寫入先可以關。默認情況下,docker compose stop 係並行咁向所有容器發送停止信號,可能會導致 App 先停,Database 後停,令到 Graceful Shutdown 失效。解決方案係喺 docker-compose.yml 入面設定 depends_on 加上條件,不過要注意,depends_on 主要控制啟動次序,對停止次序影響有限。更進階嘅做法係,喺你嘅應用入面加入健康檢查同關閉協調邏輯,或者利用 容器編排 平台嘅更精密功能。對於本地開發,一個實用嘅技巧係分階段停止:先手動停掉依賴其他服務嘅容器,再停底層服務。

仲有一種情況係 「誤用 docker-compose exec 或 docker-compose run 產生嘅臨時容器干擾」。有時你為咗 debug,會用 docker-compose exec 入去個運行緊嘅容器,或者用 docker-compose run 起一個新嘅一次性容器做測試。呢啲操作可能會意外咁創建咗新嘅容器或者改變咗容器狀態。當你之後行 docker compose stop,可能會發現有啲「離群」嘅容器唔屬於原本個 Stack,停唔到又或者令到狀態混亂。建議係,用完 docker-compose run 產生嘅容器,記得用 --rm 參數等佢自動清理。平時可以用 docker-compose ps 睇清楚當前項目底下有邊啲容器係活躍,定期用 docker-compose down 清理乾淨個環境再重新開始。

最後,不得不提 「資源鎖定或文件鎖」 問題。如果你個容器應用喺運行時鎖定咗某個文件(例如係一個 SQLite 數據庫文件,或者某啲 Docker鏡像 構建時產生嘅臨時文件),當停止信號發出,個應用未釋放個鎖就死咗,咁下次啟動就會失敗,話個文件被佔用。呢個需要從應用層面解決,確保收到停止信號時,會釋放所有文件鎖。另外,善用 Docker網絡 嘅管理都好重要,有時殘留嘅網絡都會令新容器無法啟動。

總而言之,要避免呢啲常見錯誤,關鍵在於理解 docker compose stop 只係發信號同等待呢個過程,背後涉及到你嘅應用點樣處理信號、點樣管理 容器生命週期、以及點樣設定你嘅 Docker Compose 文件。養成好習慣:設計應用時要考慮 Graceful Shutdown;操作時分清 stop、down、rm 嘅分別;同埋善用 docker-compose ps、docker-compose logs 呢啲命令來診斷問題。當你喺 Stack Overflow 或者 Medium 上見到類似問題,而家你應該知道點樣分析同解決啦!

docker compose stop - Docker鏡像

AboutDocker鏡像Professional illustrations

強制停止指令用法

好啦,講開 docker-compose stop 呢個基本指令,好多時都係等服務優雅關閉 (Graceful Shutdown)。但係做開發運維 (DevOps) 嘅朋友實會遇到啲「釘死」嘅情況,個容器 (Container) 點都停唔到,或者個服務 hang 咗機,唔再回應正常嘅停止信號。呢個時候,你就需要識得點樣「強制停止」佢,唔好畀佢拖慢成個開發或者部署流程。

強制停止嘅核心概念:SIGKILL 信號 要理解點樣強制停止,首先要明 Docker 點樣同容器溝通。正常 docker-compose stop 會向容器入面嘅主進程發送一個 SIGTERM 信號,等個程式有時間做清理,例如完成緊要嘅資料庫操作、關閉檔案、或者好似 Liquibase遷移 呢類工具可以完成到一半嘅工作,呢個就係所謂嘅優雅關閉。但係,如果個程式無處理到 SIGTERM,或者個程式本身已經死咗(無反應),咁個容器就會卡住,唔識自己停。呢個時候,就要出動終極手段:SIGKILL 信號。SIGKILL 係由操作系統核心直接處理,唔會畀程式任何機會做清理,會即時終止個進程,可以話係「格殺勿論」。

實戰指令:docker-compose kill Docker Compose 提供咗一個直接嘅指令就係 docker-compose kill。呢個指令預設就會向指定服務嘅容器發送 SIGKILL 信號,達到強制停止嘅效果。用法好簡單,你可以針對整個專案所有容器,或者指定某個服務嚟做。例如你個 docker-compose.yml 入面有個服務叫 web,但係個 Nginx 或者 Varnish 服務卡死咗,你就可以用 docker-compose kill web。如果想俾多啲控制權,你可以用 -s 旗標指定發送邊種信號,例如 docker-compose kill -s SIGTERM 其實就等同俾多次機會佢優雅關閉,而 docker-compose kill -s SIGKILL 就係明確指定強制殺掉(雖然預設已經係)。記住,用 kill 之後,個容器嘅狀態會變成 Exited,但係個容器本身同佢關聯嘅 Docker卷 (Docker Volume) 仲會存在喺系統度,方便你之後做調查或者重啟。

直接使用 Docker CLI 進行底層操作 有時你可能會覺得 Docker Compose 層面嘅指令唔夠直接,或者你想對單一個容器做更精細嘅控制。呢個時候,跳去用 Docker CLI 會更有效率。首先,你可以用 docker-compose ps 睇下目標容器嘅全名同狀態。然後,直接用 docker kill <容器ID或名稱>。例如 docker kill myproject_web_1。呢個方法同樣係發送 SIGKILL。如果你想睇吓個容器死之前發生咩事,可以嘗試用 docker logs <容器ID> 嚟睇下最後嘅日誌輸出,或者用 docker inspect <容器ID> 去檢查佢嘅詳細狀態,對於排查點解會需要用到強制停止好有幫助。

進階情境:與 down、rm 指令嘅配合使用 強制停止 (kill) 通常唔係一個獨立嘅步驟,而係一個清理過程嘅開端。因為 kill 只係整停個進程,個容器本身仲喺度。好多時我哋嘅最終目的係要移除容器、清理環境,然後重新開始。所以一個常見嘅工作流係:先用 docker-compose kill 強制停止所有有問題嘅服務,然後跟住用 docker-compose down。down 指令會做幾件事:停止所有容器(如果仲行緊)、移除容器、移除 Docker網絡 (Docker Network)(預設創建嗰啲)、但預設會保留 Docker卷 同 Docker鏡像。如果你想連資料卷冊都清埋(小心!會無晒數據),就要加 -v 旗標,即係 docker-compose down -v。另外,如果你只係想移除已經停止咗 (Exited) 嘅容器,可以用 docker-compose rm -f,-f 就係 force,唔使確認直接移除。記住,容器編排 (Container Orchestration) 嘅日常就係呢啲生命週期管理,識得點樣強制停止同清理,先可以保持到開發環境同測試環境嘅整潔。

預防勝於治療:點樣減少需要強制停止嘅情況 雖然有強制停止呢把「牛刀」,但係我哋當然希望少用為妙。最佳實踐包括喺你自己寫嘅應用程式入面,好好處理 SIGTERM 信號,實現 Graceful Shutdown。例如用 Go 語言 寫嘅服務,就要設置好信號處理 (Signal Handling)。另外,確保你嘅 Docker鏡像 入面,個主進程(CMD 或 ENTRYPOINT 指定嘅)係可以正確接收到信號嘅,如果個主進程係個 shell script,就要特別注意信號傳遞問題。仲有,定期清理一啲已經無用、但係停留喺 Exited 或者 Dead 狀態嘅容器同鏡像,可以避免資源耗盡。你可以用 docker system prune -a 嚟做大掃除(同樣要小心,會清走唔用嘅嘢)。將呢啲清理指令寫入 Makefile,就可以自動化執行,令到開發運維流程更順暢。總而言之,強制停止係一個必要嘅故障排除工具,但一個設計良好、能夠妥善處理容器生命週期 (Container Lifecycle Management) 嘅系統,先係長遠之計。

docker compose stop - Docker卷

AboutDocker卷Professional illustrations

停止後資料點處理

好啦,講到用 docker-compose stop 停咗啲服務之後,點樣處理啲資料點,呢個真係唔少開發同 DevOps 朋友會忽略嘅環節。好多時我哋以為停咗個 Container 就一了百了,但其實背後嘅 Docker容器Docker卷(Volume)、同埋 Docker網絡 嘅狀態,仲有啲數據會唔會唔見咗,呢啲都係學問嚟。首先你要搞清楚,docker-compose stopdocker-compose down 係兩回事嚟。Stop 只係會向容器入面嘅主進程發送一個 SIGTERM 信號,等佢可以進行 Graceful Shutdown,即係優雅關閉,等個應用有時間去完成手頭上嘅工作,例如係寫完最後一筆資料去資料庫,或者係完成緊要嘅 Liquibase遷移 腳本。呢個過程好依賴你個應用點樣處理信號,如果寫得好,數據完整性就保得住。但如果你個應用冇理到 SIGTERM,咁 Docker 等一陣(默認 10 秒)之後就會送個 SIGKILL 強行殺咗佢,到時就可能會有數據損壞嘅風險。

所以,停完之後嘅資料點處理,第一樣要諗嘅就係:持久化數據 去咗邊?如果你嘅服務,例如係個數據庫或者係一個文件上傳服務,有掛載到 Docker卷 或者係宿主機嘅某個目錄(Bind Mount),咁就算個 Container 停咗甚至被移除,啲數據都仲會喺度。呢個時候,你就要去檢查吓啲 資料卷冊 嘅狀態同內容。你可以用 docker volume ls 同 docker volume inspect 呢啲 CLI 指令去睇吓啲 Volume 仲存唔存在、掛載點喺邊。呢個步驟對於之後 重啟容器 或者將服務搬去另一部機好緊要,確保啲重要數據冇唔見。

跟住就要處理 容器狀態環境清理。當你用 stop 停咗成個 Stack,啲容器其實仲喺度,只係狀態變成 Exited。呢個時候,容器本身嘅文件系統層(即係所有喺運行時產生嘅、冇被持久化嘅檔案)都仲會保留住。呢個狀態有好有唔好,好處係如果你之後用 docker-compose start 或者 docker-compose up,個容器可以好快噉由原本嘅狀態恢復運行,因為個 Docker鏡像 嘅層同運行時層都未洗。但唔好處就係,如果啲容器停咗好耐都唔理,佢哋會佔用磁碟空間。尤其喺 CI/CD 環境或者開發機,好容易積埋一堆 Exited 容器,所以定期用 docker container prune 清理下係必要嘅 容器生命週期管理 習慣。

另一個要點係 Docker網絡。停咗服務之後,由 Docker Compose 創建嘅自定義網絡通常唔會自動刪除(除非你用 down 命令加 --volumes 同 --remove-orphans 之類嘅參數)。呢啲網絡唔會佔好多空間,但如果你不斷創建新項目又唔清理,個網絡列表都會變得混亂,可能影響之後嘅測試或者 服務更新。你可以用 docker network ls 睇吓有冇啲已經冇容器用緊嘅網絡,然後手動移除佢。

對於進階嘅 容器編排 同開發流程,停服務之後嘅資料點處理仲可以更加自動化。例如,好多團隊會用 Makefile 去定義一套標準指令,好似 make down-clean 咁,背後可能係執行 docker-compose down -v --remove-orphans,等停服務嘅同時清理埋相關嘅 Volume 同網絡,確保每次測試都由一個乾淨環境開始。又或者,喺執行 stop 之前,透過 docker-compose exec 去某個容器行一啲備份腳本,將記憶體中嘅數據或者緩存(例如 Varnish 嘅緩存)寫入持久化儲存。

最後要提一提,理解呢啲資料點點處理,對於除錯同學習都好有幫助。當你個應用停咗之後行為古怪,或者數據唔見咗,你可以去 Stack Overflow 或者 Medium 呢類平台搵下資料,關鍵字就係 docker-compose stop持久化數據Graceful Shutdown 呢啲。你會發現好多討論都圍繞住點樣確保應用正確處理 SIGTERM,特別係用 Go 語言 或者 Node.js 寫嘅應用,點樣設定信號處理器。總而言之,停服務唔係一個結束,而係 容器生命週期 裏面一個需要被管理嘅階段,處理好停咗之後嘅資料點,先至可以保證你嘅開發同部署流程係穩定同可靠嘅。

docker compose stop - 容器編排

About容器編排Professional illustrations

點樣設定停止超時

好啦,而家就同大家深入講下「點樣設定停止超時」呢個實際操作。喺 Docker Compose 嘅世界入面,當你執行 docker-compose stop 或者個服務本身要收工嗰陣,點樣優雅地、有充足時間咁樣關閉容器,絕對係容器生命週期管理嘅重要一環。如果你乜都唔設定,Docker 預設會俾 10 秒時間個容器去做 Graceful Shutdown,即係先發送 SIGTERM 信號通知容器準備關閉,等佢完成手頭上嘅工作(例如寫完最後一筆資料去Docker卷、完成最後一個數據庫連接),10 秒過後如果容器仲未自己停止,Docker 就會毫不留情咁發出 SIGKILL 信號去強制殺死個進程。呢個機制本身係好嘅,但係對於一啲需要較長時間清理嘅服務(例如正在處理緊Liquibase遷移嘅數據庫容器、或者要清空緩存嘅Varnish服務),10 秒真係唔夠㗎,硬生生被 SIGKILL 可能會搞到數據唔完整或者下次啟動出問題。

咁點樣幫佢「加時」呢?秘訣就喺你個 docker-compose.yml 檔案嘅服務定義入面,用 stop_grace_period 呢個指令。呢個設定可以讓你指定由 SIGTERM 發出之後,等到幾耐先至會出 SIGKILL。語法好簡單,跟返 Go 語言嘅時間格式就得。例如,你覺得你個應用程式需要 30 秒嚟做安全關閉,你就可以咁寫:

`yaml services: your_app: image: your-image:latest stop_grace_period: 30s

又或者,如果你個服務係做緊一啲好複雜嘅批次處理,需要成兩分鐘時間,你甚至可以設定為 120s。咁樣設定之後,無論你係直接用 CLI 打 docker-compose stop,定係喺執行 docker-compose down 嘅時候,相關嘅容器都會享有你設定嘅寬限期,進行優雅關閉。呢個設定對於確保持久化數據嘅完整性同容器編排嘅穩定性,真係好關鍵。

除咗喺 Compose 檔案度設定,其實喺用 docker run 直接運行單一容器嗰陣,都可以用 --stop-timeout 參數達到類似效果,不過既然我哋講緊 Docker Compose服務管理,集中喺 docker-compose.yml 嘅設定就最實際。有啲資深開發者仲會將呢類設定整合落 Makefile 入面,令到成個開發同部署流程更加自動化,一鍵執行停止指令嘅同時,確保所有服務都有充足時間收尾。

另外,有一點好值得留意,就係你應用程式本身嘅信號處理做得好唔好。你設定咗 stop_grace_period: 60s,但係你個程式根本冇理會 SIGTERM 信號,咁樣設定幾多秒都係冇用,最後都係會被 SIGKILL。所以,最佳實踐係:第一,你寫嘅應用程式(無論用咩語言)要能夠捕捉同處理 SIGTERM,開始執行關閉程序;第二,先至喺 Docker Compose 層面,根據程式實際需要嘅時間,設定一個合理嘅超時值。好似 Stack Overflow 或者 Medium 上面嘅技術文章都經常強調,呢兩步係相輔相成嘅。

最後提多一個相關場景,就係當你進行服務更新或者容器重啓嘅時候,例如用 docker-compose up -d 去更新服務,背後其實都會涉及先停止舊容器呢個步驟。呢個時候,你預先設定好嘅 stop_grace_period 一樣會生效,確保舊版本服務唔會因為被強制殺死而影響到用戶體驗或者數據一致性。總而言之,設定停止超時唔係咩高深技術,但係一個體現細心同專業嘅開發運維習慣,好好管理你嘅容器生命週期,由俾佢哋有尊嚴地、從容地停止開始。

docker compose stop - CLI

AboutCLIProfessional illustrations

批量管理多個服務

好啦,講到用 Docker Compose 嚟批量管理多個服務,呢個真係佢嘅核心賣點,亦係點解咁多開發同 DevOps 團隊愛用嘅原因。想像下,你個應用有齊 Web Server(例如 Varnish)、Application Server、Database,再加個做 Liquibase 遷移嘅輔助容器,總共七八個 Docker 容器一齊行。如果逐個逐個去手動停,唔單止嘥時間,仲好易出錯,可能停漏咗某個服務,令到容器狀態唔一致。用 docker-compose stop 呢個 CLI 指令,就可以一鍵優雅地停晒成個 Stack 入面所有服務,呢個就係容器編排工具帶來嘅效率提升。佢背後嘅原理,係向每個服務容器發送 SIGTERM 信號,通知佢哋進行 Graceful Shutdown,等佢哋有時間完成手頭上嘅工作(例如處理完當前請求、關閉資料庫連接、寫入日誌等),然後先至停止。呢個信號處理過程對於確保數據完整性同服務可靠性至關重要,尤其係涉及 Docker 卷 裡面嘅持久化數據,唔會因為粗暴關閉而損壞。

當然,批量管理並唔止「停」咁簡單,而係覆蓋整個容器生命週期管理。除咗 stop,仲有 start、restart、down、up 等一系列指令可以應用喺全部服務上。例如,當你更新咗某個 Docker 鏡像,想重啟容器 嚟應用新版本,你可以用 docker-compose restart。如果你需要徹底環境清理,連埋 Docker 網絡 同默認創建嘅匿名資料卷冊一併移除,咁 docker-compose down 就係你嘅好朋友。呢種批量操作,令到本地開發、測試同部署流程變得極之標準化同可預測。好多團隊仲會將呢啲常用指令寫入 Makefile 裡面,整啲好似 make down 或 make restart-all 咁嘅快捷命令,進一步簡化開發運維嘅日常工作,新同事上手都快好多。

不過,批量管理都有啲細節位要留意。首先,就係停服務嘅順序問題。雖然 docker-compose stop 默認係並行發送停止信號,但喺實際應用中,你可能希望有特定次序,例如要先停應用程式,最後先停數據庫,等數據庫有時間處理完剩餘嘅連接。呢個時候,你就需要喺 docker-compose.yml 檔案裡面定義好 depends_on 嘅條件,咁 docker-compose up 時會按次序啟動,而 stop 同 down 嘅時候就會以相反次序嚟停止服務,呢個係 Docker Compose 幫你自動處理好嘅容器生命週期邏輯。另外,有時某個容器(可能係啲舊版或者自己寫嘅應用)冇正確處理 SIGTERM 信號,搞到死都唔肯停。遇到呢種情況,docker-compose stop 等咗一段預設時間(默認10秒)後,就會發出 SIGKILL 信號去強制殺死個容器。呢個超時時間其實可以透過 docker-compose stop -t 或者喺 Compose 檔案裡設定 stop_grace_period 嚟調整,俾多啲時間佢做清理。

最後,講多少少進階嘅批量操作場景。有時我哋唔係想停晒所有嘢,而係想批量更新某部份服務。例如,我哋只更新咗後端服務嘅鏡像,前端同數據庫不變。我哋可以用 docker-compose up -d --no-deps <服務名> 嚟只重建同啟動指定服務,而唔影響其他服務。又或者,想批量對多個服務執行某個指令,例如檢查日誌或者執行資料庫遷移,可以配合 docker-compose exec 嚟操作多個服務(雖然通常都係逐個指定)。總而言之,Docker Compose 提供嘅呢套服務管理工具鏈,將零散嘅 Docker 容器 整合成一個可以統一操作嘅應用單元,無論係停止容器容器重啓定係服務更新,都能夠以批量、高效同可控嘅方式完成,大大減輕咗管理複雜多服務系統嘅負擔。呢啲實戰經驗同技巧,喺 Medium 技術博客或者 Stack Overflow 上面都有好多深入討論,值得我哋持續學習。

docker compose stop - Go 語言

AboutGo 語言Professional illustrations

2026 年最佳實踐

講到2026年嘅最佳實踐,我哋用 docker compose stop 已經唔可以再係求其打句 command 就算。依家嘅環境愈嚟愈複雜,一個 Stack 可能包含十幾個服務,仲要同 CI/CD Pipeline、Liquibase遷移、或者係 Varnish 呢類 Cache 服務互動,所以一定要有套成熟嘅流程。首先,最基本但好多人忽略嘅,就係點樣做 Graceful Shutdown(優雅關閉)。你唔可以就咁俾個 SIGKILL 去強殺啲容器,咁樣好易整爛啲數據,或者令到啲交易中途斷咗。最佳實踐係要確保你嘅應用程式識得處理 SIGTERM 信號,喺收到 docker compose stop 發出嘅信號之後,有足夠時間去完成手頭上嘅工作,例如係寫完最後啲 Log、關閉數據庫連接、或者完成緊要嘅 Liquibase遷移步驟,先至自己熄機。呢個就係容器生命週期管理入面好關鍵嘅一環。

跟住落嚟,要講下點樣管理 Docker容器 嘅狀態同持久化數據。當你用 docker compose stop 嘅時候,默認情況下,容器係會停咗,但係佢哋嘅運行狀態同檔案系統仲喺度,尤其係你用緊嘅 Docker卷(Volume)。呢個係好處,因為你可以好快用 docker compose start 或者 docker-compose restart 去翻閹啲服務,所有數據都喺度。但係,2026年嘅最佳實踐會提醒你,要定期做環境清理。如果你長期用 stop 而唔用 down,就會積聚好多已經停止咗嘅容器,佔用磁碟空間同埋令到 Docker網絡 嘅設定亂晒。所以,我嘅建議係,喺開發階段,你可以多用 stop 同 start 去快速重啓;但係當你要部署去 Staging 或者 Production 環境之前,就應該用 docker-compose down 去徹底移除容器同清理網絡,確保每次嘅構建都係由一個乾淨嘅狀態開始,避免因為殘留設定而引致嘅古怪問題。

另外,喺 2026 年,容器編排 嘅思維已經深入民心,就算你用緊 Docker Compose 呢類相對簡單嘅工具,都要有編排嘅意識。例如,你啲服務之間可能有依賴關係,數據庫要行完 Liquibase遷移 先可以俾個 App Server 連。咁樣,你個停止順序都好重要。雖然 docker compose stop 本身會跟返你喺 YAML 檔案入面定義嘅服務順序去停,但係如果你有自定義嘅需求,就可能要配合 Makefile 或者用 docker-compose exec 喺停止前執行一啲準備指令。有唔少團隊會將呢啲流程寫入 Makefile,令到一個 make stop 嘅指令,背後會做咗一連串動作:可能先停 Varnish 去排清流量,然後停應用層,最後先停數據庫,確保數據一致性。

最後,不得不提嘅係 CLI 操作習慣同團隊協作。到咗2026年,好多工具底層都係用 Go 語言 寫,性能同穩定性都好咗,但係最終都係要靠人嘅操作。最佳實踐係要將常用嘅 docker-compose stop、docker-compose down、同埋 docker-compose up 呢套組合拳,根據唔同場景定義清楚。例如,開發時想保留 Volume 數據做測試,就用 stop;想完全推倒重來,就用 down -v。而且,要鼓勵團隊成員善用 docker-compose ps 去查看容器狀態,唔好估估下。遇到問題嘅時候,與其即刻上 Stack Overflow 或者 Medium 搵答案,不如先睇清楚自己堆容器嘅生命週期係咪管理得當。總而言之,將「容器停止」呢個看似簡單嘅動作,當成係「服務管理」同「開發運維」嘅一部分去認真規劃,先至係 2026 年真正嘅致勝之道。

docker compose stop - Graceful

AboutGracefulProfessional illustrations

同其他指令配合使用

講到 docker-compose stop 呢個指令,好多香港嘅開發同 DevOps 朋友都知佢係用來停止運行緊嘅容器,但其實佢嘅威力同靈活性,好多時係要同其他指令配合使用先至完全發揮到出嚟。單獨用 stop,你可能只係將個服務暫停咗,但背後嘅 Docker容器Docker網絡、同埋啲資料卷冊都仲喺度。所以,要有效率咁管理成個容器生命週期,你一定要識得點樣將 stop 同其他 CLI 指令撈埋一齊用,咁先可以做到精準控制同環境清理

首先,最常見嘅配合就係同 docker-compose down 一齊用。呢個係一個經典嘅 服務管理 流程。例如,當你開發完或者想重新部署整套服務,你可能會先執行 docker-compose stop 來進行 優雅關閉,確保每個容器都有時間處理完手頭上嘅工作(例如完成資料庫交易或者寫晒 log),特別係對於好似 Varnish 呢類緩存服務,或者係行緊 Liquibase遷移 嘅資料庫容器,Graceful Shutdown 好重要。跟住,你先再行 docker-compose down,呢個指令就會將已經停止咗嘅容器、以及創建出嚟嘅網絡同默認卷冊移除,真正做到環境清理,唔會留低一大堆「鬼魂容器」霸住你部機嘅空間。呢個 stop + down 嘅組合拳,對於定期移除容器、保持開發環境乾淨好有用。

另外,docker-compose stop 同 docker-compose restart 或者 docker-compose up 嘅配合,就係容器重啓服務更新嘅核心。假設你修改咗某個服務嘅 Docker鏡像 tag,或者更新咗 docker-compose.yml 入面嘅設定。你可以先用 docker-compose stop 指定停止某一個服務,然後用 docker-compose up -d --no-deps <服務名> 去重新啟動佢,並且拉取新鏡像。咁樣做嘅好處係,其他唔需要更新嘅服務可以繼續運行,唔使成個 Stack 停哂,實現零停機更新。同樣地,如果你只想重新加載某個服務嘅設定(例如 Nginx 嘅 config),stop 之後再 start 或者直接用 restart 都可以,但留意 restart 默認未必會等待 Graceful Shutdown,有時需要額外設定 SIGTERM 信號嘅等待時間。

對於需要進入容器進行偵錯或者維護嘅情況,docker-compose stop 同 docker-compose exec 或 docker-compose run 嘅前後配合就好關鍵。例如,你發現某個 容器 嘅數據有問題,你可以先用 stop 停止該服務,確保數據狀態靜止。然後,你可以用 docker-compose run --rm 啟動一個一次性嘅、附帶互動 shell 嘅新容器,去檢查裏面嘅持久化數據(例如檢查 Docker卷 入面嘅檔案),或者運行一啲診斷命令。完成檢查後,個一次性容器會因為 --rm 參數而自動清理。最後,你再啟動返原本嘅服務。呢個流程避免咗喺運行中嘅容器亂咁改野,導致狀態不一致。

進階一啲嘅用法,會涉及同 Makefile 或者 Shell Script 整合,將 docker-compose stop 變成自動化流程嘅一部分。因為 Docker Compose 本身係用 Go 語言 寫嘅,佢嘅 CLI 好適合放入自動化腳本。例如,你可以寫一個 Makefile target,專門負責安全關閉同備份: backup-db: docker-compose stop db docker run --rm -v db_data:/source -v $(PWD)/backup:/backup alpine tar czf /backup/db_backup.tar.gz -C /source . docker-compose start db 呢個例子裏面,stop 確保資料庫容器停低,數據卷嘅檔案處於穩定狀態,先至進行打包備份,完成後再啟動返個服務。呢類自動化流程對於開發運維嚟講,可以大大減少人為錯誤。

最後,必須要提嘅係信號處理呢個深水區。docker-compose stop 默認會送 SIGTERM 信號俾容器,等佢地有時間自己處理關閉程序。但如果某個容器無適當處理 SIGTERM,佢就會卡住,跟住 Docker Compose 會喺超時後送出 SIGKILL 強制殺死個進程。呢個時候,你就需要配合 docker-compose logs 來查看停止過程嘅記錄,或者用 docker inspect 去檢查容器最後嘅容器狀態。喺 Stack Overflow 或者 Medium 上嘅好多疑難排解文章,都係圍繞點樣設定 stop_grace_period 呢類參數,或者點樣撰寫可以接收 SIGTERM 嘅自訂腳本,來實現真正嘅 Graceful Shutdown。所以,stop 唔係一個孤島指令,佢同你整個應用程式點樣處理關閉信號,以及你點樣用其他指令去監察同排解,係密不可分嘅。

總而言之,將 docker-compose stop 視為你容器編排工具箱裏面嘅一把螺絲批,單獨用佢可以扭鬆一粒螺絲,但當你配合其他工具如 down、up、exec、run、同埋各式各樣嘅腳本同參數時,你先至可以真正拆解、維修、同升級你部複雜嘅「Docker機器」。記住,靈活嘅容器生命週期管理,正正就係建基於你對呢啲指令組合嘅熟練程度同實戰經驗。

docker compose stop - Liquibase遷移

AboutLiquibase遷移Professional illustrations

自動化停止腳本範例

自動化停止腳本範例 對於一班用緊 Docker Compose 嘅 DevOps 同開發者嚟講,絕對係提升效率嘅神兵利器。你諗下,每次要停咗成個服務堆疊(Stack),唔係淨係打句 docker-compose stop 咁簡單㗎。特別係當你個應用涉及到數據庫遷移(例如 Liquibase遷移)、或者有 Varnish 呢類 Cache 服務要先行清理,甚至要確保 Docker容器 係進行 Graceful Shutdown(優雅關閉),唔會因為 SIGKILL 而炒咗啲重要數據,有個自動化腳本就可以幫你一手搞掂,避免人手操作出錯。我哋可以從幾個實際層面去設計呢個範例腳本,等你可以因應自己個 Project 去修改。

首先,一個基本但實用嘅自動化停止腳本,唔會淨係呼叫 docker-compose stop。佢應該要識得按順序去處理唔同服務嘅容器生命週期管理。點解要按順序?因為如果你個應用係微服務架構,服務之間有依賴關係,例如個 Web API 要等訊息隊列處理完剩低嘅 Job 先好停,亂停一氣可能會令數據不一致。所以,腳本可以先用 docker-compose exec 去對某啲特定 Container 發出預先通知,或者執行一啲清理指令,跟住先再逐個服務停。呢個過程正正就係信號處理嘅實戰應用,等容器有機會收到 SIGTERM 信號,執行完自己嘅關閉程序先至退出,對比起直接用 docker-compose down(會直接移除容器)嚟講,對持久化數據環境清理更加友善。

進階少少嘅範例,可以考慮用 Makefile 嚟做。Makefile 唔係 C/C++ 專利,用嚟管理 Docker 容器編排 嘅任務一樣咁好用。你可以定義一個 stop 嘅 target,入面包埋一連串指令:例如先停 Varnish 服務,等佢停止接收新請求;跟住觸發數據庫嘅備份或遷移回滾(Liquibase遷移);然後先至對主應用服務發出停止命令;最後可能仲要處理埋 Docker網絡 同 Docker卷(資料卷冊)嘅清理決定(例如決定留低 Volume 定係剷走)。用 Makefile 好處係你可以將 stop、clean、restart 呢啲服務管理指令模組化,其他隊員一睇就明,唔使係咁易喺 CLI 打錯指令。好多外國 Tech Blog 好似 Medium 或者問答網站 Stack Overflow 都有人分享呢類 Makefile 設計心得。

另外,如果你團隊係用 Go 語言 寫應用,可以考慮將停止邏輯寫入應用本身,配合 Docker Compose 嘅健康檢查同停止超時設定,實現更精細控制。不過,就算唔係寫 Go,單純用 Shell Script 或 Python Script 都已經好夠力。重點係個腳本要有判斷容器狀態嘅能力,例如用 docker-compose ps 睇下服務係咪已經完全停咗,先至進行下一步,避免撞車。仲有,對於需要容器重啓服務更新嘅場景,你個自動化停止腳本可以同更新腳本配對使用,形成一套完整嘅容器生命週期管理工具。

最後提提你,設計腳本時一定要考慮異常處理。例如當 docker-compose stop 某個服務失敗,或者等極都等唔到佢 Graceful Shutdown 嘅時候,腳本要有後備方案,可能係記錄低錯誤 Log,或者發出警告,甚至決定係咪要強制用 docker-compose down 嚟移除容器。記住,自動化嘅目的係為咗可靠同可預測,而唔係製造多一個黑盒。所以,將每個步驟寫得清晰,加入適當嘅 Echo 訊息,對成個團隊嘅開發運維流程都有好大幫助。總括嚟講,一個寫得好嘅自動化停止腳本範例,應該要融匯貫通你對 Docker Compose、容器停止順序、數據持久化同信號處理嘅理解,先至算係一個真正有 SEO 價值同實戰價值嘅工具。

docker compose stop - Makefile

AboutMakefileProfessional illustrations

疑難排解全攻略

好啦,講到docker-compose stop,如果你以為只係一句command就搞掂晒所有嘢,咁你就太天真啦!實戰入面,尤其係管理緊複雜嘅容器編排服務時,遇到嘅古靈精怪問題可以話係層出不窮。作為一個醒目嘅開發運維,掌握一套疑難排解全攻略絕對係必備技能,等你可以優雅又高效咁管理好容器生命週期

首先,最常見嘅問題莫過於啲容器停極都停唔到,或者停咗好耐都未停到,最後逼住要用強制手段。呢個時候,你就要了解吓docker-compose stop背後嘅原理。其實呢個指令會向容器入面運行緊嘅主進程發送一個SIGTERM信號,通知佢準備優雅關閉。理想情況下,你嘅應用程式(例如用Go 語言寫嘅後端服務)應該要設置好信號處理,收到SIGTERM之後就開始清理資源、完成手上嘅工作(例如處理完當前嘅資料庫請求或者Liquibase遷移),然後先至自己退出。但如果個應用程式冇好好處理呢個信號,或者佢根本冇收到(可能被包裝咗喺某個Shell Script入面),咁佢就會冇反應。等到一段時間(默認係10秒)之後,Docker就會失去耐性,派出殺手SIGKILL呢個無法阻擋嘅信號去強制結束個進程。所以,如果你發現成日都等足10秒先停到,咁就要檢查返你個Docker鏡像入面嘅應用程式,係咪有正確設置處理SIGTERM喇。你可以用docker-compose exec 入到個容器裏面,睇吓個主進程係乜嘢,同埋測試下手動發送信號得唔得。

另一個頭痛位就係容器停止嘅次序同埋相依性問題。想像一下你個Stack裏面有個Web App同一個Database。如果你用docker-compose stop,默認情況下佢係會不分先後、同時向所有容器發送停止信號嘅。萬一個Web App停得快過個Database,但係Web App喺Graceful Shutdown期間仲需要同Database講多聲拜拜或者寫最後一啲Log,咁就會因為連唔到Database而出錯,搞到關閉得唔優雅。雖然docker-compose stop本身冇內置嘅依賴順序控制(呢個係docker-compose down先有嘅部份參數),但你可以透過策略性咁安排停止指令來解決。例如,你可以先單獨停止依賴其他服務嘅容器:docker-compose stop web_app,等佢完全停咗之後,先至再停個Database:docker-compose stop database。又或者,喺你設計服務嗰陣,就要令到每個服務嘅關閉邏輯更加健壯,能夠忍受下游服務突然失聯。

跟住落嚟要講吓持久化數據Docker卷嘅問題。有時你停咗一堆容器之後,發現重新用docker-compose up啟動返,入面嘅數據唔見咗或者還原到好舊嘅狀態?咁可能係因為你誤會咗docker-compose stop嘅作用。呢個指令只係停止容器,但唔會移除容器、網絡或者最重要嘅——資料卷冊。啲數據理論上仲喺度。問題可能出在:第一,你個容器嘅數據根本冇掛載到Docker卷或者Host機嘅目錄,只係寫喺容器自己嘅可寫層,而呢個可寫層雖然喺stop後依然存在,但如果你之後運行咗docker-compose down(呢個指令會移除容器),數據就會跟住消失。第二,可能有多個容器共用同一個卷,但係數據一致性出現問題。排解呢類問題,你要善用docker volume ls同docker volume inspect呢啲CLI指令,去檢查你嘅Docker卷狀態同埋掛載點,確認數據確實有被保存落嚟。

仲有唔少人會混淆docker-compose stopdocker-compose down。簡單嚟講,stop係「暫停服務」,down係「拆檔清場」。當你需要做環境清理或者想徹底移除容器重新開始嘅時候,就應該用down。但如果你只係想重啟容器或者更新某個服務嘅代碼,用stop之後再up(或者直接用docker-compose restart)會更有效率,因為佢會保留容器之前嘅狀態,有時啟動起上嚟會快啲。排解疑難時,一定要清楚自己用緊邊個指令,同埋預期會達到乜嘢效果。例如,當你修改咗Dockerfile或者Makefile入面嘅構建步驟,單純stop同up係唔會重新構建鏡像嘅,你需要用docker-compose up --build或者先down再up。

最後,分享一啲實用小貼士。如果你喺Medium或者Stack Overflow見到人討論點樣處理複雜嘅關閉流程,例如要等Varnish清空完Cache或者某個任務隊列處理晒所有Job先好停,你可能需要自定義你嘅容器生命週期管理腳本。你可以寫一個Shell Script,入面順序執行:先發送信號去暫停接收新任務,然後用docker-compose exec 去觸發內部清理命令,最後先至執行docker-compose stop。另外,多啲使用docker-compose ps嚟查看容器狀態,用docker-compose logs [服務名]`喺停止前後查看日誌,好多時候答案就喺啲Error Log裏面。記住,優雅關閉唔係魔法,而係需要你同你嘅開發團隊一齊規劃同實踐嘅良好習慣,由應用程式碼到容器編排設定都要照顧到,咁先可以確保服務管理得順順利利。

Frequently Asked Questions

What is the difference between docker compose stop and down?

`docker compose stop` 同 `docker compose down` 係兩個唔同嘅指令,主要分別在於對容器同網絡嘅處理。`stop` 指令只會暫停運行中嘅容器,但會保留容器同相關網絡配置;而 `down` 指令就會停止容器並移除佢哋,同時會刪除由 `up` 指令創建嘅網絡。

  • `docker compose stop`**: 暫停服務容器,但容器、網絡同數據卷依然存在,方便快速重啟。
  • `docker compose down`**: 停止服務並移除容器、網絡(預設)以及數據卷(如使用 `-v` 標誌)。
  • 使用場景**: 日常開發調試建議用 `stop`;需要徹底清理環境或重建時,則使用 `down`。

How do I stop all running Docker containers?

要停止所有運行中嘅 Docker 容器,你可以使用一個簡單嘅命令,無需依賴 Docker Compose 檔案。呢個方法適用於清理整個 Docker 環境,非常方便快捷。

  • 使用通用指令**: 執行 `docker stop $(docker ps -q)`,呢個指令會獲取所有運行中容器嘅 ID 並停止佢哋。
  • 使用 Docker Compose**: 如果你嘅項目都係用 Compose 管理,可以喺每個專案目錄下執行 `docker compose stop`。
  • 注意事項**: 停止所有容器前,請確認無重要服務運行,以免造成數據丟失或服務中斷。

What does the docker stop command do?

`docker stop` 係一個核心指令,用於向一個或多個運行中嘅 Docker 容器發送停止信號。佢嘅主要作用係優雅地終止容器內嘅主進程,俾佢有時間進行清理工作。

  • 工作原理**: 預設會發送 SIGTERM 信號,等待一段寬限期(預設10秒)後,如果進程未結束,則發送 SIGKILL 強制終止。
  • 與 kill 嘅區別**: `docker stop` 嘗試優雅關閉,而 `docker kill` 則直接發送 SIGKILL 立即終止。
  • 常用選項**: 可以使用 `-t` 或 `--time` 標誌來設定等待寬限期嘅秒數,例如 `docker stop -t 5 container_name`。

How do I stop and restart a Docker Compose project?

停止並重啟一個 Docker Compose 項目係日常維護嘅常見操作。正確嘅步驟可以確保服務同數據嘅完整性,避免意外錯誤。

  • 標準流程**: 先執行 `docker compose stop` 來停止服務,然後再執行 `docker compose start` 或 `docker compose up` 來重新啟動。
  • 快速重啟**: 使用 `docker compose restart` 指令可以直接重啟所有服務,但注意佢唔會重新加載可能已修改嘅 `docker-compose.yml` 配置。
  • 重建服務**: 如果修改咗 Dockerfile 或配置,需要先 `docker compose down`,再 `docker compose up --build` 來重建並啟動。

Is Docker (and Docker Compose) still relevant in 2026?

截至2026年,Docker 同 Docker Compose 依然係容器化同微服務開發領域非常重要嘅工具。雖然有更多新興選項(如 Podman),但 Docker 嘅龐大生態、穩定嘅工具鏈同廣泛嘅社羣支援,令佢喺企業同開發者中保持高度相關性。

  • 市場地位**: Docker 仍然係容器運行時嘅事實標準,大量 CI/CD 流程同雲平臺原生支援。
  • Compose 嘅演進**: Docker Compose 已整合到 `docker` CLI 中(`docker compose`),並持續更新,支援更複雜嘅應用編排。
  • 學習價值**: 理解 Docker 基礎對學習 Kubernetes 等進階編排工具非常有幫助,相關技能需求持續強勁。

How to gracefully stop a specific service in a Docker Compose file?

當你只需要停止 Docker Compose 項目中嘅某一個特定服務,而唔係全部時,可以指定服務名來操作。呢個方法對於微服務架構嘅獨立調試同部署非常有用。

  • 指令語法**: 使用 `docker compose stop [SERVICE_NAME]`,例如 `docker compose stop web_app`。
  • 依賴處理**: 被停止嘅服務所依賴嘅其他服務(如數據庫)唔會受影響,會繼續運行。
  • 重啟單一服務**: 停止後,可以使用 `docker compose start [SERVICE_NAME]` 或 `docker compose up [SERVICE_NAME]` 來單獨重啟佢。

使用 docker compose stop 時,如何確保數據不會丟失?

確保數據安全係停止容器時嘅首要考慮。`docker compose stop` 指令本身唔會刪除數據,但最佳實踐可以進一步保障數據完整性,特別係對於數據庫等有狀態服務。

  • 善用數據卷 (Volumes)**: 將應用數據持久化儲存在 Docker Volume 或綁定掛載 (bind mounts) 中,咁樣即使容器被移除,數據依然保留。
  • 遵循關閉流程**: 確保你嘅應用程式能夠正確響應 SIGTERM 信號,完成未完成嘅寫入操作同關閉連接。
  • 停止前備份**: 對於關鍵數據,可以考慮喺執行 `stop` 前,先運行一個備份腳本或使用 `docker cp` 指令複製重要文件出嚟。

docker compose stop 同直接關閉終端機有咩唔同?

呢個係新手常見困惑。直接關閉運行緊 `docker compose up` 嘅終端機,同執行 `docker compose stop` 有本質上嘅區別,會導致唔同嘅結果。

  • 信號發送**: `docker compose stop` 會向每個容器發送 SIGTERM 信號,允許優雅關閉。直接關閉終端通常會發送 SIGHUP,可能導致進程突然終止。
  • 前臺模式 vs 後臺模式**: 用 `docker compose up` 預設係前臺模式,關閉終端會停止命令並導致容器停止。建議開發時使用 `docker compose up -d` 在後臺運行,然後用 `stop` 控制。
  • 日誌記錄**: 直接關閉終端可能會中斷日誌輸出。使用 `stop` 指令則唔會影響已產生嘅日誌,你仍可用 `docker compose logs` 查看。

點解有時 docker compose stop 需要好長時間?如何解決?

遇到 `docker compose stop` 執行緩慢,通常同容器內應用程式處理停止信號嘅方式有關。瞭解原因可以幫助你優化關閉流程,加快開發迭代速度。

  • 常見原因**: 容器內主進程無正確處理 SIGTERM 信號,或者有子進程未結束,導致要等到超時(預設10秒)後先被強制殺死。
  • 解決方法**: 檢查同修改你嘅應用程式代碼,確保能捕獲 SIGTERM 並快速清理資源。亦可以喺 `docker-compose.yml` 嘅服務配置中設置 `stop_grace_period` 來縮短等待時間。
  • 強制停止**: 如果情況緊急,可以喺另一個終端直接運行 `docker compose kill` 來立即強制停止所有服務。