Docker实践(2) – 以守护进程运行容器

当你逐渐了解docker后,你会开始考虑docker的其它用例,第一个首先是运行服务一样运行docker。

问题

你想作为一个服务在后台运行docker.

方法

docker run命令使用-d参数,和使用与容器管理相关的参数来定义服务特性。

讨论

Docker容器 – 像大多数进程 – 默认在前台运行。在后台运行docker容器最常见的方式是使用&控制操作符。即使这个可行,不过当你的日志输出到终端会话时可能会遇到麻烦,或者你使用nohup命令,它会当前目录创建一个日志输出文件,不过增加了一个日志管理的问题。而docker提供有在后台运行的功能,如:

  1. $ docker run -d -i -p 1234:1234 --name daemon ubuntu nc -l 1234

当docker run命令使用-d参数时,docker会以守护进程运行。-i参数使你能够与Telnet会话交互。-p参数使容器的1234端口绑定到主机。–name参数设置容器一个名称方便以后引用。最后,运行了一个监听在1234端口的echo服务器。
如果你现在连接并使用telnet发送消息,你使用docker logs命令会看到容器已经接收到消息,如图:

你看到以守护进程运行容器足够简单,但操作上仍有一些问题需要回答:
* 服务失败时会怎样?
* 服务终止时会怎样?
* 如果服务持续故障会怎样?
幸运地是docker为每个问题提供了参数!

虽然restart参数经常与-d参数一起使用,但技术上来说这不是必要的。

docker run –restart命令允许容器终止时应用一系列的规则(也称重启策略)。
重启策略可选值:
no – 容器退出时不重启
always – 容器退出时始终重启
on-failure[:max-retry] – 只在发生错误时重启
no策略很简单:当容器退出时,不重启容器。这个是默认值。
always也同样简单,不过值得简单介绍下:

  1. $ docker run -d --restart=always ubuntu echo done

此命令以守护进程运行容器,并在进程终止时始终重启容器(–restart=always)。执行了一个快速完成的echo命令,然后退出容器。
如果你执行以上命令然后执行docker ps命令,会看到类似的输出:

注意STATUS列告诉我们容器少于一秒前退出,正在重启。这是因为echo done命令立即退出了,docker就必须持续地重启容器。
最后on-failure策略只在容器以非0(非正常失败)状态码退出时重启:

  1. $ docker run -d --restart=on-failure:10 ubuntu /bin/false

此命令以守护进程运行(-d)和对尝试重启设置一个限制值(–restart=on-failure:10),超过此次数时不再重启。它运行一个简单的命令(/bin/false),会快速完成且肯定会失败。
如果你执行以上命令,等一分钟后执行docker ps -a,你会看到类似的输出:

标签:Docker容器 发布于:2019-11-21 00:38:30