Docker停止容器使用stop、restart還是kill?

字節碼在跳舞 2024-04-14 11:31:16

docker kill立即強制停止容器

docker stop優雅地停止容器

docker restart先優雅停止容器,再啓動一個新的容器實例

docker kill與docker stop區別

Docker停止容器,是使用stop、kill還是restart?用戶通過docker stop或docker kill命令主動停止容器。前者發送 SIGTERM 信號讓容器優雅退出,後者發送 SIGKILL 信號強制立即退出。docker restart,命令包含了停止現有容器(類似于docker stop)和重新啓動新容器(類似于docker start)這兩個動作。今天來了解一下這三個命令。

使用以下命令可以創建一個後台運行的 Redis 容器,並將其公開到主機的 6379 端口,同時爲容器賦予名稱redis:

docker run -d -p 6379:6379 --name redis redis

在宿主機安裝redis-cli命令行客戶端工具。

1.docker kill立即強制停止容器

docker kill命令用于立即強制停止一個或多個正在運行的 Docker 容器。當您執行docker kill時,Docker 會向容器發送一個 SIGKILL 信號,這是一種不可被捕獲、阻塞或忽略的信號,導致容器內的主進程立即停止運行,不會給容器進程提供任何清理或保存狀態的機會。因此,docker kill是一種非常直接且不優雅的停止方式,適用于需要立即終止容器且不關心容器內部狀態的情況。SIGKILL是什麽,如果你使用過Linux命令kill -9 [pid],SIGKILL編號即爲9。

使用示例:

首先,使用命令docker wait redis監聽redis退出狀態碼。打開另一個終端運行如下命令:

➜  ~  docker kill redisredis

➜  ~ docker wait redis137

運行docker wait redis命令窗口,輸出狀態碼137。狀態碼137通常表示進程接收到SIGKILL信號而被強制終止。這意味著名爲Redis的容器是因爲接收到SIGKILL信號而被強制終止的。

docker kill同時可以強制停止多個容器:

docker kill container1 container2 container3 ...

2.docker stop優雅地停止容器

docker stop命令用于優雅地停止一個或多個正在運行的 Docker 容器。當您執行docker stop時,Docker 會向容器發送一個 SIGTERM 信號,這是進程的標准終止信號。容器內的主進程接收到 SIGTERM 後,通常會觸發清理操作,如保存當前狀態、關閉網絡連接、釋放資源等,並在完成這些操作後自行退出。默認情況下,Docker 會給容器預留10秒的時間來優雅地關閉。如果容器在這段時間內沒有自行退出,Docker 會發送一個 SIGKILL 信號強制終止容器。希望容器在停止前有機會進行必要的清理和狀態保存工作,尤其是當容器內運行的服務支持優雅關閉時。應使用docker stop

使用示例:

➜  ~ docker stop redis137

docker stop同時可以停止多個容器:

docker stop container1 container2 container3 ...

3.docker restart先優雅停止容器,再啓動一個新的容器實例

docker restart命令用于重啓一個或多個已停止的 Docker 容器。執行此命令時,Docker 首先會發送 SIGTERM 信號,等待容器優雅地停止。一旦容器停止,Docker 立即啓動一個新的容器實例,使用相同的配置和鏡像。這意味著容器內的狀態在重啓過程中不會保留。需要重啓容器以恢複服務或應用新的配置。

使用示例:

➜  ~ docker restart redisredis

docker restart同時可以重啓多個容器:

docker restart container1 container2 container3

4.docker stop與docker kill區別

docker stop會向容器發送一個SIGTERM,等待容器保存狀態,優雅退出。

docker kill會向容器發送一個SIGKILL。同Linux的kill -9。

Redis容器運行命令docker stop的例子:

➜  ~ docker start redisredis➜  ~ redis-cli127.0.0.1:6379> set hello abcOK127.0.0.1:6379> exit➜  ~ docker stop redisredis➜  ~ docker start redisredis➜  ~ redis-cli127.0.0.1:6379> get hello"abc"127.0.0.1:6379> exit

第一步,首先,啓動剛kill掉的redis容器,接著連接redis-cli,輸入命令set hello abc,設置一個key爲hello,value爲abc。使用exit退出redis-cli。最後使用exit斷開redis-cli連接。

第二步,使用命令docker stop redis停止容器,接著使用命令docker start redis啓動容器。

第三步,再次連接redis-cli,輸入命令get hello,輸出abc。最後使用exit斷開redis-cli連接。

結果,在Redis中,我們有一個key爲hello,值爲abc。

Redis容器行命令docker kill的例子:

➜  ~ docker start redisredis➜  ~ redis-cli127.0.0.1:6379> set hello 123OK127.0.0.1:6379> get hello"123"127.0.0.1:6379> exit➜  ~ docker kill redisredis➜  ~ docker start  redisredis➜  ~ redis-cli127.0.0.1:6379> get hello"abc"127.0.0.1:6379> exit

第一步,首先,啓動Redis容器。連接redis-cli,輸入命令get hello,輸出key爲hello的值爲abc。接著輸入命令set hello abc更改key爲hello值value爲123。使用exit退出redis-cli。

第二步,使用命令docker kill redis停止容器,接著使用命令docker start redis啓動容器。

第三步,再次連接redis-cli,輸入命令get hello,輸出abc。最後使用exit斷開redis-cli連接。

可以看出,我們已經變更過key爲hello的值爲123,但提高kill結束容器,沒有等待Redis把數據持久化到磁盤就推退出了。值還是abc,爲剛docker stop示例中的結果。

而使用docker stop停止的容器會優雅退出。Redis會把數據持久化到磁盤。

docker restart與docker stop效果一致。

在管理Redis這類需要數據持久化的容器時,推薦使用docker stop以確保數據的完整性。若需立即終止且不關心數據丟失,可使用docker kill。docker restart適用于需要重啓服務以應用新配置或恢複服務的情況,其效果與先執行docker stop再docker start相同。

忍不住要加個關注!不是我吹,但你會後悔沒關注的!

0 阅读:23

字節碼在跳舞

簡介:分享學習筆記、知識。