上一章我們學習了如何構建 Docker 鏡像, 並通過鏡像運行容器。 本章將深入討論容器:學習容器的各種操作, 容器各種狀態之間如何轉換, 以及實現容器的底層技術。
運行容器
docker run是啟動容器的方法。 在討論 Dockerfile 時我們已經學習到, 可用三種方式指定容器啟動時執行的命令:
CMD 指令。
ENDPOINT 指令。
在 docker run命令列中指定。
例如下面的例子:
容器啟動時執行 pwd, 返回的/是容器中的目前的目錄。 執行docker ps或docker container ls可以查看 Docker host 中當前運行的容器:
咦, 怎麼沒有容器?用 docker ps -a或docker container ls -a看看。
-a會顯示所有狀態的容器, 可以看到, 之前的容器已經退出了, 狀態為Exited。
這種“一閃而過”的容器通常不是我們想要的結果,
讓容器長期運行
如何讓容器保存運行呢?
因為容器的生命週期依賴于啟動時執行的命令, 只要該命令不結束, 容器也就不會退出。
理解了這個原理, 我們就可以通過執行一個長期運行的命令來保持容器的運行狀態。 例如執行下麵的命令:
while語句讓 bash 不會退出。 我們可以打開另一個終端查看容器的狀態:
可見容器仍處於運行狀態。 不過這種方法有個缺點:它佔用了一個終端。
我們可以加上參數 -d以後臺方式啟動容器。
容器啟動後回到了 docker host 的終端。 這裡看到 docker 返回了一串字元, 這是容器的 ID。 通過 docker ps查看容器:
現在我們有了兩個正在運行的容器。
CONTAINER ID是容器的 “短ID”, 前面啟動容器時返回的是 “長ID”。 短ID是長ID的前12個字元。
NAMES欄位顯示容器的名字, 在啟動容器時可以通過--name參數顯示地為容器命名, 如果不指定, docker 會自動為容器分配名字。
對於容器的後續操作, 我們需要通過 “長ID”、“短ID” 或者 “名稱” 來指定要操作的容器。 比如下面停止一個容器:
這裡我們就是通過 “短ID” 指定了要停止的容器。
通過 while啟動的容器雖然能夠保持運行, 但實際上沒有幹什麼有意義的事情。 容器常見的用途是運行後臺服務, 例如前面我們已經看到的 http server:
這一次我們用 --name指定了容器的名字。 我們還看到容器運行的命令是httpd-foreground, 通過docker history可知這個命令是通過 CMD 指定的。
我們經常需要進到容器裡去做一些工作,