【Docker基礎】Docker容器管理:docker stop詳解

目錄

1 Docker容器生命周期概述

2 docker stop命令深度解析

2.1 命令基本語法

2.2 命令執行流程

2.3 stop與kill的區別

3 docker stop的工作原理

3.1 工作流程

3.2 詳細工作流程

3.3 信號處理機制

4 docker stop的使用場景與最佳實踐

4.1 典型使用場景

場景1:服務正常關閉

場景2:編排系統滾動更新

場景3:資源回收

場景4:開發調試循環

4.2 最佳實踐建議

5 docker stop常見問題與解決方案

Q1: 容器無法正常停止怎么辦?

Q2: 如何確認容器已優雅停止?

Q3: 為什么docker stop比docker kill慢?

Q4: 如何批量停止多個容器?

6 總結


1 Docker容器生命周期概述

Docker容器作為輕量級的虛擬化技術單元,擁有明確的生命周期狀態轉換。理解這些狀態及其轉換關系是掌握容器管理的基礎,在Docker中,容器主要經歷以下幾個狀態:創建(Created)、運行(Running)、暫停(Paused)、停止(Stopped)和刪除(Deleted)。
容器狀態轉換的核心命令包括docker create、docker start、docker stop、docker pause和docker rm等,其中,docker stop是最常用的容器管理命令之一,它實現了從運行狀態到停止狀態的優雅轉換。
  • 容器生命周期狀態
docker stop命令將容器從運行狀態(Running)轉換為停止狀態(Stopped),這是容器管理中最常見的操作之一,與docker kill不同,docker stop提供了優雅停止容器的機制。

2 docker stop命令深度解析

2.1 命令基本語法

  • docker stop命令的基本語法如下:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
常用選項:
  • -t, --time:指定等待容器停止的超時時間(默認為10秒)
  • --help:顯示幫助信息
參數說明:
  • CONTAINER:可以是一個或多個容器ID或名稱

2.2 命令執行流程

  • 客戶端發送stop命令到Docker守護進程
  • 守護進程通過容器運行時(runc/containerd)向容器主進程發送SIGTERM信號
  • 容器進入優雅停止期(默認10秒)
  • 若超時后仍在運行,則發送SIGKILL強制終止
  • 最終更新容器狀態為"Exited"

2.3 stop與kill的區別

特性

docker stop

docker kill

默認信號

SIGTERM

SIGKILL

優雅停止

支持

不支持

超時機制

可配置(默認10秒)

立即終止

使用場景

正常關閉服務

強制終止無響應容器

數據完整性

較高

可能損壞

信號指定

不可指定

可指定任意信號(如SIGTERM)

3 docker stop的工作原理

3.1 工作流程

3.2 詳細工作流程

命令解析階段
  • 解析命令行參數和選項
  • 驗證目標容器是否存在且運行中
  • 設置默認超時時間(10秒)或使用用戶指定的值
API調用階段
  • 通過Docker Engine API發送停止請求
  • 請求包含容器ID和超時參數
運行時處理階段
  • containerd接收到停止請求
  • 通過runc發送信號給容器進程
  • 首先發送SIGTERM(信號15)
等待階段
  • 啟動計時器監控超時
  • 檢查容器進程狀態變化
終止階段
  • 若超時則發送SIGKILL(信號9)
  • 確保容器進程終止
狀態更新階段
  • 更新容器元數據狀態為"Exited"
  • 記錄退出代碼和終止信號
資源清理階段
  • 釋放容器資源(CPU、設備映射等)
  • 保持文件系統掛載以便后續可能的重啟

3.3 信號處理機制

Docker stop的核心依賴于Linux信號機制:
  • SIGTERM(15):禮貌的終止請求,允許進程:
    • 完成當前操作
    • 釋放資源
    • 保存狀態
    • 關閉文件描述符
    • 通知子進程
  • SIGKILL(9):強制終止信號,特點:
    • 不能被捕獲或忽略
    • 立即終止進程
    • 可能導致資源泄漏
    • 應作為最后手段使用
  • 信號傳遞流程:
PS:如果容器內PID 1進程沒有正確配置信號處理,可能導致信號無法傳播到子進程,這是常見的優雅停止失敗原因。

4 docker stop的使用場景與最佳實踐

4.1 典型使用場景

場景1:服務正常關閉

# 優雅停止 
docker stop container -t 30 # 給予30秒緩沖時間

場景2:編排系統滾動更新

# 批量停止舊版本容器 
docker ps -f "label=version=1.0" -q | xargs docker stop -t 15

場景3:資源回收

# 停止并刪除所有已停止容器 
docker stop $(docker ps -q) && docker container prune

場景4:開發調試循環

while true; dodocker stop test_containerdocker start test_containersleep 10
done

4.2 最佳實踐建議

  • 合理設置超時時間
    • 數據庫容器:建議30-60秒
    • Web應用:10-20秒
    • 批處理作業:根據任務特性設置
  • 容器內進程設計
  • 確保PID 1進程能正確處理和傳播信號
  • 避免使用shell腳本作為主進程(如bash -c)
  • 結合健康檢查
{"Healthcheck": {"Test": ["CMD", "curl", "-f", "http://localhost/health"],"Interval": 5000000000,"Timeout": 2000000000,"Retries": 3,"StartPeriod": 30000000000}
}
  • 監控停止操作
# 查看容器退出代碼
docker inspect --format='{{.State.ExitCode}}' container
# 檢查停止原因
docker inspect --format='{{.State.Error}}' container
  • 停止前預處理
# 停止前執行清理腳本
docker exec container_name /scripts/pre-stop.sh
docker stop container_name -t 15

5 docker stop常見問題與解決方案

Q1: 容器無法正常停止怎么辦?

可能原因
  • 主進程忽略SIGTERM
  • 子進程未正確終止
  • 存在僵尸進程
  • 文件系統掛載繁忙
解決方案
# 增加停止超時時間
docker stop -t 30 stubborn_container# 檢查進程樹
docker exec stubborn_container ps aux# 最后手段
docker kill stubborn_container

Q2: 如何確認容器已優雅停止?

  • 檢查退出狀態:
docker inspect --format='{{.State.ExitCode}}' container_name
  • 0表示正常退出
  • 非0表示異常退出

Q3: 為什么docker stop比docker kill慢?

  • stop:給予進程清理時間(默認10秒)
  • kill:立即強制終止

Q4: 如何批量停止多個容器?

# 按名稱過濾停止
docker stop $(docker ps -f "name=web_" -q)# 按時間過濾停止
docker stop $(docker ps -f "until=2h" -q)

6 總結

docker stop作為Docker容器管理的核心命令,提供了優雅停止容器的標準方式。掌握docker stop的正確使用方式,能夠確保容器化應用的穩定運行和平滑升級,是每個Docker用戶必備的核心技能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86189.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86189.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86189.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

rules寫成動態

拖拽排序和必填校驗聯動(rules寫到computed里) computed: {rules() {const rules {};this.form.feedList.forEach((item, idx) > {rules[feedList.${idx}] [{ required: true, message: 路線評價動態${idx 1}待填寫,請填寫完畢提交, trigger: change }];});re…

The Open Group開放流程自動化? 論壇(OPAF)發布組織最新進展報告

除埃克森美孚(ExxonMobil)的成就外,開放流程自動化? 論壇(OPAF)的最新論壇報告顯示,該組織其他成員也在多個領域取得進展。 “我們祝賀埃克森美孚,因為他們證明了在前線、創收的工藝操作中部署…

線程的基本控制

線程終止 exit是危險的 如果進程中的任意一個線程調用了exit,那么整個進程終止。 不終止進程的退出方式 普通單個線程的退出方法,以下方法退出不會導致進程終止: (1)從啟動例程中返回,返回值是線程的退出…

DeepSeek+WinForm串口通訊實戰

前言 在現代軟件開發中,串口通訊仍然是工業自動化、物聯網設備和嵌入式系統的重要通信方式。隨著.NET技術的發展,特別是.NET 5/.NET 6的跨平臺能力,傳統的WinForm應用現在可以通過現代UI框架實現真正的跨平臺串口通訊。本文將深入探討三種主…

針對數據倉庫方向的大數據算法工程師面試經驗總結

?? 一、技術核心考察點 數據建模能力 星型 vs 雪花模型:面試官常要求對比兩種模型。星型模型(事實表冗余維度表)查詢性能高但存儲冗余;雪花模型(規范化維度表)減少冗余但增加JOIN復雜度。需結合場景選擇&…

Nuxt3 Cannot read properties of undefined (reading ‘createElement‘)

你遇到的 TypeError: Cannot read properties of undefined (reading createElement) 這個報錯,通常是由于在 Nuxt3 或 Vue3 項目中,某些地方嘗試訪問 document.createElement 或類似 DOM API,但此時 document 還未定義(比如在服務…

正則表達式匹配實現

直接上代碼 using Microsoft.AspNetCore.Mvc; using System.Text.RegularExpressions;namespace SaaS.OfficialWebSite.Web.Controllers {public class RegController : Controller{public IActionResult Index(){return View();}[HttpPost]public IActionResult TestRegex([F…

API測試工具Parasoft SOAtest:應對API變化,優化測試執行

API頻繁變更給測試工作帶來諸多挑戰,如手動排查變更影響耗時費力、測試用例維護繁瑣易出錯等。Parasoft SOAtest作為一款企業級API測試工具,通過自動掃描API接口、智能分析變更影響、優化測試,執行以及支持測試用例共享與版本控制等功能&…

mysql 數據庫連接 -h localhost 和 -h 127.0.0.1 區別是什么

對于 mysql 數據庫, 在 my.conf 中指定的client 端口是 3358,實際的mysql server 的端口監聽在 3306, mysql -h localhost 可以居然可以連接成功; mysql -h 127.0.0.1 連接失敗提示Can’t connect to MySQL server on 127.0.0.1&a…

Educational Codeforces Round 180 (Rated for Div. 2) A-D

A.Race 題目大意 給你兩個x,y,終點會在二點之間隨機出現,alice在點a,假設alice和bob有相同的速度(距離更短者用時更少),問對于bob是否存在一點,無論終點是x還是y,他都能比alice更快到達 思路 如果alice在…

python requests post請求

在Python中,使用requests庫進行POST請求是一種常見的操作,用于向服務器發送數據。下面是如何使用requests庫進行POST請求的步驟: 安裝requests庫 如果你還沒有安裝requests庫,可以通過pip安裝: pip install requests…

Postman中設置定時自動運行接口測試

?創建測試集合? 將需每日運行的接口組織到Collection中,并配置好測試腳本和斷言。 ?配置定時運行? 打開目標Collection → 點擊 ?Run? 按鈕在Collection Runner頁面底部選擇 ?Schedule runs?關鍵配置: Frequency: Daily // 選擇每日執行 Time…

multiprocessing.pool和multiprocessing.Process

在CPU密集型任務中,Python的multiprocessing模塊是突破GIL限制的關鍵工具。multiprocessing.Pool(進程池)和multiprocessing.Process(獨立進程)是最常用的兩種并行化方案,但其設計思想和適用場景截然不同。…

容器技術技術入門與 Docker 環境部署

目錄 一:Docker概述 1、 Docker的優勢: (1)環境一致性 (2)隔離性 (3)資源高效 (4)便捷性和可擴展性 2、Docker容器與傳統虛擬機的區別 3、Docker的應用…

Oracle獲取執行計劃之DBMS_XPLAN 技術詳解1

在 Oracle 數據庫的管理與優化工作中,深入了解 SQL 語句的執行計劃是至關重要的一環。DBMS_XPLAN 包作為 Oracle 提供的強大工具,能夠幫助數據庫管理員(DBAs)和開發人員清晰地查看和分析 SQL 語句的執行計劃,從而實現對…

【Python】VScode配置Python教程

文章目錄 【Python】VScode配置Python教程下載Python安裝插件解決亂碼徹底運行vscode安裝python庫 【Python】VScode配置Python教程 前言: 當「Python 編程潛力」遇上「VSCode 開發神器」,會點燃怎樣的效率革命?試想這樣的場景:你…

PowerBI HtmlContent生成表格

假設有銷量表: 1.PowerBI 導入 Html Content對象&#xff0c;并拖入報表 2.新建度量值: 度量值 VAR colCount DISTINCTCOUNT(銷量[產品]) VAR ColumnHeaders "<tr><th styleborder:1px solid black; padding:5px; text-align:center; colspan"&col…

【人工智能與機器人研究】基于運動數據時空特征提取的人類運動片段分割方法

導讀 動作示教方法是非專家用戶對人形機器人進行控制的可靠形式&#xff0c;而對人類動作數據的運動分割與理解是其前提。利用現有方法對所捕獲人類運動原始數據進行關鍵幀提取與運動分割時&#xff0c;由于數據特征不明確&#xff0c;導致難以準確定位運動起始幀、結束幀及分…

ARM內核之CMSIS

1.什么是CMSIS&#xff1f; CMSIS&#xff08;Cortex Microcontroller Software Interface Standard&#xff0c;Cortex微控制器軟件接口標準&#xff09;提供Cortex-M內核與軟件之間的接口&#xff0c;即用戶可以通過這些統一的接口&#xff08;函數API&#xff09;去訪問底…

嵌入式軟件面經(二)Q: Modbus協議CRC校驗的方式是什么?它有哪些優勢?

Modbus協議使用的CRC&#xff08;循環冗余校驗&#xff09;是一種用于確保數據通信完整性和準確性的差錯檢測方法。在Modbus RTU通信中&#xff0c;CRC校驗過程清晰明確&#xff0c;且被廣泛應用于工業通信場景。 一、Modbus協議的CRC校驗流程 &#xff08;一&#xff09;CRC計…