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

news2024/11/18 9:42:42

以 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 var

ll
/bin/bash: line 3: ll: command not found
exit

root@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
d0eba4fba2f68f5dd23f32569d5a633c275724c75035d54a3e7daf59db2f6620

root@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.coloradmin.cn/o/1121010.html

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

相关文章

1997-2017年各省能源投入数据(万吨标准煤)

1997-2017年各省能源投入数据(万吨标准煤) 1、时间:1997-2017年 2、来源:中国统计年鉴 3、范围:30个省 4、指标:能源投入(各省8种能源消费总量计算得出)(万吨标准煤&…

Day 08 python学习笔记

函数 作用域 作用域:变量的访问权限 全局变量与局部变量 声明在函数外边的变量----全局变量 ----》全局作用域 函数内部的变量------局部变量 ----》局部作用域顶格创建的函数也是全局的 例: a 100def test_01():a 0b 110print…

解决因d3dx9_30.dll丢失程序无法运行,电脑缺失d3dx9_30.dll报错解决方案

我们的生活和工作都离不开电脑。然而,电脑作为一种复杂的工具,也会出现各种各样的问题。其中,丢失d3dx9_30.dll文件是一个常见的问题。d3dx9_30.dll是DirectX的动态链接库文件,如果丢失或损坏,可能会导致许多软件和游戏…

Kettle查询表数据循环到目标表

简介:Kettle工具有一种业务场景是动态查询数据库中某张表的某个字段,将该字段当做循环变量,循环整个作业。下面就是记录该步骤。 一、思路 首先生产环境中我们需要做的一个业务就是: 按品牌循环执行:step3step4&…

LeetCode 2316. 统计无向图中无法互相到达点对数【图,BFS,DFS,并查集】1604

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

raven2 靶机

一.信息收集 靶机的信息收集就是网段 2.使用nmap扫描端口和真实IP nmap 网段 扫描ip和端口 二.查找漏洞 可以查看版本 找到利用信息 cms 以及 apache 组件漏洞 组件的目录漏洞 找到了 一般爆破不出来 敏感目录爆破 wordpress的 dirb --url 网址 直接找…

[C++]类型转换

一、C语言中的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与 接收返回值类型不一致时,就需要发生类型转化。 C语言中总共有两种形式的类型转换:隐式类型转换和显式…

HBuilder插件推荐

整理一下我觉得好用的插件,后期可能会有更改 eslint-js eslint-plugin-vue Prettier scss/sass编译 右键复制vue页面路径,主要用于快速复制vue页面的路径到浏览器

HashMap的运用小练习

public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("jack",650);hashMap.put("tom",1200);hashMap.put("smith",2900);System.out.println(hashMap);//将jack的工资更改为2600hashMap.put("jack",…

分发糖果[困难]

优质博文:IT-BLOG-CN 一、题目 n个孩子站成一排。给你一个整数数组ratings表示每个孩子的评分。你需要按照以下要求,给这些孩子分发糖果: 【1】每个孩子至少分配到1个糖果。 【2】相邻两个孩子评分更高的孩子会获得更多的糖果。 请你给每个孩…

ATPCS:ARM-Thumb程序调用的基本规则

为了使单独编译的c文件和汇编文件之间能够互相调用,需要制定一系列的规则,AAPCS就是ARM程序和Thumb程序中子程序调用的基本规则。 1、ATPCS概述 ATPCS规定了子程序调用过程中寄存器的使用规程、数据站的使用规则、参数的传递规则。为了适应一些特殊的需…

MIT 6.S081 FALL 2020环境搭建

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家来访。 MIT6.S081 Operating System Engineering 是麻省理工学院计算机科学本科的中级课程&#xff0c…

openGauss学习笔记-106 openGauss 数据库管理-管理用户及权限-管理员

文章目录 openGauss学习笔记-106 openGauss 数据库管理-管理用户及权限-管理员106.1 初始用户106.2 系统管理员106.3 安全管理员106.4 审计管理员106.5 监控管理员106.6 运维管理员106.7 安全策略管理员 openGauss学习笔记-106 openGauss 数据库管理-管理用户及权限-管理员 10…

按键中断控制LED灯亮灭

EXTI—外部中断/事件控制器 EXTI(External interrupt/event controller)—外部中断/事件控制器,管理了控制器的 20 个中断/事 件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的 检测。EXTI可…

MyBatis整合Spring的原理分析

MyBatis整合Spring的原理分析 http://mybatis.org/spring/zh/index.html 1. MyBatis整合Spring实现 我们先来实现MyBatis和Spring的整合操作。1.1 添加相关的依赖 <dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifa…

面试官:说说Vue 3.0中Treeshaking特性?

一、是什么 Tree shaking 是一种通过清除多余代码方式来优化项目打包体积的技术&#xff0c;专业术语叫 Dead code elimination 简单来讲&#xff0c;就是在保持代码运行结果不变的前提下&#xff0c;去除无用的代码 如果把代码打包比作制作蛋糕&#xff0c;传统的方式是把鸡…

石油数字孪生可视化管理平台,推动石油行业数字化转型与智能化应用

随着科技的飞速发展&#xff0c;如何利用先进的信息技术全面增强智能制造过程中感知、处理、决策、执行的能力&#xff0c;成为当前石油化工信息化数字化变革的研究重点&#xff0c;而数字孪生可视化管理平台具有高效的决策分析特点&#xff0c;将有力地推动数字化转型与智能化…

函数模板和类模板实例介绍

模板&#xff1a;将类型定义为参数&#xff0c;实现类型参数化&#xff0c;实现代码重用。 一、函数模板 格式&#xff1a; &#xff08;template-声明模板的关键字&#xff0c;class修饰形参类型&#xff09; template <class / typename T> 返回类型 函数名&#xff…

qDebug().noquote()、qDebug().nospace()和 DEFINES+= QT_NO_DEBUG_OUTPUT作用

qDebug().noquote() qDebug().noquote() 和输出有关系。 qDebug() 是 Qt 的调试输出函数&#xff0c;用于在调试模式下输出信息。 默认情况下&#xff0c;qDebug() 会自动为输出的字符串添加引号。使用 .noquote() 可以禁用这个特性&#xff0c;输出的字符串将不再包含引号。…