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相同。
忍不住要加個關注!不是我吹,但你會後悔沒關注的!