上一章咱們學習瞭如何構建 Docker 鏡像,並經過鏡像運行容器。本章將深刻討論容器:學習容器的各類操做,容器各類狀態之間如何轉換,以及實現容器的底層技術。docker
docker run
是啓動容器的方法。在討論 Dockerfile 時咱們已經學習到,可用三種方式指定容器啓動時執行的命令:bash
CMD 指令。學習
ENTRYPOINT 指令。spa
在 docker run
命令行中指定。命令行
例以下面的例子:調試
容器啓動時執行 pwd
,返回的 /
是容器中的當前目錄。 執行 docker ps
或 docker container ls
能夠查看 Docker host 中當前運行的容器:日誌
咦,怎麼沒有容器?用 docker ps -a
或 docker container ls -a
看看。code
-a
會顯示全部狀態的容器,能夠看到,以前的容器已經退出了,狀態爲Exited
。orm
這種「一閃而過」的容器一般不是咱們想要的結果,咱們但願容器可以保持 runing 狀態,這樣才能被咱們使用。server
如何讓容器保存運行呢?
由於容器的生命週期依賴於啓動時執行的命令,只要該命令不結束,容器也就不會退出。
理解了這個原理,咱們就能夠經過執行一個長期運行的命令來保持容器的運行狀態。例如執行下面的命令:
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:
這一次咱們用 --name
指定了容器的名字。 咱們還看到容器運行的命令是httpd-foreground
,經過 docker history
可知這個命令是經過 CMD 指定的。
咱們常常須要進到容器裏去作一些工做,好比查看日誌、調試、啓動其餘進程等。下一節學習如何進入容器內部。