上一章我們學習了如何建構 Docker 鏡像,并通過鏡像運作容器。本章将深入讨論容器:學習容器的各種操作,容器各種狀态之間如何轉換,以及實作容器的底層技術。
運作容器
docker run
是啟動容器的方法。在讨論 Dockerfile 時我們已經學習到,可用三種方式指定容器啟動時執行的指令:
- CMD 指令。
- ENTRYPOINT 指令。
- 在
指令行中指定。docker run
例如下面的例子:
容器啟動時執行
pwd
,傳回的
/
是容器中的目前目錄。 執行
docker ps
或
docker container ls
可以檢視 Docker host 中目前運作的容器:
咦,怎麼沒有容器?用
docker ps -a
docker container ls -a
看看。
-a
會顯示所有狀态的容器,可以看到,之前的容器已經退出了,狀态為
Exited
。
這種“一閃而過”的容器通常不是我們想要的結果,我們希望容器能夠保持 runing 狀态,這樣才能被我們使用。
讓容器長期運作
如何讓容器儲存運作呢?
因為容器的生命周期依賴于啟動時執行的指令,隻要該指令不結束,容器也就不會退出。
了解了這個原理,我們就可以通過執行一個長期運作的指令來保持容器的運作狀态。例如執行下面的指令:
while
語句讓 bash 不會退出。我們可以打開另一個終端檢視容器的狀态:
可見容器仍處于運作狀态。不過這種方法有個缺點:它占用了一個終端。
我們可以加上參數
-d
以背景方式啟動容器。
容器啟動後回到了 docker host 的終端。這裡看到 docker 傳回了一串字元,這是容器的 ID。通過
docker ps
檢視容器:
現在我們有了兩個正在運作的容器。這裡注意一下容器的
CONTAINER ID
和
NAMES
這兩個字段。
CONTAINER ID
是容器的 “短ID”,前面啟動容器時傳回的是 “長ID”。短ID是長ID的前12個字元。
NAMES
字段顯示容器的名字,在啟動容器時可以通過
--name
參數顯式地為容器命名,如果不指定,docker 會自動為容器配置設定名字。
對于容器的後續操作,我們需要通過 “長ID”、“短ID” 或者 “名稱” 來指定要操作的容器。比如下面停止一個容器:
這裡我們就是通過 “短ID” 指定了要停止的容器。
通過
while
啟動的容器雖然能夠保持運作,但實際上沒有幹什麼有意義的事情。容器常見的用途是運作背景服務,例如前面我們已經看到的 http server: