Website logo

Robert Chang

技術部落格

Docker - 深入了解 Container 內部 ( 上 )

在這個章節,我們將進入容器內部一探究竟。

在以前,要連線進入一個雲端或是隔離環境內,我們常常使用 ssh 的方式來建立安全的通道,但在 Docker 中我們不需要這麼做,就可以輕鬆連線到容器內部。

透過下方的指令,終端機將會進入另一個終端機:

$ docker container run --interactive --tty nginx bash
root@d33940b87e66:/#

終端機理論上會呈現一個可以輸入的模式,我們可以輸入一些基本的 Linux 指令來驗證一下:

root@d33940b87e66:/# ls
bin  boot  dev	docker-entrypoint.d  docker-entrypoint.sh  etc	home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

接著先離開容器內部,回來解釋一下這段指令做了些什麼:

root@d33940b87e66:/# exit

interactive

首先是 --interactive,我們透過閱讀 Docker 官方文件得到下面的答案:

Keep STDIN open even if not attached

簡單來說就是保持輸入模式,也可以理解成和容器之間保持可以互動的狀況,要如何驗證呢?就是我們故意不輸入 --interactive 的參數,看看會發生什麼事情。

$ docker container run --tty nginx bash

在你還沒輸入任何 Linux 指令前,看起來應該是很正常,那我們試著來輸入指令吧!

root@d33940b87e66:/# ls
# 接著他就完全停住了

離開的方式就直接關掉終端機就可以了,所以我們在這裡證明了,如果不加入 --interactive 這個參數,即使我們能夠輸入指令,也沒辦法和容器互動。

tty

接著是 --tty 這個參數,透過閱讀 Docker 官方文件得到的答案是:

Allocate a pseudo-TTY

翻成中文就是分配一個虛擬的 TTY,而這個 TTY 代表甚麼呢?

這就是一個有歷史淵源的故事了,在上古時代,一台電腦是要透過多用戶進行操作的,畢竟當時的電腦很貴,要操作的事情也很繁瑣,而多個用戶自然就需要多台打字機對著電腦進行輸入。

而 tty 正是英文 Teletypewriter 的縮寫,但其實在現代,終端機和打字機的界線已經模糊不清,可以想像,終端機就是 tty,反之亦然。

具有實驗精神的我們,也可以透過故意不使用 --tty 的參數來看看會發生什麼事情?

$ docker container run --interactive nginx bash
# 這邊看起來雖然像是不能動,但還是能夠輸入指令
ls
bin
boot
dev
docker-entrypoint.d
docker-entrypoint.sh

輸入 exit 也可以正常離開,但很明顯的感受到這根本不像是一個正常的終端機,回傳的資訊也是一行一行,根本沒辦法好好閱讀,所以有沒有一個好的終端機視窗也是很重要的!

結語

今天藉由 --interactive 以及 --tty 的幫助,進入了容器的內部,也分別解釋了這兩個指令帶來的影響。

明天將會介紹容器的初始指令,也是決定容器何時進入停止狀態的關鍵。

上一篇文章Docker - Container vs 虛擬機

下一篇文章Docker - 深入了解 Container 內部 ( 下 )