将容器作为服务运行
在之前的命令行运行docker,默认是在前台运行。不过,实际上Docker作为容器运行,通常是作为服务在后台运行。
参数 -d
提供了 docker run
命令后台运行的能力,并且可以使用容器管理相关的开关参数。
使用 -d
参数运行容器:
docker run -d -i -p 1234:1234 --name daemon ubuntu:14.04 nc -l 1234
参数说明
|
结合 |
|
交互模式,可以通过telnet会话和容器交互 |
|
从容器发布1234端口到host主机 |
|
容器命名为 |
最后的两个参数
ubuntu:14.04
使用用的镜像名称nc -l 1234
表示最后运行在容器内部的命令,这里是提供了一个nc
监听在端口1234
可以实现echo调试。
上述docker容器运行在后台,通过 docker ps
命令可以看到运行中的容器:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25ca718c317b ubuntu:14.04 "nc -l 1234" 18 seconds ago Up 16 seconds 0.0.0.0:1234->1234/tcp daemon
现在我们可以通过 telnet
命令来验证(192.168.64.3是运行docker的host主机IP):
telnet 192.168.64.3 1234
交互过程如下:
$ telnet 192.168.64.3 1234
Trying 192.168.64.3...
Connected to 192.168.64.3.
Escape character is '^]'.
helo daemon <--这里输入字符串
^] <--这里按下ctrl-[表示退出telnet会话
telnet> q <-这里按下q退出telnet程序
Connection closed.
备注
上述telnet交互会话退出以后,服务端的 nc -l 1234
也会结束,所以,此时再次使用 docker ps
检查可以看到容器 daemon
已经中止了。
容器的日志会记录 nc -l 1234
命令的输出,所以使用以下命令可以查看容器输出:
docker logs daemon
得到的日志内容如下:
hello daemon
自动重启容器策略
docker run
有一个 --restart
参数,可以设置容器中止时候的策略
策略 |
描述 |
---|---|
no |
容器退出时不重启 |
always |
容器退出时总是重启 |
unless-stopped |
总是重启,但是记住明确的停止 |
on-failure[:max-retry] |
只有故障时重启 |
最简单的是 no
策略:当容器退出是,并不会重启。这也是默认策略。
always
策略也简单,就是直接重启:
docker run -d --restart=always ubuntu:14.04 echo done
此时通过 docker ps
检查可以看到容器在不断重启:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3ffaf6484a53 ubuntu:14.04 "echo done" 37 seconds ago Restarting (0) 8 seconds ago vigorous_bhaskara
备注
在上述 docker ps
检查中可以看到 STATUS
状态返回的值是 0
,这表明运行成功。并且,每次容器重启,容器的名字不会变化。
unless-stopped
和 always
策略差不多,但是会记住daemon重启过(例如你重启了主机),这种情况下就不会自动重启容器。与此相反, always
策略会会在主机重启之后,自动把容器拉起。这对于一些服务来说可能是必要的策略。
on-failure
策略则是特别的,只在容器返回了一个非0的值(通常意味着失败)才会重启容器:
docker run -d --restart=on-failure:10 ubuntu:14.04 /bin/false
备注
将服务放到后台运行时,通常不能很直观发现服务是否crash,这给运维工作带来了要求。通常需要配合服务监控、日志输出及分析来确保服务可控运维。