Linux入门教程:Docker run参考(2) – Detached vs foreground模式,docker是这样设


当要启动一个docker容器时,首先必须决定是以detached模式在后台运行容器还是以默认的foreground模式运行:

-d=false: Detached mode: Run container in the background, print new container id

Detached (-d)

要在detached模式启动一个容器,必须使用-d=true或仅-d选项。docker是这样设计的,当运行在容器的根进程退出时,以detached模式启动的容器也退出。以detached模式运行的容器当它停止时无法自动删除,因此–rm选项和-d选项不能一起使用。
不要传递一个service x start命令到deatched的容器。例如,下面的命令是尝试启动nginx服务。

$ docker run -d -p 80:80 my_image service nginx start

这个命令会成功启动nginx服务。不过在detached的容器会失败。根进程service nginx start启动后立即返回,导致detached容器按照设计停止。因此,nginx服务虽然启动了,不过无法使用。所以要按如下命令启动nginx服务:

$ docker run -d -p 80:80 my_image nginx -g 'daemon off;'

要对一个detached容器输入/输出,使用网络连接或共享数据卷。
要重新附着到一个detached容器,使用docker attach命令。

Foreground

在forgroud模式[当-d不指定时],docker run能够在容器启动进程并附着控制台到进程的标准输入,输出和标准错误。它甚至可以伪装为一个TTY(这是大多数命令行可执行程序所需要的)并传递信号。有配置的选项有:

-a=[]           : Attach to `STDIN`, `STDOUT` and/or `STDERR` -t              : Allocate a pseudo-tty --sig-proxy=true: Proxy all received signals to the process (non-TTY mode only) -i              : Keep STDIN open even if not attached

如果你没有指定-a,那么docker将附着所有标准流。可以从三个标准流(STDIN, STDOUT, STDERR)指定你想连接的标准流。如:

$ docker run -a stdin -a stdout -i -t ubuntu /bin/bash

对于交互的进程[如shell],为了给容器进程分配一个tty,必须-i -t一起使用。-i -t经常写为-it。当客户端标准输出重定向或管道传递时,不能指定-t:

$ echo test | docker run -i busybox cat

Linux对运行在容器PID 1的进程特别对待:它会忽略任何信号的默认行为。所以,进程不会收到SIGINT或SIGTERM时停止,除非它要这么做。

相关内容