1. 程式人生 > >【Docker學習總結】6.Docker守護式容器

【Docker學習總結】6.Docker守護式容器

上一篇總結,我們學習瞭如何執行一個“互動式”的容器,這些容器在命令互動之後就會停止。但是,在大多數情況下,我們需要一個能夠長期執行的容器來提供服務,這就是Docker的“守護式”程序。即我們可以使用守護方式來執行容器,使得容器可以在後臺一直保持執行狀態。

守護式程序的特點是:
(1)能夠長期執行
(2)沒有互動式會話
(3)適合執行應用程式和服務

一、執行守護式容器

那麼,如何使用守護的形式來執行我們的容器呢?有兩種方式進行守護式程序的執行:
●以命令方式執行守護式程序
●以引數設定方式執行守護式程序

(1)命令方式
首先我們使用run命令+bash會執行容器並進入容器的互動控制檯:

docker run -i -t IMAGE /bin/bash

此時我們使用Ctrl+PCtrl+Q的方式退出容器的控制檯,此時容器就會在後臺執行。
測試:
首先我們啟動一個互動式容器,然後並不使用exit命令來退出,而是使用Ctrl+P或Ctrl+Q的方式退出容器,然後使用docker ps來檢視,發現容器依然在後臺執行中:

那麼我們如何再次進入已經退出的容器呢?這就需要docker的attach命令,附加到容器:
docker attach 容器名(CONTAINER ID或NAME)
我們是使用attach命令進入剛剛轉入到後臺執行的容器:

退出時我們繼續使用Ctrl+P或Ctrl+Q的方式退出容器,容器依然會執行在後臺,而直接使用exit命令,此時容器就會直接停止。

(2)引數設定方式
在使用run方式執行docker容器時,新增“-d”引數,表示在啟動容器時,使用後臺的方式來執行命令:

docker run -d 容器名(CONTAINER ID或NAME) [COMMAND][ARG...]

PS:“[COMMAND][ARG...]”代表需要執行的命令和引數
我們下面指定一個執行迴圈函式的容器:

這裡我們為容器定義了一個name,然後在容器啟動時使用一個shell指令碼,來寫一個迴圈,不停的列印“hello world”字元,中間間隔一秒,並且永遠不停止。這裡使用死迴圈的目的,是希望這個容器在執行命令時,一直在後臺存留而不退出。因為“-d”引數實際上只是以後臺的形式來執行命令,而在命令結束後,容器依舊會停止。
執行容器後,可以看到返回了一串字元:


該字串是docker守護程序分配給這個容器的唯一ID。
我們使用ps命令檢視正在執行的容器:

發現我們的容器正在執行中。

二、檢視容器執行日誌

那麼,我們如何瞭解容器內部執行的情況呢?我們可以使用docker的“logs”命令來檢視:

docker logs -f -t --tail 容器名(CONTAINER ID或NAME)

其中-f 為--follows,值為true或false,預設為false。該引數告訴logs命令。要一直跟蹤日誌的變化,並返回結果。
其中-t 為--timestamps,值為true或false,預設為false。該引數告訴logs命令,在返回的結果上加上時間戳。
其中--tail 為“all”。該引數指定返回結尾處多少行的日誌,和Linux的tail一樣。不指定的話,logs會返回所有的日誌。

我們使用logs命令來檢視剛剛守護式程序中命令執行的情況:

這裡我們使用-f -t指定動態跟蹤日誌,並加上時間戳,使用--tail 10列印最新的10行。如果tail引數後面設定為0,則永遠返回最新的一行。

三、檢視容器中的程序

除了使用logs命令來檢視容器的執行情況,我們也使用“top”命令,來檢視一個執行中的容器的程序:

docker top 容器名(CONTAINER ID或NAME)

這裡我們通過ps檢視哪些容器正在執行,使用top來檢視執行中容器的程序:

四、在執行的容器中啟動新程序

雖然docker的理念是一個容器執行一種服務,我們仍舊需要在docker中執行多個程序。例如,我們需要對執行中的容器進行維護、監控,或者執行一些管理任務。
docker的exec命令(即execute),就是用來在已經執行的docker容器中啟動新的程序:

docker exec -d -i -t 容器名(CONTAINER ID或NAME) [COMMAND][ARG...]

PS:“[COMMAND][ARG...]”代表需要執行的命令和引數
在這裡,我們執行docker的exec命令,在正在執行中的“docker_test_d”容器中,啟動一個新的bash會話:

然後我們使用Ctrl+P或Ctrl+Q的方式退出容器,使用top命令檢視“docker_test_d”容器的程序:

可以發現新的bash程序在“docker_test_d”容器中啟動成功。

五、如何停止守護式容器

docker提供兩種命令來停止docker守護式容器,分別是“stop”和“kill”:

docker stop 容器名
docker kill 容器名

這兩個命令稍微有點不一樣。“stop”命令,是傳送一個指定到容器,等待容器的停止。而“kill”命令,會直接停止容器。
我們使用ps檢視目前正在執行的容器,發現只有“docker_test_d”容器:

然後使用“stop”命令停止目前在系統中執行的“docker_test_d”容器:

可以看到,使用“stop”命令時需要等待一段時間,因為會給執行中的容器發出停止的訊號,等待容器停止後,命令會返回容器的名字。檢視ps就檢視不到執行的容器了。
使用kill停止容器的話,會立刻殺死容器程序。

六、總結

本篇總結學習的知識點:
(1)使用Ctrl+P或Ctrl+Q的方式將一個互動式的容器轉到後臺執行。
(2)docker run -d,啟動一個守護式容器
(3)docker logs,檢視容器日誌
(4)docker top,檢視執行中容器的程序
(5)docker exec,為執行中的容器啟動一個新的程序
(6)docker stop/kill,停止一個執行中的容器

更多命令的介紹,可以檢視docker自帶的使用手冊,使用“man”命令,來檢視各種命令的詳細介紹,例如:
man docker-run
man docker-logs
man docker-top
man docker-exec 
...
例如我們執行“man docker-run”來檢視run命令的詳細介紹:

下一篇我們將學習如何使用已經學習到的docker命令,來搭建一個web服務。

參考資料:
《極客學院Docker學習》教學視訊

轉載請註明出處:https://blog.csdn.net/acmman/article/details/83927649