我们经常使用docker exec -it。it参数的含义是什么呢?
我们看一下帮助:
docker exec --help -i, --interactive Keep STDIN open even if not attached --privileged Give extended privileges to the command -t, --tty Allocate a pseudo-TTY
-i表示保持STDIN打开,-t表示分配一个TTY
-i参数
我们经常听说标准输入STDIN和标准输出STDOUT。标准输入输出是个抽象的概念,Linux程序执行,都需要输入和输出,在现实生活中,输入和输出是五花八门的,程序输出可能是屏幕,可能是打印机,今天还有可能是输出到网络等等。为了让程序的设计变得简单 ,Linux把输入输出抽象化,利用Linux中stream和fd的概念,把标准输入定义为fd为0的流(stream)。把标准输出定义为fd为1的流(stream)。
有了标准输入输出,程序的工作就简单了,需要输入的时候,直接从STDIN读取,同理,输出直接写到STDOUT。而不用去担心输入和输出的具体物理形式:
Real Input-->STDINPUT-->Program-->STDOUTPUT-->Real output
在Docker中,当我们运行一个程序,比如运行sh程序:
docker run ubuntu sh
上述程序是马上退出的,因为docker运行程序的时候,默认只打开了程序的STDOUT, 而关闭了程序的STDIN。sh命令没有输入的话,马上就会退出的。
因此-i参数登场了,-i参数的作用,就是打开docker要执行程序中的STDIN。
# docker run -i ubuntu sh ls boot dev etc home
上述命令加入了-i, 现在sh不会退出了,因为STDIN被打开,它就会一直等待输入。我们在上面例子中输入ls, 可以看到列出了ls的结果,如boot, dev, etc,home等
-t参数
如果你仔细观察-i参数的运行效果,你会发现它的输入和输出是光秃秃的 ,而我们常见的ls命令都是这个样子,有一串漂亮的提示符”~#”,输出也是整整齐齐的按行排列:
root@iZ8vb4hv9rh422360tk6dbZ:~# ls / bin boot dev etc home lib lib32
而不是前面光秃秃的这样:
ls boot dev etc home
二者的区别在于,我们常见的ls,是在console控制台下执行的
console控制台,其本质是tty。前面我们提到,linux程序的输入是五花八门的,被抽象成为STDIN。在Linux的历史上,linux服务器从物理上是被设计为C/S模式的,后台一台机器装着操作系统,前台是各种输入终端,可以插到操作系统上,一个操作系统往往上插着多台输入终端,大家都可以同时实用该系统。
有一种常见的输入终端是teletypewriter,打字机,缩写就是tty,把tty往机器接口上一插,就可以开始操作Linux。估计是tty太普遍了,以至于成了个抽象概念,所有的终端,都叫做tty。甚至后来还发展出了软件tty,叫做虚拟TTY(pseudo-TTY)。今天大家登陆linux打开的一个个shell终端,其实就是pseudo tty。
简单的说,tty就是一个软件或者硬件的输入工具,用于连接到Linux系统。用户向linux系统发起指令,一般都需要tty,我们常见的console,就是软件tty
docker中-t参数,就是分配一个tty,-t 参数往往和-i参数一起使用,意思是给系统分配一个tty,并且打开程序的STDIN,把tty的输入结果传递给程序的STDIN
当然,-t参数也可以单独使用,这时候系统分配了一个终端,并不会退出。但由于没有打开程序的STDIN,程序是接受不到输入的
# docker run -t ubuntu sh # ls
在这个例子中,我们打开tty。出现了提示符”#”,然后我们输入ls, 会发现sh没有任何反应,因为sh的STDIN是关闭的,它并没有接收到任何输入
仅仅使用-t的意义,可能就在于使系统不退出。比如我想sh程序后台执行,但是又不退出,就可以这样:
# docker run -td ubuntu sh
和-d结合使用,可以通过docker ps看到,sh并没有退出。这样我们就相当于后台运行了一个ubuntu虚拟机,可以登陆虚拟机执行各种操作
回复 how to get cytotec without rx 取消回复