浅谈 docker run 命令中的 -i -t 和 -d 选项

以 docker Ubuntu 镜像为例,ubuntu镜像启动时默认执行的命令是"/bin/bash"。

文章目录

    • 不带任何选项
    • 带 -i 选项
    • 带 -i 和 -t 选项
    • -d 选项

不带任何选项

root@ubuntu20:~# docker run ubuntu:20.04 root@ubuntu20:~# docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS                    PORTS                                                                                   NAMES            

容器启动后立马就停止运行了。

这是因为:不加 -i 选项,docker容器中执行的程序【/bin/bash】的标准输入默认是关闭的,由于 bash 程序需要从标准输入读取数据,因此标准输入一旦关闭,bash 程序就退出了,容器也就退出了。

带 -i 选项

root@ubuntu20:~# docker run -i ubuntu:20.04
ls -lh
total 48K
lrwxrwxrwx   1 root root    7 Oct  3 02:03 bin -> usr/bin
drwxr-xr-x   2 root root 4.0K Apr 15  2020 boot
drwxr-xr-x   5 root root  340 Oct 22 06:37 dev
drwxr-xr-x   1 root root 4.0K Oct 22 06:37 etc
drwxr-xr-x   2 root root 4.0K Apr 15  2020 home
lrwxrwxrwx   1 root root    7 Oct  3 02:03 lib -> usr/lib
lrwxrwxrwx   1 root root    9 Oct  3 02:03 lib32 -> usr/lib32
lrwxrwxrwx   1 root root    9 Oct  3 02:03 lib64 -> usr/lib64
lrwxrwxrwx   1 root root   10 Oct  3 02:03 libx32 -> usr/libx32
drwxr-xr-x   2 root root 4.0K Oct  3 02:03 media
drwxr-xr-x   2 root root 4.0K Oct  3 02:03 mnt
drwxr-xr-x   2 root root 4.0K Oct  3 02:03 opt
dr-xr-xr-x 389 root root    0 Oct 22 06:37 proc
drwx------   2 root root 4.0K Oct  3 02:06 root
drwxr-xr-x   5 root root 4.0K Oct  3 02:06 run
lrwxrwxrwx   1 root root    8 Oct  3 02:03 sbin -> usr/sbin
drwxr-xr-x   2 root root 4.0K Oct  3 02:03 srv
dr-xr-xr-x  13 root root    0 Oct 22 06:37 sys
drwxrwxrwt   2 root root 4.0K Oct  3 02:06 tmp
drwxr-xr-x  13 root root 4.0K Oct  3 02:03 usr
drwxr-xr-x  11 root root 4.0K Oct  3 02:06 varll
/bin/bash: line 3: ll: command not found
exitroot@ubuntu20:~# docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS                    PORTS                                                                                   NAMES

加上 -i 选项后,docker 容器中执行的程序【/bin/bash】的标准输入是打开的,并且就是执行“docker run -i ubuntu:20.04”这个命令启动的程序的标准输入。因此,我们可以输入一些数据和容器内的 bash 程序交互。最后输入exit,bash 程序执行 exit 命令后退出,容器也就退出了。

再看一个例子,我们让 Ubuntu 镜像启动时执行 cat 命令:

root@ubuntu20:~# echo 123 | docker run -i ubuntu:20.04 cat
123

由于加了-i 选项,并且使用了管道,则执行“docker run -i ubuntu:20.04 cat”命令后,它启动的程序的标准输入就是管道的标准输出,于是 cat 程序打印出“123”之后退出,容器也退出了。

带 -i 和 -t 选项

在这里插入图片描述

可以看到bash执行命令的输出有了终端的颜色。这是因为加了 -t 选项后,标准输入就变成了一个伪终端设备,bash 如果检查到输入是终端设备就会做一些特殊的处理。

再看一个例子:

root@ubuntu20:~# docker run -i ubuntu:20.04 passwd root
New password: 123
Retype new password: 1234
Sorry, passwords do not match.
passwd: Authentication token manipulation error
passwd: password unchanged
root@ubuntu20:~# 
root@ubuntu20:~# docker run -it ubuntu:20.04 passwd root
New password: 
Retype new password: 
Sorry, passwords do not match.
passwd: Authentication token manipulation error
passwd: password unchanged

加 -t 选项后,passwd 程序检测到输入是一个终端,则密码不会显示出来。

-i 和 -t 选项通常都一起使用。

-d 选项

从上述几个例子看,如果不带 -d 选项,则在交互完成后,Ubuntu 容器就会退出。原因就是交互完成后,会使标准输入关闭。有一种办法就是交互完成后,不要敲 exit 命令或 ctrl+c,而是敲 ctrl+p 再加上ctrl+q。

root@ubuntu20:~# docker run -it ubuntu:20.04
lroot@b5f8b4f4178d:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@b5f8b4f4178d:/# root@ubuntu20:~# 
root@ubuntu20:~# docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS                    PORTS                                                                                   NAMES
b5f8b4f4178d   ubuntu:20.04       "/bin/bash"              13 seconds ago   Up 12 seconds                                                                                                     tender_visvesvaraya

接下来再想和 bash 交互,就使用 docker attach 命令:

root@ubuntu20:~# docker attach b5f8b4f4178d
root@b5f8b4f4178d:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@b5f8b4f4178d:/# exit
exit

但是这样太麻烦了。当启动像 Ubuntu 这样操作系统的镜像时,我们一般都是希望它启动后就一直存在,这样就需要添加 -d 选项:

root@ubuntu20:~# docker run -itd ubuntu:20.04
e911274f4b2bfbbc627dc3aaa2ae1e888931522f124904ba05c8617a3a31422a
root@ubuntu20:~# docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS                       PORTS                                                                                   NAMES
e911274f4b2b   ubuntu:20.04       "/bin/bash"              3 seconds ago    Up 2 seconds                                                                                                         amazing_murdock

这样的话,当我们执行 docker run 命令时,它只会返回容器的 id 就退出,而不会和容器中的 bash 程序进行交互。由于使用了 -i 选项,容器中的 bash 程序中的标准输入并未关闭,所以它一直在等待用户输入,所以容器也就不会退出。

接下来我们想进入容器中交互时,就是用docker exec 命令:

root@ubuntu20:~# docker exec -it e911274f4b2b bash
root@e911274f4b2b:/# ls
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@e911274f4b2b:/# exit
exit
root@ubuntu20:~# 
root@ubuntu20:~# docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS                       PORTS                                                                                   NAMES
e911274f4b2b   ubuntu:20.04       "/bin/bash"              4 minutes ago    Up 4 minutes                                                                                                         amazing_murdock

这会在容器中新启动一个 bash 程序,然后我们与它做交互即可。

如果使用 docker attach 命令,则会和初始的 bash 程序交互,那么当我们输入 exit 时,容器就会退出:

root@ubuntu20:~# docker attach e911274f4b2b
root@e911274f4b2b:/# exit
exit
root@ubuntu20:~# docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED             STATUS                       PORTS                                                                                   NAMES

对于像 nginx 这些服务器程序的镜像,由于它的启动命令不需要和标准输入交互,所以我们不需要添加 -it 选项,直接使用 -d 选项就可以:

root@ubuntu20:~# docker run -d --name some-nginx nginx
d0eba4fba2f68f5dd23f32569d5a633c275724c75035d54a3e7daf59db2f6620root@ubuntu20:~# docker exec -it some-nginx bash
root@d0eba4fba2f6:/# ls -lh /etc/nginx/conf.d/default.conf 
-rw-r--r-- 1 root root 1.1K Oct 22 07:23 /etc/nginx/conf.d/default.conf
root@d0eba4fba2f6:/# exit
exit
root@ubuntu20:~# 
root@ubuntu20:~# docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS                       PORTS                                                                                   NAMES
d0eba4fba2f6   nginx              "/docker-entrypoint.…"   34 seconds ago   Up 33 seconds                80/tcp                                                                                  some-nginx

也是使用 docker exec 命令与容器中的 bash 程序交互来实现对容器中进程和文件的管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/114276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统【OS】进程的控制【进程的创建、终止、阻塞、唤醒】

定义和过程 对应事件 创建 允许一个进程创建另一个进程允许子进程继承父进程所拥有的资源创建进程的过程如下: 申请一个空白的 PCB,并向 PCB 中填写一些控制和管理进程的信息,比如进程的唯一标识等;为该进程分配运行时所必需的…

源码安装Openlava 4.0

安装需求 基本硬件配置建议:CPU 4核或以上(LSF 没有最低 CPU 需求,此处只是建议)内存 8G或以上( 当没有作业在运行时, Linux x86-64 上集群中的 LSF 守护程序将使用大约 488 MB 内存。)交换空…

DDOS攻击的有效防护方式有哪些?

DDoS攻击简介: DDoS攻击,即分布式拒绝服务攻击(Distributed Denial of Service),是一种网络攻击,旨在通过向目标服务器发送大量恶意请求,使服务器资源耗尽,无法满足合法用户的需求&a…

网络协议--ARP:地址解析协议

4.1 引言 本章我们要讨论的问题是只对TCP/IP协议簇有意义的IP地址。数据链路如以太网或令牌环网都有自己的寻址机制(常常为48 bit地址),这是使用数据链路的任何网络层都必须遵从的。一个网络如以太网可以同时被不同的网络层使用。例如&#…

git创建与合并分支

文章目录 创建与合并分支分支管理的概念实际操作 解决冲突分支管理策略Bug分支Feature分支多人协作 创建与合并分支 分支管理的概念 分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码&#xf…

shell的case选择

shell笔记 case语法结构 case语法结构 Caseesac语句与其他语言中的switch.case 语句类似,是一种多分支选择结构。case语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。 case语法结构: case expr in #expr为表达式&am…

《动手学深度学习 Pytorch版》 9.6 编码器-解码器架构

为了处理这种长度可变的输入和输出, 可以设计一个包含两个主要组件的编码器-解码器(encoder-decoder)架构: 编码器(encoder):它接受一个长度可变的序列作为输入,并将其转换为具有固定…

React +AntD + From组件重复提交数据(已解决)

开发场景: react Hooks andt 提交form表单内容给数据库(使用antd的form组件) 问题描述 提交是异步的,请提交方式是POST 方式 提交表单内容给后端,却产生了两次提交记录(当然,数据新增了两条数据)。可以…

基于WebRTC的程序因虚拟内存不足导致闪退问题的排查以及解决办法的研究

目录 1、WebRTC简介 2、问题现象描述 3、将Windbg附加到目标进程上分析 3.1、Windbg没有附加到主程序进程上,没有感知到异常或中断 3.2、Windbg感知到了中断,中断在DebugBreak函数调用上 3.3、32位进程用户态虚拟地址和内核态虚拟地址的划分 …

引用折叠、万能引用、右值引用、move、完美转发

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家来访。 在写STL源码的时候遇到的问题,在这里写一篇笔记记录一下。 一、引用折叠 引用折叠…

分享5个解决msvcp140.dll丢失的方法,全面解析msvcp140.dll丢失的原因

一、MSVCP140.dll是什么? 首先,我们需要了解什么是MSVCP140.dll。MSVCP140.dll是一个动态链接库文件,它是Microsoft Visual C 2015 Redistributable的一部分。这个文件包含了运行使用C编写的应用程序所需的一些函数和类。因此,当…

【单元测试】--测试驱动开发(TDD)

一、什么是测试驱动开发 测试驱动开发(Test-Driven Development,TDD)是一种软件开发方法,其核心思想是在编写实际代码之前,首先编写测试用例。TDD 的主要步骤如下: 编写测试用例:首先&#xf…

MongoDB URL链接 如何设置账号密码

个人博客,求关注。。 MongoDB URL链接 如何设置账号密码 假设你的账号是root,你的密码也是root,则 mongodb://username:passwordlocalhost:27017完美,再见。

探索LLM在图上学习的潜力10.14 暂停

探索LLM在图上学习的潜力 摘要介绍初步知识 摘要 Learning on Graph已经引起了极大的关注,因为它在现实世界中有广泛的应用。在具有文本节点属性的图形上进行学习的最流行的流程主要依赖于图神经网络(GNN),并利用浅层文本嵌入作为…

Maven系列第8篇:大型Maven项目,快速按需任意构建

本篇涉及到的内容属于神技能,多数使用maven的人都经常想要的一种功能,但是大多数人都不知道如何使用,废话不多说,上干货。 需求背景 我们需要做一个电商项目,一般都会做成微服务的形式,按业务进行划分&am…

【LeetCode 算法专题突破】滑动窗口(⭐)

文章目录 前言1. 长度最小的子数组题目描述代码 2. 无重复字符的最长子串题目描述代码 3. 最大连续1的个数 III题目描述代码 4. 将 x 减到 0 的最小操作数题目描述代码 5. 水果成篮题目描述代码 6. 找到字符串中所有字母异位词题目描述代码 7. 串联所有单词的子串题目描述代码 …

关于我对 jeecg-boot 的项目理解、使用心得和改进建议

一句话总结: JeecgBoot帮助我提升了后端技术水平,入门了前端,让我在公司内部慢慢能够成长为全栈开发。 一、项目理解 JeecgBoot 项目的核心理念是快速开发、低代码、易扩展。它采用了前后端分离的架构,后端使用Spring Boot Myba…

用节点亲和性把 Pod 分配到节点

用节点亲和性把 Pod 分配到节点 当前集群信息: rootk8s-master:~# kubectl get node -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s…

cuda PyTorch

1. GPU对应的CUDA版本 nvidia-smi CUDA Version: 12.2 GPU diver 大于cuda toolkit, pytorch 版本根据cuda toolkit 2. 查看nvcc的版本(即cuda toolkit 版本) nvcc --version Cuda compilation tools, release 12.2, V12.2.91 Build cud…