记得第一次接触 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 ~]#

文章内容仅代表个人观点,如有不正之处,欢迎批评指正,谢谢大家。

docker run 命令的 -i -t -d选项的作用相关推荐

  1. 【docker】docker run命令详解

    Docker run命令用于运行一个新容器,而启动一个容器需要非常多的信息,所以该命令的参数非常多,今天就详细分析下该命令支持的参数. 首先看一下该命令的格式: [html] view plain c ...

  2. 《 第一本Docker书 》读书笔记 --- Docker 各项操作命令及参数说明(docker run 命令各个参数说明)

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. PS :个人所有读书笔记只记录个人想要的内容,很可能原书大量内容没有纳入笔记中... ... 1. ...

  3. Docker run 命令

    Docker run 命令 docker run :创建一个新的容器并运行一个命令 语法 docker run [OPTIONS] IMAGE [COMMAND] [ARG-] OPTIONS说明: ...

  4. docker run 命令详解

    命令格式 Docker run命令用于运行一个新容器,而启动一个容器需要非常多的信息,所以该命令的参数非常多,今天就详细分析下该命令支持的参数. 首先看一下该命令的格式: Usage: docker ...

  5. Docker run 命令【转】

    原文地址:https://www.runoob.com/docker/docker-run-command.html docker run :创建一个新的容器并运行一个命令 语法 docker run ...

  6. Docker run 命令 参数说明

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. docker run :创建一个新的容器并运行一个命令 语法 docker run [OPTIONS ...

  7. Docker run 命令常用参数

    docker run :创建一个新的容器并运行一个命令 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] OPTIONS说明: -it: 以交互模式运行容器: ...

  8. docker run命令详解

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...]-a, ...

  9. (一)docker run 命令参数

    Usage: docker run [OPTIONS] IMAGE [COMMAND] [ARG...] -d, --detach=false 指定容器运行于前台还是后台,默认为false -i, - ...

  10. docker run命令_CVE-2019-14271:Docker cp命令漏洞分析

    0x00 前言 在过去几年中,研究人员在各种容器平台的copy(cp)命令中发现了几个漏洞,这些平台包括Docker.Podman及Kubernetes,其中最严重的漏洞直到今年7月份才被发现和披露. ...

最新文章

  1. 一个函数两个return
  2. JZOJ 4673. 4504. 5635. 【NOI2018模拟4.7】LCS
  3. 设置char变量指定位为0或1
  4. 浏览器渲染机制面试_面试官不讲码德,问我Chrome浏览器的渲染原理(6000字长文)...
  5. 【CF566#D】 Restructuring Company (并查集---合并区间操作)
  6. switch c语言讲解,C语言switch使用之诡异用法详解
  7. android一格一格向上的进度条,如何 使用 ProgressBar 进度条
  8. Jenkins多环境持续集成架构实践
  9. liunx 之 redHat 下 java 环境的配置和安装
  10. mysql 日期 明天_mysql 获取昨天日期、今天日期、明天日期以及前一个小时和后一个小时的时间...
  11. 用程序关闭、注销、重启计算机
  12. matlab 2020b linux版本 下载
  13. Virtualbox安装Windows7虚拟机
  14. 再生核希尔伯特空间:Hilbert Space与RKHS基础
  15. 冰点下载器的使用方法
  16. Android仿微信语音录制和播放
  17. android 自定义太阳,第一个AOSP安卓10自定义ROM已经可用,并且非常稳定
  18. CSS布局:多种方案实现固定页脚(sticky footer)
  19. 计算机菜单的作用是,菜单
  20. 华为鸿蒙系统的技术特性,华为鸿蒙系统来了,还有这四大技术特性

热门文章

  1. IP-Guard准入控制网关实现机制
  2. DTL(Django templeate language)
  3. 一年级课程表(4月18日-4月22日)
  4. IPX 、 IPEX 、 UFL连接器
  5. At least one JAR was scanned for TLDs解决办法
  6. coolnbsp;sensor/image/videonbsp;technbsp;cou…
  7. Spark大数据分与实践笔记(第二章 Spark基础-03)
  8. 有个程序媛上司是什么体验
  9. Python.json.常见两个错误处理(Expecting , delimiter)(Invalid control character at)
  10. was expecting double-quote to start field name错误