浅谈 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.rhkb.cn/news/168563.html

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

相关文章

【Unity地编细节】为什么Unity笔刷在地形上面刷不出来

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏:unity细节和bug 😶‍🌫️优质专栏 ⭐【…

渗透测试tomcat错误信息泄露解决办法

解决方法&#xff1a; 1、使用tomcat8.5.16&#xff0c;会重定向非法url到登录url 2、配置server.xml&#xff0c;加上 <Valve className"org.apache.catalina.valves.ErrorReportValve" showReport"false" showServerInfo"false" />配置…

Linux:firewalld防火墙-基础使用(2)

上一章 Linux&#xff1a;firewalld防火墙-介绍&#xff08;1&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/133960695?spm1001.2014.3001.5501 我使用的系统为centos7 firewalld启动停止等操作 systemctl start firewalld 开启防火墙 systemct…

There are not enough slots available in the system to satisfy the 48 slots报错

文章目录 问题描述解决办法 问题描述 多核运行时出现这个错误&#xff0c;减少核数运行正常 解决办法 输出命令 vim ~/.bashrc添加 alias mpirunmpirun --oversubscribe执行命令 source ~/.bashrc解决。

nginx安装详细步骤和使用说明

下载地址&#xff1a; https://download.csdn.net/download/jinhuding/88463932 详细说明和使用参考&#xff1a; 地址&#xff1a;http://www.gxcode.top/code 一 nginx安装步骤&#xff1a; 1.nginx安装与运行 官网 http://nginx.org/1.1安装gcc环境 # yum install gcc-c…

Power BI 傻瓜入门 1. 数据分析术语:Power BI风格

本章内容包括&#xff1a; 了解Power BI可以处理的不同类型的数据了解您的商业智能工具选项熟悉Power BI术语 数据无处不在。从你醒来的那一刻到你睡觉的时候&#xff0c;某个系统会代表你收集数据。即使在你睡觉的时候&#xff0c;也会产生与你生活的某些方面相关的数据。如…

一款功能强大的音乐曲谱软件Guitar Pro 8 .1.1for Mac 中文破解版

Guitar Pro 8 .1.1for Mac 中文破解版是一款功能强大的音乐曲谱软件&#xff0c;非常适合学习如何玩&#xff0c;改进技巧&#xff0c;重现喜爱的歌曲或陪伴自己。可以帮助我们进行吉他的学习、绘谱与创作&#xff0c;它包含了几乎所有的吉他现有指法及音色&#xff0c;在做弹拨…

UiPath:一家由生成式AI驱动的流程自动化软件公司

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 总结&#xff1a; &#xff08;1&#xff09;UiPath(PATH)的股价并没有因为生成式AI的炒作而上涨&#xff0c;但很可能会成为主要受益者。 &#xff08;2&#xff09;即使在严峻的宏观环境下&#xff0c;UiPath的收入还在不…

2023年中国二手车交易行业发展历程及趋势分析:整体规模仍保持稳定增长[图]

二手车交易主要内容包括&#xff1a;二手车评估前期工作、技术状况鉴定、寄卖、置换业务、价格评估、交易实务。主要手续包括车务手续、车辆保养维修手续、税费手续。 二手车交易行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 未来&#xff0c;二…

1.顺序表-头插、头删、尾插、尾删

文章目录 简介1.头插功能2.头删功能3.尾插功能4.尾删功能5.此程序共包含4个文件&#xff0c;2个.c文件和2个.h文件5.1 SeqList.h文件5.2 SeqList.c文件5.3 test.h文件5.4 test.c文件 6.测试结果6.1 测试尾插和尾删的运行结果6.2 测试头插和头删的运行结果 7.温馨提示 简介 本文…

【Javascrpt】比较,逻辑运算符

目录 比较运算符 逻辑运算符 &&(与&#xff09; ||&#xff08;或&#xff09; 两真&#xff08;||左侧为真&#xff0c;||右侧为真&#xff09; 两假&#xff08;||左侧为假&#xff0c;右侧为假&#xff09; 一真一假&#xff08;||一侧为假&#xff0c;另一侧为…

解析Apache Kafka中的事务机制

这篇博客文章并不是关于使用事务细节的教程&#xff0c;我们也不会深入讨论设计细节。相反&#xff0c;我们将在适当的地方链接到JavaDocs或设计文档&#xff0c;以供希望深入研究的读者使用。 为什么交易? 我们在Kafka中设计的事务主要用于那些显示“读-进程-写”模式的应用…

使用Kali进行实验---主机发现

主机发现 【实训目的】 掌握主机扫描的工作原理&#xff0c;学会使用ping等扫描工具&#xff0c;发现网络当中活跃的主机。 【场景描述】 在虚拟机环境下配置4个虚拟系统“Win XP1” “Win XP2” “Kali Linux”和“Metasploitable2”&#xff0c;使得4个系统之间能够相互通…

有哪些适用于 Windows 的PDF 阅读器?免费 PDF 阅读器清单

探索适用于 Windows 10 和 11 的最佳 PDF 阅读器 适用于 Windows 10 和 Windows 11 的最佳 PDF 阅读器让您可以在台式计算机上查看和共享文档。 最好的PDF 编辑器和免费的 PDF 编辑器配备了先进的工具&#xff0c;可以跨不同的操作系统工作。但是&#xff0c;当您只需要查看和…

网络入门基础

网络入门基础 文章目录 网络入门基础网络的发展协议的概念网络协议初识协议分层层状结构OSI七层模型TCP/IP五层(或四层)模型TCP/IP模型和计算机软硬体系结构的关系 网络传输基本流程同局域网的两台主机通信不同局域网的两台主机通信 网络中的地址管理认识IP地址认识MAC地址 网络…

【小白专用23.10.22 已验证】windows 11 安装PHP8.2 +Apache2.4

环境说明 windows:windows 11 x64apache: Apache/2.4.43php :php-8.2.11 一.php 1、PHP下载 PHP For Windows: Binaries and sources Releases 注意&#xff1a; 1.要下载Thread Safe&#xff0c;否则没有php8apache2_4.dll这个文件&#xff1b;如果使用Apache作为服务器…

python 桌面软件开发-matplotlib画图鼠标缩放拖动

继上一篇在 Java 中缩放拖动图片后&#xff0c;在python matplotlib中也来实现一个自由缩放拖动的例子&#xff1a; python matplotlib 中缩放&#xff0c;较为简单&#xff0c;只需要通过设置要显示的 x y坐标的显示范围即可。基于此&#xff0c;实现一个鼠标监听回调&#xf…

Kubernetes技术与架构-Ingress

Ingress是一个流量网关&#xff0c;其根据配置的URI路径路由规则&#xff0c;为运行在Kubernetes集群中的Service分发流量&#xff0c;从系统架构设计的角度看&#xff0c;Ingress位于Service的上层&#xff0c;本文主要描述Ingress的基本使用方式。 如上所示&#xff0c;clien…

Redis --- 安装教程

Redis--- 特性&#xff0c;使用场景&#xff0c;安装 安装教程在Ubuntu下安装在Centos7.6下安装Redis5 特性在内存中存储数据可编程的扩展能力持久化集群高可用快速 应用场景实时数据存储作为缓存或者Session存储消息队列 安装教程 &#x1f680;安装之前切换到root用户。 在…

docker 基本用法-操作镜像

1.下载镜像 docker search centos #默认从 Docker Hub 中搜索镜像 访问 dockerhub&#xff1a;https://registry.hub.docker.com docker pull centos 拉取镜像 如果不能拉取 方法 1.需要配置配置镜像加速器 tee /etc/docker/daemon.json << EOF {"registry-mirro…