上一章我們學習了如何建構 Docker 鏡像,并通過鏡像運作容器。本章将深入讨論容器:學習容器的各種操作,容器各種狀态之間如何轉換,以及實作容器的底層技術。
<code>docker run</code> 是啟動容器的方法。在讨論 Dockerfile 時我們已經學習到,可用三種方式指定容器啟動時執行的指令:
CMD 指令。
ENTRYPOINT 指令。
在 <code>docker run</code> 指令行中指定。
例如下面的例子:

容器啟動時執行 <code>pwd</code>,傳回的 <code>/</code> 是容器中的目前目錄。 執行 <code>docker ps</code> 或 <code>docker container ls</code> 可以檢視 Docker host 中目前運作的容器:
咦,怎麼沒有容器?用 <code>docker ps -a</code> 或 <code>docker container ls -a</code> 看看。
<code>-a</code> 會顯示所有狀态的容器,可以看到,之前的容器已經退出了,狀态為<code>Exited</code>。
這種“一閃而過”的容器通常不是我們想要的結果,我們希望容器能夠保持 runing 狀态,這樣才能被我們使用。
如何讓容器儲存運作呢?
因為容器的生命周期依賴于啟動時執行的指令,隻要該指令不結束,容器也就不會退出。
了解了這個原理,我們就可以通過執行一個長期運作的指令來保持容器的運作狀态。例如執行下面的指令:
<code>while</code> 語句讓 bash 不會退出。我們可以打開另一個終端檢視容器的狀态:
可見容器仍處于運作狀态。不過這種方法有個缺點:它占用了一個終端。
我們可以加上參數 <code>-d</code> 以背景方式啟動容器。
容器啟動後回到了 docker host 的終端。這裡看到 docker 傳回了一串字元,這是容器的 ID。通過 <code>docker ps</code> 檢視容器:
現在我們有了兩個正在運作的容器。這裡注意一下容器的 <code>CONTAINER ID</code>和 <code>NAMES</code> 這兩個字段。
<code>CONTAINER ID</code> 是容器的 “短ID”,前面啟動容器時傳回的是 “長ID”。短ID是長ID的前12個字元。
<code>NAMES</code> 字段顯示容器的名字,在啟動容器時可以通過 <code>--name</code> 參數顯示地為容器命名,如果不指定,docker 會自動為容器配置設定名字。
對于容器的後續操作,我們需要通過 “長ID”、“短ID” 或者 “名稱” 來指定要操作的容器。比如下面停止一個容器:
這裡我們就是通過 “短ID” 指定了要停止的容器。
通過 <code>while</code> 啟動的容器雖然能夠保持運作,但實際上沒有幹什麼有意義的事情。容器常見的用途是運作背景服務,例如前面我們已經看到的 http server:
這一次我們用 <code>--name</code> 指定了容器的名字。 我們還看到容器運作的指令是<code>httpd-foreground</code>,通過 <code>docker history</code> 可知這個指令是通過 CMD 指定的。
我們經常需要進到容器裡去做一些工作,比如檢視日志、調試、啟動其他程序等。下一節學習如何進入容器内部。