指南/如何停止Docker容器

如何在Mac上停止Docker容器,一個或全部

Atta 🐬

Vitals創辦人

發佈於

簡短回答

若要停止一個Docker容器,請執行docker stop並加上它的名稱或ID;docker ps會列出它們。若要停止所有執行中的容器,請執行docker stop $(docker ps -q)。在Compose專案中,docker compose stop會停止它的容器,docker compose down還會移除它們。docker stop會請容器關閉,10秒後強制關閉。會自己回來的容器設有重新啟動原則;請用docker update --restart=no將它關閉。Vitals是一款Mac系統監控工具,能從選單列停止容器:它的「容器」列表會顯示每個容器的記憶體,詢問後按一下即可停止。

如何從「終端機」停止Docker容器

  1. 01 執行docker ps,列出執行中的容器及其名稱和ID。
  2. 02 用docker stop加上名稱停止一個容器,例如docker stop web-1。一個指令中可以指定多個。
  3. 03 用docker stop $(docker ps -q)停止所有執行中的容器。docker ps -q只會列出ID,而docker stop會接收所有ID。
  4. 04 若是Compose專案,請在它的檔案夾中執行docker compose stop停止它的服務,或執行docker compose down停止服務並移除容器和專案的網路。除非加上-v,否則磁碟區會保留。
  5. 05 再執行一次docker ps。仍在列表中的容器還在關閉中,而過一會兒又回來的容器則設有重新啟動原則。

當docker指令指向OrbStack、Colima和Rancher Desktop時,同樣的指令也適用。Podman有podman stop,podman stop -a會停止所有容器。

停止容器會結束它的程序,並保留其他一切:它的檔案、設定和磁碟區,隨時可以用docker start再次啟動。因此,要從沒在使用的容器拿回記憶體和CPU,這是安全的做法。下表將它與大家常一併想到的指令做比較。

docker stop、kill、pause、rm與compose down

指令作用適用時機
docker stop 傳送SIGTERM,10秒後傳送SIGKILL 幾乎任何時候:App能寫完資料並關閉連線
docker kill 立即傳送SIGKILL 容器不理會docker stop
docker pause 凍結程序,程序會保留各自的記憶體 你想暫時拿回CPU,而不是記憶體
docker rm 移除已停止的容器,或加上-f移除執行中的容器 你已經不需要它了;具名磁碟區會保留
docker compose stop 停止專案的容器並保留它們 你很快會再啟動同一個專案
docker compose down 停止並移除容器和網路 你想下次從頭開始;加上-v也會移除磁碟區

為什麼已停止的容器又啟動了

設有重新啟動原則的容器會被Docker再次啟動。使用always時,你停止的容器會在下次Docker Desktop啟動時回來,所以昨天停止的容器在重新開機後又在執行了。使用unless-stopped時,你停止的容器會維持停止。Compose檔案常會為資料庫和快取設定restart: always。

若要查看容器的原則,請執行docker inspect --format '{{.HostConfig.RestartPolicy.Name}}'並加上它的名稱。若要關閉原則,請執行docker update --restart=no加上名稱,或更改Compose檔案中的restart:。

docker stop何時要等10秒

docker stop傳送SIGTERM後,會等待容器的主要程序結束。不理會這個訊號的程序(通常是沒有把訊號傳下去的shell指令碼)會讓停止作業拖滿10秒,直到Docker強制終止它。docker stop -t 2可以縮短等待時間。修正映像檔就能讓它立即停止:在entrypoint指令碼中用exec啟動App,或在Compose中為該服務設定init: true。

停止容器,並拿回記憶體

在Mac上,容器會在同一台Linux虛擬機器裡執行。停止容器會釋放它們在虛擬機器內的記憶體,但虛擬機器可能仍佔著這些記憶體,所以活動監視器中的Virtual Machine Service for Docker可能依然很大。Resource Saver或結束Docker Desktop,才會把記憶體還給macOS;相關設定請參閱Docker使用太多記憶體。

不用「終端機」停止容器

Docker Desktop的Containers顯示方式中,每個容器和每個Compose專案都有Stop按鈕。它在Docker Desktop的視窗裡,所以你得打開App才能使用。像Captain這類選單列App,會在選單列圖像下列出容器,每個都能啟動和停止。Vitals在它的選單列中也能做到,還加上它們都沒有顯示的資訊:每個容器使用多少記憶體和CPU,讓你知道該停止哪一個。

Vitals多了什麼

Vitals能從Mac的選單列停止容器,記憶體用量一目了然。

  • 下拉面板中的「容器」列表:每個執行中的容器,附上它的Compose專案、映像檔和一條記憶體長條
  • 將指標移到其中一個上方,按一下出現的×。該列會先詢問,再像docker stop一樣停止它,給它10秒關閉
  • 在視窗的「容器」標籤頁中,選取多個後按住Control鍵並按一下,即可一起停止;或按住Control鍵並按一下某個Compose專案,選擇「全部停止」
  • 每個容器的記憶體、CPU、網路、磁碟和已發佈的連接埠,支援Docker Desktop、OrbStack、Colima、Rancher Desktop和Podman

小提醒

  • Vitals在停止任何東西之前都會先詢問,而且從不啟動、移除或更改容器。
  • 設有重新啟動原則的容器,可能會被它的引擎再次啟動。視窗在詢問時會說明這點。
  • 如果引擎拒絕或沒有回應,該列會顯示容器仍在執行。
  • 有引擎在執行時,就會出現「容器」列表。
購買Vitals $15 一年更新$9,或在首發期間以$15終身使用,之後為$39。一次付清,14天內可退款。

大家常問的問題

如何一次停止所有Docker容器?

執行docker stop $(docker ps -q)。它會列出所有執行中容器的ID,並逐一停止。在Vitals中,請在「容器」標籤頁中選取它們,再按住Control鍵並按一下,即可一起停止。

docker stop和docker kill有什麼差別?

docker stop會傳送SIGTERM,最多等待10秒,再用SIGKILL強制停止容器。docker kill會立即傳送SIGKILL,所以App沒有機會寫完資料或關閉連線。

docker compose stop和down有什麼差別?

docker compose stop會停止容器並保留它們,隨時可以用docker compose start再次啟動。docker compose down會停止它們,並移除容器和專案的網路;除非加上-v,否則磁碟區會保留。

為什麼我停止Docker容器後它又啟動了?

它的重新啟動原則是always,所以Docker Desktop啟動時,Docker會再次啟動它。請執行docker update --restart=no加上它的名稱,或更改Compose檔案中的restart:。

停止容器會刪除它的資料嗎?

不會。已停止的容器會保留它的檔案和磁碟區,docker start可以再次執行它。docker rm會移除容器;具名磁碟區會一直保留,直到你移除為止。

可以從Mac選單列停止Docker容器嗎?

可以,用Vitals就行。它的選單列下拉面板會列出執行中的容器及其記憶體,詢問後按一下即可停止容器。它支援Docker Desktop、OrbStack、Colima、Rancher Desktop和Podman。

詞彙表中的相關條目

更多指南