dockerrun命令的-i-t-d选项的作⽤
记得第⼀次接触 docker 的时候,教程中写着 docker run -it 之类的命令,当时对这个 -it 选项是⼀知半解,本⽂就来分析⼀下这三个选项,尽量做到通俗易懂,这也是我写博客的⽬的。
⼀、选项说明
官⽅⽂档:
选项选项简写说明
–detach-d在后台运⾏容器,并且打印容器id。
–interactive-i即使没有连接,也要保持标准输⼊保持打开状态,⼀般与 -t 连⽤。
–tty-t分配⼀个伪tty,⼀般与 -i 连⽤。
“-”与“–”的区别请参考:
⼆、-it 选项
使⽤ ubuntu:19.10 镜像创建并运⾏⼀个名称为 ubuntu1910 的容器,-i 选项指⽰ docker 要在容器上打开⼀个标准的输⼊接⼝,-t 指⽰docker 要创建⼀个伪 tty 终端,连接容器的标准输⼊接⼝,之后⽤户就可以通过终端进⾏输⼊。由于 docker run [OPTIONS] IMAGE [COMMAND] [] 命令的默认 COMMAND 为 /bin/bash,因此⽤户的输⼊是基于 bash shell 执⾏的。
⽰例中,在终端上输⼊了 exit 13 ,回车执⾏该命令,退出终端。该命令被传递到 docker run 的调⽤⽅,并且被记录到容器的 metadata 中。
[root@iZ2ze6ogddtzz4dzyy00xwZ ~]# docker run --name ubuntu1910 -it ubuntu:19.10
root@cd83bc3b0d3b:/# exit 13exited
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 u buntu1910
[root@iZ2ze6ogddtzz4dzyy00xwZ ~]#
容器的 metadata 在 /var/lib/docker/containers/containerId/ ⽬录下,其中 containerId-json.log ⽂件中记录了回写的内容。
[root@iZ2ze6ogddtzz4dzyy00xwZ cd83bc3b0d3bb76fc9fc5df326235b3554c15455891d3b3aa0921fb16796322d]# cat cd83bc3b0d3bb76fc9fc5df326235b 3554c15455891d3b3aa0921fb16796322d-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 ubu ntu1
cd83bc3b0d3b ubuntu:19.10 "/bin/bash" 18 minutes ago Exited (13) 18 minutes ago ub untu1910
[root@iZ2ze6ogddtzz4dzyy00xwZ ~]#
于是疑惑产⽣了, -d 是保证容器在后台运⾏,为什么我的容器停⽌运⾏了呢?
前⾯提到过, docker run [OPTIONS] IMAGE [COMMAND] [] 中有⼀个 COMMAND 参数,容器启动后会执⾏ COMMAND命令,它的默认值为 /bin/bash。也就是说容器在后台启动成功后,执⾏了 COMMAND 命令后直接关闭了。
docker命令请参考:
了解到该原理后,我们可以通过在 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 ~]#
⽂章内容仅代表个⼈观点,如有不正之处,欢迎批评指正,谢谢⼤家。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论