Docker run参考(2) – Detached vs foreground模式

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

  1. -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服务。

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

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

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

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

Foreground

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

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

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

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

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

  1. $ echo test | docker run -i busybox cat

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

标签:Docker 发布于:2019-11-19 19:37:45