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宿主机中的所有容器。(这也是一种技巧吧~)