Docker 日志驅動
首先,我們來簡單理解一下Docker日志驅動的概念,Docker日志驅動像是對某個容器對日志進行約束的行為。我們可以通過日志驅動來對某個容器的日志進行操作。通過在docker run命令的基礎上添加 --log-driver選項,就可以實現某個容器的Docker日志驅動功能。
首先,我們可以將某個容器輸出日志的信息重定向到系統日志中。示例如下:
$ sudo docker run --log-driver="syslog" --name 創建的容器名稱 -d 容器的鏡像 /bin/sh -c "while true;do echo hello world; sleep 1; done"
我們只需要在docker run 命令的基礎上添加 --log-driver="syslog" 參數,我們就可以將容器輸出的日志信息重定向到系統日志中。(請注意:實現這個功能需要有一個前提,我們需要安裝rsyslog服務來支持docker日志驅動。由於容器輸出的日志信息重定向到系統日志的文件為:/var/log/messages文件。要有這個文件的話,我們需要通過yum來安裝並啟動rsyslog服務才可以。否則,這個日志驅動是實現不了功能的。)
實現完上述的命令之后,我們發現原先查看docker日志信息的命令 docker logs 被禁用。並且大家執行完上述命令之后,可以去查看一下/var/log/messages文件,這個時候可以發現:容器一直都在此文件中輸出 hello world!!!(如果沒有的話,重啟一下docker宿主機就好了)
除了上述的日志驅動外,還有另外的一個可用選項是none,這個選項將會禁用當前創建容器中的日志,導致當前創建容器的docker logs 命令也會禁用。
$ sudo docker run --log-driver="none" --name 創建的容器名稱 -d 容器的鏡像 /bin/sh -c "while true;do echo hello world; sleep 1; done"
查看容器內部的進程
作為一名linux系統的管理者,我們的基本功就是要會查看當前主機的進程。但是,對於docker容器來說,我們應該怎樣查看某一個docker容器中的進程?話不多說,直接看下文。
$ sudo docker top 要查看進程的容器名稱
通過上述的命令我們就可以直接在某一個容器當中去查看它的進程。有沒有發現這條命令跟linux中的命令top相似呢?linux中的命令top是用來查看當前linux宿主機的進程。(相當於windows系統的任務管理器一樣!)
查看Docker統計信息
我們除了可以使用docker top 命令來查看容器內部運行的進程之外,還可以使用docker stats 命令來查看一個或多個容器的統計信息(請注意:這些統計信息是實時更新的!!!)。這些容器的統計信息是一張統計表。里面主要包含的信息如下:
$ sudo docker stats gao79138 gao79139 gao79140 --使用docker stats 命令來同時查看gao79138 gao79139 gao79140容器的統計信息。
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
23ceacdc4233 gao79138 0.00% 0B / 0B 0.00% 0B / 0B 0B / 0B 0
8a16f7ced68e gao79139 0.16% 3.844MiB / 7.766GiB 0.05% 8.93kB / 0B 0B / 0B 2
b00a7048fc5b gao79140 0.17% 3.664MiB / 7.766GiB 0.05% 8.86kB / 0B 0B / 0B 2
其中這些統計表的標題分別是: 容器ID 、容器名稱 、CPU占用率、內存使用量/總量、內存占用率、網絡IO(IO代表輸入輸出流)的性能指標、存儲IO的性能指標、以及各容器的PID號。
學會在容器內部額外運行一個新進程
我們之前學會了如何創建守護式容器,守護式容器的特點就是一直會在后台默默的運行命令,不提供交互功能。那么如果有一天我想把這個守護式容器在后台所運行的服務進行更改,這時我們應該怎么辦?總不能把這個守護式容器進行刪除后,在重新創建一個吧?所以,我們需要讓這個守護式容器再次具有交互功能。因此,若要讓守護式容器再次具有交互功能的話,我們就需要在這個守護式容器中再額外運行一個新進程來開啟一個shell終端。在這時,我們就可以使用docker為我們提供的docker exec 命令了。
首先,我們先讓名稱為gao79139的守護式容器來創建一個新的進程,之后用這個新的進程在gao79139的容器內部創建一個/etc/new_config_file文件。
sudo docker exec -d gao79139 touch /etc/new_config_file --其中后面的touch命令為這個新進程所運行的命令。
執行上述命令之后,gao79139的守護式容器就會創建了一個新的文件/etc/new_config_file。但是,由於gao79139為守護式容器,它是沒有提供交互功能的。這個時候我們應該如何證明gao79139的容器內部創建了/etc/new_config_file文件呢?這個時候,我們還是可以使用docker exec 命令在gao79139容器的內部再次開啟一個新進程。這個新進程就可以用來開啟一個shell終端。進而讓gao79139容器再次具有交互功能。命令如下:
$ sudo docker exec -t -i gao79139 /bin/bash
執行完上述命令之后,我們可以發現gao79139守護式容器再次具有了交互功能。這個時候,我們就可以在容器中隨意的輸入命令了。(代表可以在/etc/目錄下查看new_config_file文件)
停止守護式容器
當守護式容器正在運行時,我們應該如何停止守護式容器? 這個時候,我們就可以執行docker stop 命令了。
$ sudo docker stop 容器名稱/容器ID
除了docker stop 命令之外,我們還可以使用docker kill 命令來停止容器。並且,docker stop 和 docker kill 命令的區別為:docker stop 命令會向Docker容器進程發送SIGTERM信號。docker kill 命令發送的是SIGKILL信號。(可以理解為:docker kill命令更強大一些。關於這些信號的意思,請自行百度!)
當我們執行了上述的命令之后守護式容器會處於停止狀態。此時,如果我們想要查看已經停止的守護式容器,命令如下:
$ sudo docker ps
再次補充說明:如果我們想要查看最后x個容器(不論啟動與停止)的話,可以使用如下命令進行查看:
$ sudo docker ps -n x --x為查看容器的個數
自動重啟容器
如果說,容器正在運行時出現了某種錯誤而導致容器停止運行的話。在正常情況下來說,我們需要使用docker restart 命令來手動重啟容器。但是,1個容器還可以,要是10個,100個呢?這個時候,我們手動重啟容器的話是不是就很麻煩了呢?所以為了解決這種情況,docker提供了自動重啟容器的操作。也就是當容器處於停止運行的狀態(這個停止運行的狀態可能是由正常退出或因某種錯誤而退出導致的)時,我們可以自動的將停止運行的容器啟動起來。可以在docker run命令的基礎上,添加 --restart 參數來實現。
$ sudo docker run --restart=always --name 創建容器的名稱 -d 鏡像名稱 /bin/sh -c "while true; do echo hello world; sleep 1; done"
上述命令中的--restart=always 參數代表什么意思呢? 這個參數代表着無論容器是處於正常退出(代表通過exit命令來退出),還是異常退出。我們都將容器重新啟動起來。除了這個參數之外,我們還可以用 --restart=on-failure 參數來進行設置。這個參數代表容器處於異常退出時,將容器進行重新啟動。容器正常退出時,就不進行重新啟動。另外,on-failure參數還接受一個重啟的次數參數。(具體格式為:--restart=on-failure:count 其中,count代表重啟次數的個數)
$ sudo docker run --restart=on-failure --name 創建容器的名稱 -d 鏡像名稱 /bin/sh -c "while true; do echo hello world; sleep 1; done"
$ sudo docker run --restart=on-failure:重啟次數 --name 創建容器的名稱 -d 鏡像名稱 /bin/sh -c "while true; do echo hello world; sleep 1; done"
也就是說,當我為--restart=on-failure:Count 參數指定重啟的個數之后。當這個容器的退出代碼為非0(代表為異常退出)時,Docker會嘗試自動重啟該容器。最多重啟Count次。重啟Count次之后,哪怕這個容器的退出代碼為非0,也不會再進行重啟了。
深入容器
我們之前介紹過使用docker ps命令來獲取容器的信息。但是這些信息是比較常用的信息,並不是全部的信息。因此,如果我們想要查看更詳細的docker容器信息的話,可以使用docker inspect 命令來獲得更多的容器信息。代碼如下:
$ sudo docker inspect 容器名稱/ID
$ sudo docker inspect --format='{{ .State.Running }}' 容器名稱/ID
或
$ sudo docker inspect -f='{{ .State.Running }}' 容器名稱/ID
上述命令執行之后,會返回容器的運行狀態。(false/true) true 為該容器正在運行中。 false 為該容器已經處於停止狀態。
我們還可以去查看某容器的IP地址信息
$ sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' 容器名稱/ID
或
$ sudo docker inspect -f='{{ .NetworkSettings.IPAddress }}' 容器名稱/ID
上述命令執行之后,會返回該容器的IP地址。
我們在執行docker inspect 命令時,不單單可以指定一個容器,我們可以同時指定好幾個容器。具體的格式如下:
$ sudo docker inspect --format '{{.Name}} {{.State.Running}}' 要查看的容器名稱/ID(1) 要查看的容器名稱/ID(2) .....
執行上述的命令后,我們在屏幕上就會顯示多個容器的名稱和運行狀態信息。
我們可以在docker宿主機上通過瀏覽/var/lib/docker 目錄來深入了解Docker的工作原理。該目錄存放着Docker鏡像(image目錄)、容器(containers目錄)、容器的其它配置信息等。所有的容器都保存在docker宿主機中的/var/lib/docker/containers目錄下。
刪除容器
如果docker宿主機中,有些容器已經不再使用的話,我們就可以利用docker rm 命令來刪除容器。命令如下所示:
$ sudo docker rm 容器名稱/ID
執行上述命令后,容器將在docker宿主機中移除。
自Docker 1.6.2 版本開始,我們可以在 docker rm命令的基礎上添加-f參數來刪除正在運行的容器。在之前的版本中,我們必須先使用docker stop / docker kill 命令來停止容器之后,才能進行刪除容器的操作!
請注意:如果說我們想刪除docker宿主機中的所有容器(刪容器跑路操作~),目前docker是無法做到的(沒有這個命令)。但是,我們可以通過如下的操作,來一次性刪除所有的容器。話不多說,直接看示例:
$ sudo docker rm `sudo docker ps -a -q` --代表只能刪除已經停止的容器。
或
$ sudo docker rm -f `sudo docker ps -a -q` --當有正在運行的容器時,可以使用 docker rm -f 進行刪除。
首先,我們來解釋一下上述命令的參數:反引號代表將引號內部的命令先執行后返回給命令。(不懂的話,去學linux的shell語言) docker ps -a -q 代表只返回所有容器的ID信息。(docker ps -a 代表返回所有容器,docker ps -q 代表返回正在運行的容器ID信息)這樣的話,我們先通過反引號得到了所有容器的ID列表,並將這個列表返回給了外部的docker rm 命令中。這樣的話,docker rm 命令就會根據所有容器的ID列表來刪除docker宿主機中的所有容器。(這也是一種技巧吧~)