浅析Docker容器的两种运行模式及 docker run 的 --rm 参数的作用及与 docker rm 的区别

一、docker run 的 --rm 选项的作用

  Docker容器进程有两种运行模式。

1、前台模式(默认)  ——  foreground 容器

docker run ...
//
docker run -d=false ...

  注意,只有在前台模式下,才有必要设置-it命令选项,为容器设置伪TTY

2、后台模式(也称detached模式)

docker run -d ...
//
docker run -d=true ...

  注意,只要有-d命令选项,就没有-it命令选项。

  当我们启动一个container时,首先需要确定这个container是运行在前台模式还是运行在后台模式。

(1)Detached (-d)

  如果在 docker run 后面追加 -d=true 或者 -d,则containter将会运行在后台模式(Detached mode)。此时所有I/O数据只能通过网络资源或者共享卷组来进行交互。因为container不再监听你执行docker run的这个终端命令行窗口。但你可以通过执行docker attach 来重新挂载这个container里面。

  需要注意的是,如果你选择执行-d使container进入后台模式,那么将无法配合"--rm"参数。

(2)Foregroud

  如果在docker run后面没有追加-d参数,则container将默认进入前台模式(Foregroud mode)。Docker会启动这个container,同时将当前的命令行窗口挂载到container的标准输入,标准输出和标准错误中。也就是container中所有的输出,你都可以再当前窗口中查看到。甚至docker可以虚拟出一个TTY窗口,来执行信号中断。这一切都是可以配置的:

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

  如果在执行run命令时没有指定-a,那么docker默认会挂载所有标准数据流,包括输入输出和错误。你可以特别指定挂载哪个标准流。

sudo docker run -a stdin -a stdout -i -t ubuntu /bin/bash  (只挂载标准输入输出)

  对于执行容器内的交互式操作,例如shell脚本。我们必须使用 -i -t 来申请一个控制台同容器进行数据交互。

二、docker run 的 --rm 选项的作用

  在Docker容器退出时,默认容器内部的文件系统仍然被保留,以方便调试并保留用户数据。但是,对于foreground容器,由于其只是在开发调试过程中短期运行,其用户数据并无保留的必要,因而可以在容器启动时设置 --rm 选项,这样在容器退出时就能够自动清理容器内部的文件系统。示例如下:

docker run --rm ba-208
// 等价于
docker run --rm=true ba-208

  显然,--rm 选项不能与 -d 同时使用(或者说同时使用没有意义),即只能自动清理 foreground 容器,不能自动清理 detached 容器。

  注意,--rm 选项也会清理容器的匿名data volumes。

  所以,执行 docker run 命令带 --rm 命令选项,等价于在容器退出后,执行docker rm -v。

三、docker的 --rm 与 docker rm 的区别

  Dockerfile里的VOLUME和docker run -v /path的时候挂载容器的挂载点效果是一致的,会在宿主机/var/lib/docker/volumes目录生成随机目录。

1、使用 docker rm 删除容器  ——  删除容器,挂载点的文件还存在

2、使用 --rm 参数   ——  删除容器,并还会删掉挂载点的数据

原文地址:https://www.cnblogs.com/goloving/p/15092088.html