浅谈 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,一经查实,立即删除!

相关文章

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

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

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

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

git创建与合并分支

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

《动手学深度学习 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位进程用户态虚拟地址和内核态虚拟地址的划分 …

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

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

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…

微信小程序OA会议系统数据交互

前言 经过我们所写的上一文章:微信小程序会议OA系统其他页面-CSDN博客 在我们的是基础面板上面,可以看到出来我们的数据是死数据,今天我们就完善我们的是数据 后台 在我们去完成项目之前我们要把我们的项目后台准备好资源我放在我资源中&…

学习笔记---0基础+干货满满的单链表专题~~

目录​​​​​​​ 1. 链表的概念及结构👑 1.1 什么是链表?👀 1.2 为什么需要链表?⁉️ 1.3 链表的结构是怎么样的?❓ 2. 链表的分类🦜 3. 实现单链表🫵 3.1 要实现的目标🎯…

JS加密/解密之闭包的运用

深入探讨JavaScript闭包的演变与应用 摘要: 本文将深入探讨JavaScript闭包的概念、特性以及其在实际开发中的应用。我们将从闭包的起源开始,探讨它在JavaScript编程中的重要性,并通过实例展示闭包在不同场景下的灵活应用。 引言 JavaScrip…

第一个Vue程序

首先下载vue.min.js或者vue.js Installation — Vue.js 在web文件下创建js文件并把vue.js复制到此文件。 创建一个jsp文件 显示界面

自然语言处理---Transformer机制详解之GPT模型介绍

1 GPT介绍 GPT是OpenAI公司提出的一种语言预训练模型.OpenAI在论文<< Improving Language Understanding by Generative Pre-Training >>中提出GPT模型.OpenAI后续又在论文<< Language Models are Unsupervised Multitask Learners >>中提出GPT2模型.…

如何使用visual studio 2010构建SQLite3.lib文件

sqlite3官网只提供了dll&#xff0c;并没有lib文件。需要自己生成sqlite3.lib。因项目升级到x64&#xff0c;以前并没有生成64位的链接库&#xff0c;需要自己创建。本人电脑操作系统windows 10, 开发环境为visual studio 2010。下面是详细生成过程。 1. 从源下载源&#xff08…