亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Web服務器 > 正文

docker容器如何優雅的終止詳解

2024-09-01 13:48:56
字體:
來源:轉載
供稿:網友

前言

在Docker大行其道的今天,我們能夠非常方便的使用容器打包我們的應用程序,并且將它在我們的服務器上部署并運行起來。但是,談論到如何停掉運行中的docker容器并正確的終止其中的程序,這就成為一個非常值得討論的話題了。

事實上,在我們日常的項目當中,這是我們經常需要面對和處理的問題:

     場景A:假如我們打包在容器中的程序,提供HTTP方式的服務,負責處理各種HTTP requests并返回結果,我們必然希望在容器被停掉的時候,能夠讓程序有時間把已經在處理中的請求繼續處理完畢,并返回結果給客戶端。

     場景B:又比如我們打包在容器中的程序,負責寫入數據到某個數據文件中,我們希望程序能夠在容器被停掉的時候,有時間把內存中緩存的數據持久化到存儲設備中,以防數據丟失。

     場景C:再比如現在流行的微服務架構中,一般會有服務發現的機制,也即每一個微服務在啟動之后,都會主動把自己的地址信息注冊到服務發現模塊當中,讓其他的服務可以知道自己的存在。而在容器被停掉的時候,微服務需要即時從服務發現模塊中注銷自己,以防止從API Gateway而來的請求被錯誤的路由到了已經被停止掉的微服務。

如上的各種場景中,都要求打包在容器中的應用程序能夠被優雅的終止(也即gracefully shutdown),這種gracefully shutdown的方式,允許程序在容器被停止的時候,有一定時間做一些后續處理操作,這也是我們需要進一步探討的話題。

docker stop 與 docker kill 的區別

Docker本身提供了兩種終止容器運行的方式,即docker stopdocker kill。

docker stop

先來說說docker stop吧,當我們用docker stop命令來停掉容器的時候,docker默認會允許容器中的應用程序有10秒的時間用以終止運行。所以我們查看docker stop命令幫助的時候,會有如下的提示:

→ docker stop --helpUsage: docker stop [OPTIONS] CONTAINER [CONTAINER...]Stop one or more running containersOptions:  --help  Print usage -t, --time int Seconds to wait for stop before killing it (default 10)

docker stop命令執行的時候,會先向容器中PID為1的進程發送系統信號SIGTERM,然后等待容器中的應用程序終止執行,如果等待時間達到設定的超時時間,或者默認的10秒,會繼續發送SIGKILL的系統信號強行kill掉進程。在容器中的應用程序,可以選擇忽略和不處理SIGTERM信號,不過一旦達到超時時間,程序就會被系統強行kill掉,因為SIGKILL信號是直接發往系統內核的,應用程序沒有機會去處理它。在使用docker stop命令的時候,我們唯一能控制的是超時時間,比如設置為20秒超時:

docker stop --time=20 container_name

docker kill

接著我們來看看docker kill命令,默認情況下,docker kill命令不會給容器中的應用程序有任何gracefully shutdown的機會。它會直接發出SIGKILL的系統信號,以強行終止容器中程序的運行。通過查看docker kill命令的幫助,我們可以看到,除了默認發送SIGKILL信號外,還允許我們發送一些自定義的系統信號:

→ docker kill --helpUsage: docker kill [OPTIONS] CONTAINER [CONTAINER...]Kill one or more running containersOptions:  --help   Print usage -s, --signal string Signal to send to the container (default "KILL")

比如,如果我們想向docker中的程序發送SIGINT信號,我們可以這樣來實現:

docker kill --signal=SIGINT container_name

與docker stop命令不一樣的地方在于,docker kill沒有任何的超時時間設置,它會直接發送SIGKILL信號,以及用戶通過signal參數指定的其他信號。

其實不難看出,docker stop命令,更類似于Linux系統中的kill命令,二者都是發送系統信號SIGTERM。而docker kill命令,更像是Linux系統中的kill -9或者是kill -SIGKILL命令,用來發送SIGKILL信號,強行終止進程。

在程序中接收并處理信號

了解了docker stopdocker kill的區別,我們能夠知道,docker kill適合用來強行終止程序并實現快速停止容器。而如果希望程序能夠gracefully shutdown的話,docker stop才是不二之選。這樣,我們可以讓程序在接收到SIGTERM信號后,有一定的時間處理、保存程序執行現場,優雅的退出程序。

接下來我們可以寫一個簡單的Go程序來實現信號的接收與處理,程序在啟動過后,會一直阻塞并監聽系統信號,直到監測到對應的系統信號后,輸出控制臺并退出執行。

// main.gopackage mainimport ( "fmt" "os" "os/signal" "syscall")func main() { fmt.Println("Program started...") ch := make(chan os.Signal, 1) signal.Notify(ch, syscall.SIGTERM) s := <-ch if s == syscall.SIGTERM { fmt.Println("SIGTERM received!") //Do something... } fmt.Println("Exiting...")}

接下來使用交叉編譯的方式來編譯程序,讓程序可以在Linux下運行:

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o graceful

編譯好之后,我們還需要打包程序到容器中運行。于是,我們還得有個Dockerfile。在這里,我們選擇使用體積小又輕盈的alpine鏡像作為基礎鏡像,打包這個Go程序:

from alpine:latestMAINTAINER TimothyADD graceful /gracefulCMD ["/graceful"]

這里需要避開的一個坑,是Dockerfile中CMD命令的用法。

CMD命令有兩種方式:

CMD /graceful

使用 CMD command param1 param2 這種方式,其實是以shell的方式運行程序。最終程序被執行時,類似于/bin/sh -c的方式運行了我們的程序,這樣會導致/bin/sh以PID為1的進程運行,而我們的程序只不過是它fork/execs出來的子進程而已。前面我們提到過docker stop的SIGTERM信號只是發送給容器中PID為1的進程,而這樣,我們的程序就沒法接收和處理到信號了。

CMD [“/graceful”]

使用 CMD [“executable”,”param1”,”param2”] 這種方式啟動程序,才是我們想要的,這種方式執行和啟動時,我們的程序會被直接啟動執行,而不是以shell的方式,這樣我們的程序就能以PID=1的方式開始執行了。

話題轉回來,我們開始執行容器構建操作,打包程序:

docker build -t registry.xiaozhou.net/graceful:latest .

打包過后的鏡像,才6MB左右:

λ Timothy [workspace/src/graceful] → docker imagesREPOSITORY            TAG     IMAGE ID   CREATED    SIZEregistry.xiaozhou.net/graceful       latest    b2210a85ca55  20 hours ago  6.484 MB

啟動并運行容器:

λ Timothy [workspace/src/graceful] → docker run -d --name graceful b2210a85

查看容器運行狀態:

λ Timothy [workspace/src/graceful] → docker ps -aCONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMESfd18eedafd16  b221    "/graceful"   3 seconds ago  Up 2 seconds       graceful

查看容器輸出,能看到程序已經正常啟動:

λ Timothy [workspace/src/graceful] → docker logs gracefulStarted...

接著我們要使用docker stop大法,看程序能否響應SIGTERM信號:

λ Timothy [workspace/src/graceful] → docker stop gracefulgraceful

最后,查看容器的日志,檢驗輸出:

λ Timothy [workspace/src/graceful] → docker logs gracefulStarted...SIGTERM received!Exiting...

總結

以上就是這篇文章的全部內容了,用docker kill命令,可以簡單粗暴的終止docker容器中運行的程序,但是想要優雅的終止掉的話,我們需要使用docker stop命令,并且在程序中多花一些功夫來處理系統信號,這樣能保證程序不被粗暴的終止掉,從而實現gracefully shutdown。希望本文的內容對大家的學習或者工作能有所幫助,如果有疑問大家可以留言交流。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久精品99久久香蕉国产色戒| 欧美亚洲一级片| 中文字幕日韩av电影| 中文字幕日本欧美| 91av中文字幕| 91精品久久久久久久久不口人| 97国产真实伦对白精彩视频8| 奇米影视亚洲狠狠色| 欧美性猛交xxxx免费看久久久| 国产偷亚洲偷欧美偷精品| 欧洲美女7788成人免费视频| 亚洲免费电影在线观看| 97在线看免费观看视频在线观看| 久久久人成影片一区二区三区| 国产婷婷97碰碰久久人人蜜臀| 日韩电影在线观看永久视频免费网站| 欧美日韩精品中文字幕| 国产69精品久久久久9999| 亚洲精品不卡在线| 欧美精品九九久久| 伊人伊人伊人久久| 在线亚洲午夜片av大片| 国产日韩欧美黄色| 免费成人高清视频| 黑人精品xxx一区一二区| 中文字幕日韩av电影| 亚洲国产91色在线| 亚洲视频axxx| 美女久久久久久久久久久| 国产97在线亚洲| 91九色视频导航| 羞羞色国产精品| 美女少妇精品视频| 久久777国产线看观看精品| 亚洲字幕一区二区| 成人av在线网址| 久久久久久成人精品| 久久久噜噜噜久噜久久| 国语自产精品视频在线看| 日韩成人免费视频| 亚洲一区二区自拍| 日韩在线观看成人| 国产精品第一视频| 日韩精品在线电影| 国产精品网站大全| 欧美性猛交xxxx乱大交极品| 欧美一区二区视频97| 日韩av电影手机在线观看| 欧美巨猛xxxx猛交黑人97人| 操91在线视频| 色一区av在线| 欧美在线欧美在线| 日韩一区av在线| 国产在线观看一区二区三区| 96国产粉嫩美女| 国产成人精品日本亚洲专区61| 久久国产精品电影| 亚洲小视频在线观看| 中文字幕久精品免费视频| 日韩电影在线观看中文字幕| 日韩视频―中文字幕| www.亚洲男人天堂| 亚洲精品日韩久久久| 亚洲激情视频网| 日韩av在线一区二区| 欧美日韩成人在线观看| 亚洲xxxx在线| 久久亚洲私人国产精品va| 久久久久久午夜| 136fldh精品导航福利| 日韩电影免费在线观看中文字幕| 亚洲女人天堂av| 综合136福利视频在线| 欧美性受xxxx白人性爽| 亚洲国模精品一区| 亚洲美女性视频| 日韩h在线观看| 国产亚洲视频在线| 国产成人精品视频在线| 精品国产成人在线| 日韩亚洲成人av在线| 日韩电影在线观看免费| 欧美日韩国产黄| 国产精品久久久久久av福利| 久久久国产视频91| 亚洲激情免费观看| 精品亚洲国产视频| 亚洲国产成人久久综合| 国产精品高潮呻吟视频| 欧美日韩国产区| 欧美日韩精品中文字幕| 4k岛国日韩精品**专区| 亚洲美女在线看| 欧美成人免费观看| 久久这里只有精品视频首页| 国产一区二区三区久久精品| 97久久超碰福利国产精品…| 亚洲成人激情在线观看| 久热精品视频在线观看一区| 欧美巨猛xxxx猛交黑人97人| 日韩免费观看网站| 91精品国产电影| 91免费看片网站| 性色av一区二区三区在线观看| 欧美极品少妇xxxxx| 中文字幕在线视频日韩| 亚洲激情电影中文字幕| 一区二区三欧美| 国产精品劲爆视频| 亚洲美女动态图120秒| 国产精品久久婷婷六月丁香| 精品色蜜蜜精品视频在线观看| 91九色视频导航| 一区二区国产精品视频| 久久久999精品免费| 国产精品久久色| 欧美激情网站在线观看| 久久97久久97精品免视看| 青草成人免费视频| 97久久精品视频| 亚洲第一二三四五区| 欧美黑人性视频| 亚洲欧美日韩国产中文专区| 久久久人成影片一区二区三区观看| 久久久久国产精品免费| 亚洲欧美精品一区二区| 一区二区三区四区在线观看视频| 亚洲人成网站色ww在线| 久久久人成影片一区二区三区| 欧美精品在线极品| 亚洲国产精品久久久久秋霞蜜臀| 亚洲欧洲av一区二区| 久久视频国产精品免费视频在线| 欧美第一黄网免费网站| 国产一区二区三区在线播放免费观看| 欧美网站在线观看| 精品国产拍在线观看| 中文字幕亚洲国产| 日韩成人中文电影| 欧美超级免费视 在线| 欧美电影院免费观看| 久久久亚洲欧洲日产国码aⅴ| 国产成人一区三区| 亚洲久久久久久久久久| 欧美激情a∨在线视频播放| 欧美性生交xxxxxdddd| 欧美性xxxx极品hd欧美风情| 欧美激情手机在线视频| 亚洲www在线观看| 国产欧美日韩综合精品| 亚洲男人天堂网| 国产精品对白刺激| 亚洲第一精品电影| 成人性生交大片免费看小说| 欧美另类高清videos| 亚洲第一区在线观看| 欧美日韩中国免费专区在线看| 欧美精品videos| 亚洲人成电影网站| 尤物九九久久国产精品的分类| 亚洲精品www久久久久久广东| 91wwwcom在线观看| 欧美精品videossex性护士| 国产精品久久久久久久app|