docker run 命令的 -i -t -d選項的作用

記得第一次接觸 docker 的時候,教程中寫着 docker run -it 之類的命令,當時對這個 -it 選項是一知半解,本文就來分析一下這三個選項,儘量做到通俗易懂,這也是我寫博客的目的。

一、選項說明

官方文檔:https://docs.docker.com/engine/reference/commandline/run/

選項 選項簡寫 說明
–detach -d 在後臺運行容器,並且打印容器id。
–interactive -i 即使沒有連接,也要保持標準輸入保持打開狀態,一般與 -t 連用。
–tty -t 分配一個僞tty,一般與 -i 連用。

“-”與“–”的區別請參考:Linux編程:命令行選項單橫線“-”與雙橫線“–”的區別

二、-it 選項

使用 ubuntu:19.10 鏡像創建並運行一個名稱爲 ubuntu1910 的容器,-i 選項指示 docker 要在容器上打開一個標準的輸入接口,-t 指示 docker 要創建一個僞 tty 終端,連接容器的標準輸入接口,之後用戶就可以通過終端進行輸入。由於 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 命令的默認 COMMAND/bin/bash,因此用戶的輸入是基於 bash shell 執行的。

示例中,在終端上輸入了 exit 13 ,回車執行該命令,退出終端。該命令被傳遞到 docker run 的調用方,並且被記錄到容器的 metadata 中。

[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker run --name ubuntu1910 -it ubuntu:19.10
root@cd83bc3b0d3b:/# exit 13
exit

通過 docker ps -a 命令查看容器,Exited (13) 35 seconds ago 就是被回寫的內容。

[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker ps -a | grep ubuntu1910
cd83bc3b0d3b        ubuntu:19.10                                             "/bin/bash"              46 seconds ago      Exited (13) 35 seconds ago                                       ubuntu1910
[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# 

容器的 metadata 在 /var/lib/docker/containers/containerId/ 目錄下,其中 containerId-json.log 文件中記錄了回寫的內容。

[root@iZ2ze6ogddtzz4dzyy00xwZ cd83bc3b0d3bb76fc9fc5df326235b3554c15455891d3b3aa0921fb16796322d]# cat cd83bc3b0d3bb76fc9fc5df326235b3554c15455891d3b3aa0921fb16796322d-json.log 
{"log":"\u001b]0;root@cd83bc3b0d3b: /\u0007root@cd83bc3b0d3b:/# exit 13\r\n","stream":"stdout","time":"2020-02-08T14:35:22.509224333Z"}
{"log":"exit\r\n","stream":"stdout","time":"2020-02-08T14:35:22.509286061Z"}
[root@iZ2ze6ogddtzz4dzyy00xwZ cd83bc3b0d3bb76fc9fc5df326235b3554c15455891d3b3aa0921fb16796322d]# 

三、-d 選項

使用 docker run -d 在後臺創建並啓動名稱爲 ubuntu1 的容器,通過 docker ps 命令沒有查找到處於運行狀態的容器,通過 docker ps -a 命令查找到已經停止運行的 ubuntu1 容器。

[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker run -d --name ubuntu1 ubuntu:19.10
315cc38afc2f06abb5a2fbb075ebca16455367b2de685cf0c5ba828ab62dd5a1
[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
c04afe750081        mysql:5.7           "docker-entrypoint.s…"   26 hours ago        Up 26 hours         0.0.0.0:3306->3306/tcp, 33060/tcp   mysql5.7
[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker ps -a | grep ubuntu1
315cc38afc2f        ubuntu:19.10                                             "/bin/bash"              35 seconds ago      Exited (0) 34 seconds ago                                        ubuntu1
cd83bc3b0d3b        ubuntu:19.10                                             "/bin/bash"              18 minutes ago      Exited (13) 18 minutes ago                                       ubuntu1910
[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# 

於是疑惑產生了, -d 是保證容器在後臺運行,爲什麼我的容器停止運行了呢?

前面提到過, docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 中有一個 COMMAND 參數,容器啓動後會執行 COMMAND命令,它的默認值爲 /bin/bash。也就是說容器在後臺啓動成功後,執行了 COMMAND 命令後直接關閉了。

docker命令請參考:https://blog.csdn.net/claram/article/details/103301942

瞭解到該原理後,我們可以通過在 docker run -d 後增加一個駐留在進程中長期運行的命令就可以保證容器不關閉了。

[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker run -d --name ubuntu2 ubuntu:19.10 tail -f /dev/null 
a0d3c58fc68b139f63355594dd91c2d047b84a3d56880418eedcd8fedb6307b6
[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES
a0d3c58fc68b        ubuntu:19.10        "tail -f /dev/null"      5 seconds ago       Up 4 seconds                                            ubuntu2
c04afe750081        mysql:5.7           "docker-entrypoint.s…"   26 hours ago        Up 26 hours         0.0.0.0:3306->3306/tcp, 33060/tcp   mysql5.7
[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# 

文章內容僅代表個人觀點,如有不正之處,歡迎批評指正,謝謝大家。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章