淺析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 參數   ——  刪除容器,並還會刪掉掛載點的數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM