Container Docker 容器

Docker工具新手入門 用指令熟悉容器生命週期

2017-08-03
上期的文章已經詳細介紹過什麼是「容器」(Container),並指出它與虛擬化技術的差異在那裡。有了基本的觀念之後,本文將繼續說明說明與Docker容器相關的工具以及專有名詞,讓大家對於Docker容器技術有更進一步的了解。

何謂容器生命週期與操作

容器(Container)是用來包裝應用程式和相關函式庫,也稱作執行時期(Runtime)的實例(Instance,亦適用於虛擬技術),故整個容器生命週期,先取得映像檔(Image,如虛擬機映像檔),如圖6下方的「docker pull IMAGE_NAME」指令,亦可自行撰寫Dockerfile,然後在相同目錄執行「docker build .」以產生映像檔。

映像檔是靜態形式,透過「docker create IMAGE_NAME」產生出準備運作的容器,再執行「docker start CONTAINER_ID」啟動此容器,或是使用「docker run IMAGE_NAME」直接啟動成運行中的容器。

另外,「docker ps」指令可以查看目前運作中的容器狀態,或是用「docker ps -a」查看所有的容器狀態,包含已停止運作的容器,而「docker stop CONTAINER_ID」用來停止容器運行,最後使用「docker rm CONTAINER_ID」,則是刪除不需要的容器。

接下來,採用ubuntu映像檔當範例,詳細步驟如下:


執行「docker pull ubuntu」,取得ubuntu映像檔。


執行指令「docker create -ti --name u1 ubuntu」,建立準備執行的容器,並以終端機和互動模式(-ti)啟動,並且命名為u1(--name u1)。


使用「docker start -i u1」指令啟動剛建立的容器,並進入其互動模式(-i),或是執行「docker start u1」單純啟動,而不進入容器中。若進入容器中,則可輸入「exit」指令離開。


執行「docker ps」或「docker ps -a」指令查看容器的執行狀態,並比較其差異。


在步驟3使用「docker start u1」指令啟動,則可以利用「docker attach u1」進入容器,一樣輸入「exit」指令離開,容器就會停止,或是輸入ctrl-p ctrl-q便可跳離容器,但不停止容器。也可以使用「docker exec -ti u1 bash」進入容器,差異在於exec指令是另外建立新的終端機Session,所以輸入「exit」離開,容器並不會停止運作。


其實create和start兩個步驟,可以單用run一次就完成。使用「docker run -ti u1 bash」,直接啟動容器並進入終端互動模式(-ti),個人偏好使用run,較方便易用。


然後,執行「docker stop u1」停止u1容器,若是使用「docker start -i u1」啟動,當輸入「exit」時,容器就已經停止。


當容器停止後,其容器和內部資料仍舊存在著,但使用「docker rm u1」刪除掉u1容器之後,所有u1相關的資訊便會清除消失。

以上就是簡單介紹容器使用的生命週期和方式,當然更詳細的參數,請參閱相關書籍或查看官方說明文件(https://docs.docker.com/engine/reference/commandline/cli/)。應用式容器與系統式容器使用風格完全不同,容器的建立和刪除非常頻繁,一旦應用程式改版就會換掉整個容器映像檔,正好就是基礎架構即程式碼中「不可變伺服器」的思維方式,因此容器使用就像湯姆克魯斯的《明日邊界》電影一樣,「Live, Die and Repeat」,不斷重複容器生命週期。


▲圖6 Docker指令對照圖。(資料來源:https://www.gitbook.com/book/philipzheng/docker_practice/details)

學會映像檔相關指令

前面介紹過pull和build兩個與映像檔有關的指令,其實與映像檔有關的指令還包括「docker tag」,可設定映像檔別名,用以識別和上傳到私有Docker Registry的命名使用,而「docker images」則可查詢本機存放了哪些映像檔。當然,對照到「docker rm」刪除容器,「docker rmi」便是刪除映像檔。

映像檔也可儲存成tar壓縮檔,執行「docker save ubuntu > ubuntu.tar」就可將ubuntu映像檔另存成ubuntu.tar壓縮檔。相對地,從tar壓縮檔匯入為「docker load < ubuntu.tar」。

如果想知道映像檔是如何建置,可以執行「docker history ubuntu」,便會列出映像檔每一資料層(Layer)的Dockerfile指令,之後會介紹如何撰寫Dockerfile。

熟悉容器相關指令

除了前面生命週期介紹了幾個常用指令,容器還包含其他重要指令,例如查看容器執行狀況的標準輸出,「docker logs CONTAINER_ID」可列出容器運作所占用的CPU、記憶體等資源。還有「docker stats CONTAINER_ID」,最重要是「docker inspect CONTAINER_ID」,可列出整個容器相關資訊,包含網路、連接埠對應、容器存放位置等等。

至於「docker pause CONTAINER_ID」和「docker unpause CONTAINER_ID」指令則是暫停容器運作,以及恢復容器運作,這與stop指令差異在於,pause是Process(程序)層級,將程序暫停,而stop是容器層級。舉例來說,以nginx來示範,執行「docker run -d -p 80:80 --name n1 nginx」,可啟動nginx容器,並以背景模式(-d)運行,並對應本機http 80 port(「-p 80:80」,第一個80是本機連接埠號,第二個80是容器連接埠號),開啟網頁輸入網址「http://localhost/」,可看到nginx歡迎畫面。接著執行「docker pause n1」重新載入網頁,會發現nginx沒有反應,但執行「docker ps」查看容器狀態仍在運作。此時輸入「docker unpause n1」,便馬上回復並載入網頁。

Docker Hub/Registry相關指令簡介

前面談論到pull從Docker Hub/Registry取得映像檔,當然也可以push將本機端映像檔推送到Docker Hub和私有Docker Registry,必須具備Docker Hub帳號,執行「docker login」,依指示輸入帳號密碼,接著把ubuntu另外命名為USERNAME/ubuntu,指令為「docker tag philipz/ubuntu」。


追蹤我們Featrue us

本站使用cookie及相關技術分析來改善使用者體驗。瞭解更多

我知道了!