記得第一次接觸 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 ~]#
文章內容僅代表個人觀點,如有不正之處,歡迎批評指正,謝謝大家。