当前位置: > Linux服务器 > Docker >

Docker 容器初体验(3)

时间:2014-12-24 17:54来源:linux.cn 作者:IT



7 创建守护式容器

除了这些交互式运行的容器(interactive container),我们也可以创建长期运行的容器。守护式容器(daemonized container)没有交互式会话,非常适合运行应用程序和服务。大多数时候我们都需要以守护式来运行我们的容器。下面我们就来启动一个守护式容器,如代码清单3-16所示。

代码清单3-16 创建长期运行的容器


  1. $ sudo docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
  2. 1333bb1a66af402138485fe44a335b382c09a887aa9f95cb9725e309ce5b7db3

我们在上面的docker run命令使用了-d参数,因此Docker会将容器放到后台运行。

我们还在容器要运行的命令里使用了一个while循环,该循环会一直打印hello world,直到容器或其进程停止运行。

通过组合使用上面的这些参数,你可以发现docker run命令并没有像上一个容器一样将主机的控制台附着到新的shell会话上,而是仅仅返回了一个容器ID而已,我们还是在主机的命令行之中。如果我们执行docker ps命令,可以看到一个正在运行的容器,如代码清单3-17所示。

代码清单3-17 查看正在运行的daemon_dave容器


  1. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  2. 1333bb1a66af ubuntu:14.04 /bin/sh -c 'while tr 32 secs ago Up 27 daemon_dave

8 容器内部都在干些什么

现在我们已经有了一个在后台运行while循环的守护型容器。为了探究该容器内部都在干些什么,我们可以用docker logs命令来获取容器的日志,如代码清单3-18所示。

代码清单3-18 获取守护式容器的日志


  1. $ sudo docker logs daemon_dave
  2. hello world
  3. hello world
  4. hello world
  5. hello world
  6. hello world
  7. hello world
  8. hello world
  9. . . .

这里,我们可以看到while循环正在向日志里打印hello world。Docker会输出最后几条日志项并返回。我们也可以在命令后使用-f参数来监控Docker的日志,这与tail -f命令非常相似,如代码清单3-19所示。

代码清单3-19 跟踪守护式容器的日志


  1. $ sudo docker logs -f daemon_dave
  2. hello world
  3. hello world
  4. hello world
  5. hello world
  6. hello world
  7. hello world
  8. hello world
  9. . . .

{提示} 可以通过Ctrl+C退出日志跟踪。

我们也可以跟踪容器日志的某一片段,和之前类似,只需要在tail命令后加入-f --lines标志即可。例如,可以用docker logs --tail 10 daemon_dave获取日志的最后10行内容。另外,也可以用docker logs --tail 0 -f daemon_dave命令来跟踪某个容器的最新日志而不必读取整个日志文件。

为了让调试更简单,我们还可以使用-t标志为每条日志项加上时间戳,如代码清单3-20所示。

代码清单3-20 跟踪守护式容器的最新日志


  1. $ sudo docker logs -ft daemon_dave
  2. [May 10 13:06:17.934] hello world
  3. [May 10 13:06:18.935] hello world
  4. [May 10 13:06:19.937] hello world
  5. [May 10 13:06:20.939] hello world
  6. [May 10 13:06:21.942] hello world
  7. . . .

{提示} 同样,可以通过Ctr+C退出日志跟踪。

9 查看容器内的进程

除了容器的日志,我们也可以查看容器内部运行的进程。要做到这一点,要使用docker top命令,如代码清单3-21所示。

代码清单3-21 查看守护式容器的进程


  1. $ sudo docker top daemon_dave

该命令执行后,我们可以看到容器内的所有进程(主要还是我们的while循环)、运行进程的用户及进程ID,如代码清单3-22所示。

代码清单3-22 docker``top命令的输出结果


  1. PID USER COMMAND
  2. 977 root /bin/sh -c while true; do echo hello world; sleep 1; done
  3. 1123 root sleep 1

10 在容器内部运行进程

在Docker 1.3之后,我们也可以通过docker exec命令在容器内部额外启动新进程。可以在容器内运行的进程有两种类型:后台任务和交互式任务。后台任务在容器内运行且没有交互需求,而交互式任务则保持在前台运行。对于需要在容器内部打开shell的任务,交互式任务是很实用的。下面我们先来看一个后台任务的例子,如代码清单3-23所示。

代码清单3-23 在容器中运行后台任务


  1. $ sudo docker exec -d daemon_dave touch /etc/new_config_file

这里的-d标志表明需要运行一个后台进程,-d标志之后,指定的是要在内部执行这个命令的容器的名字以及要执行的命令。上面例子中的命令会在daemon_dave容器内创建了一个空文件,文件名为/etc/new_config_file。通过docker exec后台命令,我们可以在正在运行的容器中进行维护、监控及管理任务。

我们也可以在daemon_dave容器中启动一个诸如打开shell的交互式任务,如代码清单3-24所示。

代码清单3-24 在容器内运行交互命令


  1. $ sudo docker exec -t -i daemon_dave /bin/bashVersion:

和运行交互容器时一样,这里的-t和-i标志为我们执行的进程创建了TTY并捕捉STDIN。接着我们指定了要在内部执行这个命令的容器的名字以及要执行的命令。在上面的例子中,这条命令会在daemon_dave容器内创建一个新的bash会话,有了这个会话,我们就可以在该容器中运行其他命令了。

{注意} docker exec命令是Docker 1.3引入的,早期版本并不支持该命令。对于早期Docker版本,请参考第6章中介绍的nsenter命令。





(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容