天天看點

如何運作容器?- 每天5分鐘玩轉 Docker 容器技術(22)

上一章我們學習了如何建構 Docker 鏡像,并通過鏡像運作容器。本章将深入讨論容器:學習容器的各種操作,容器各種狀态之間如何轉換,以及實作容器的底層技術。

運作容器

​docker run​

​ 是啟動容器的方法。在讨論 Dockerfile 時我們已經學習到,可用三種方式指定容器啟動時執行的指令:

  1. CMD 指令。
  2. ENTRYPOINT 指令。
  3. 在 

    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: