5.3 終止
本節將介紹如何終止一個執行中的容器,以及幾種不同的終止方式及其區別。
5.3.1 終止方式概述
終止容器有三種方式:
| 方式 | 指令 | 說明 |
|---|---|---|
| 優雅停止 | docker stop |
先發 SIGTERM,超時後發 SIGKILL |
| 強制停止 | docker kill |
直接發 SIGKILL |
| 自動終止 | - | 容器主程序退出時自動停止 |
5.3.2 docker stop:推薦
docker stop 基本用法
$ docker stop 容器名或ID
工作原理
flowchart TD
cmd["docker stop mycontainer"] --> A["1. 傳送 SIGTERM 訊號給容器主程序 (PID 1)"]
A --> B["2. 等待容器優雅退出 (預設 10 秒)"]
B --> C["3. 如果超時仍未退出,傳送 SIGKILL 強制終止"]
自定義超時時間
## 等待 30 秒後強制終止
$ docker stop -t 30 mycontainer
## 立即傳送 SIGKILL(相當於 docker kill)
$ docker stop -t 0 mycontainer
停止多個容器
## 停止多個指定容器
$ docker stop container1 container2 container3
## 停止所有執行中的容器
$ docker stop $(docker ps -q)
5.3.3 docker kill
基本用法
$ docker kill 容器名或ID
與 stop 的區別
| 指令 | 訊號 | 使用場景 |
|---|---|---|
docker stop |
SIGTERM → SIGKILL | 正常停止,讓應用優雅退出 |
docker kill |
SIGKILL | 應用無回應,強制終止 |
傳送自定義訊號
## 傳送 SIGHUP(讓程序重新載入設定)
$ docker kill -s HUP mycontainer
## 傳送 SIGTERM
$ docker kill -s TERM mycontainer
5.3.4 容器自動終止
容器的生命週期與主程序繫結。主程序退出時,容器自動停止:
## 主程序是互動式 bash
$ docker run -it ubuntu bash
root@abc123:/# exit # 退出 bash → 容器停止
## 主程序執行完畢
$ docker run ubuntu echo "Hello" # echo 執行完 → 容器停止
5.3.5 檢視已停止的容器
$ docker ps -a
CONTAINER ID IMAGE COMMAND STATUS NAMES
ba267838cc1b ubuntu "/bin/bash" Exited (0) 2 minutes ago myubuntu
c5d3a5e8f7b2 nginx "nginx" Up 5 minutes mynginx
STATUS 欄位說明:
| 狀態 | 說明 |
|---|---|
Up X minutes |
執行中 |
Exited (0) |
正常退出 (退出碼 0) |
Exited (1) |
異常退出 (非零退出碼) |
Exited (137) |
被 SIGKILL 終止 (128 + 9) |
Exited (143) |
被 SIGTERM 終止 (128 + 15) |
5.3.6 重新啟動容器
啟動已停止的容器
$ docker start 容器名或ID
## 啟動並附加終端
$ docker start -ai 容器名
重啟執行中的容器
## 先停止再啟動
$ docker restart 容器名
## 自定義停止超時
$ docker restart -t 30 容器名
5.3.7 生命週期狀態圖
stateDiagram-v2
direction TB
[*] --> Created : docker create
Created --> Running : docker start
Running --> Stopped : docker stop
Running --> Paused : docker pause
Paused --> Running : docker unpause
Created --> Deleted : docker rm
Stopped --> Deleted : docker rm
Paused --> Deleted : docker rm
Deleted --> [*]
5.3.8 批次操作
停止所有容器
$ docker stop $(docker ps -q)
刪除所有已停止的容器
$ docker container prune
停止並刪除所有容器
$ docker stop $(docker ps -q) && docker container prune -f
5.3.9 常見問題
Q:容器停止很慢
原因:應用沒有正確處理 SIGTERM 訊號,需要等待超時後強制終止。
解決方案:
- 在應用中正確處理 SIGTERM
- 使用
docker stop -t 0立即終止 - 檢查 Dockerfile 中的
STOPSIGNAL設定
Q:如何讓容器優雅退出
確保容器主程序正確處理訊號:
## Dockerfile 範例
FROM node:22-alpine
...
## 使用 exec 形式確保訊號能傳遞給 node 程序
CMD ["node", "server.js"]
版本說明:範例使用
node:22-alpine,這是一個精簡的 Node.js 22 版本映象。可根據需求替換為其他版本(如node:24-alpine、node:latest)。
Q:容器無法停止
## 強制終止
$ docker kill 容器名
## 如果仍無法停止,檢查系統資源
$ docker inspect 容器名