zoukankan      html  css  js  c++  java
  • 浅析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 参数   ——  删除容器,并还会删掉挂载点的数据

  • 相关阅读:
    CentOS 静态IP设置&修改网卡名
    Centos 6.5 升级python到版本2.7.12
    VMware 安装Windows sever 2008 R2服务器
    RF安装
    Python的包管理工具pip
    Appium学习路—Android定位元素与操作
    MYSQL ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.10.210' (111) 解决方法
    MYSQL ERROR 1045 (28000): Access denied for user (using password: YES)解决方案详细说明
    CentOS下Apache默认安装路径
    Apache JMeter配置、安装
  • 原文地址:https://www.cnblogs.com/goloving/p/15092088.html
Copyright © 2011-2022 走看看