天天看點

docker專題(2):docker常用管理指令(下)

容器可以通過<code>run</code>建立一個來運作,也可以重新<code>start</code>已經停止的container,但<code>start</code>不能夠再指定容器啟動時運作的指令,因為docker隻能有一個前台程序。

容器stop(或<code>Ctrl+D</code>)時,會在儲存目前容器的狀态之後退出,下次start時保有上次關閉時更改。而且每次進入<code>attach</code>進去的界面是一樣的,與第一次run啟動或commit送出的時刻相同。

要<code>attach</code>上去的容器必須正在運作,可以同時連接配接上同一個container來共享螢幕(與<code>screen</code>指令的attach類似)。

官方文檔中說<code>attach</code>後可以通過<code>CTRL-C</code>來detach,但實際上經過我的測試,如果container目前在運作bash,<code>CTRL-C</code>自然是目前行的輸入,沒有退出;如果container目前正在前台運作程序,如輸出nginx的access.log日志,<code>CTRL-C</code>不僅會導緻退出容器,而且還stop了。這不是我們想要的,detach的意思按理應該是脫離容器終端,但容器依然運作。好在<code>attach</code>是可以帶上<code>--sig-proxy=false</code>來確定<code>CTRL-D</code>或<code>CTRL-C</code>不會關閉容器。

<code>inspect</code>的對象可以是image、運作中的container和停止的container。

你可能在使用過程中會<code>build</code>或<code>commit</code>許多鏡像,無用的鏡像需要删除。但删除這些鏡像是有一些條件的:

同一個<code>IMAGE ID</code>可能會有多個<code>TAG</code>(可能還在不同的倉庫),首先你要根據這些 image names 來删除标簽,當删除最後一個tag的時候就會自動删除鏡像;

承上,如果要删除的多個<code>IMAGE NAME</code>在同一個<code>REPOSITORY</code>,可以通過<code>docker rmi &lt;image_id&gt;</code>來同時删除剩下的<code>TAG</code>;若在不同Repo則還是需要手動逐個删除<code>TAG</code>;

還存在由這個鏡像啟動的container時(即便已經停止),也無法删除鏡像;

TO-DO 如何檢視鏡像與容器的依存關系

删除容器

<code>docker rm &lt;container_id/contaner_name&gt;</code>

删除鏡像

<code>docker rmi &lt;image_id/image_name ...&gt;</code>

下面是一個完整的示例:

注意,上面的删除過程我所舉的例子比較特殊——鏡像被tag在多個倉庫,也有啟動過的容器。按照<code>&lt;==</code>訓示的順序進行即可。

<code>build</code>指令可以從<code>Dockerfile</code>和上下文來建立鏡像:

<code>docker build [OPTIONS] PATH | URL | -</code>

上面的<code>PATH</code>或<code>URL</code>中的檔案被稱作上下文,build image的過程會先把這些檔案傳送到docker的服務端來進行的。

請看下面的例子:

上面的<code>PATH</code>為<code>.</code>,是以在目前目錄下的所有檔案(不包括<code>.dockerignore</code>中的)将會被<code>tar</code>打包并傳送到<code>docker daemon</code>(一般在本機),從輸出我們可以到<code>Sending build context...</code>,最後有個<code>Removing intermediate container</code>的過程,可以通過<code>--rm=false</code>來保留容器。

TO-DO

<code>docker build github.com/creack/docker-firefox</code>失敗。

tag的作用主要有兩點:一是為鏡像起一個容易了解的名字,二是可以通過<code>docker tag</code>來重新指定鏡像的倉庫,這樣在<code>push</code>時自動送出到倉庫。

<code>docker ps</code>指令可以檢視容器的<code>CONTAINER ID</code>、<code>NAME</code>、<code>IMAGE NAME</code>、端口開啟及綁定、容器啟動後執行的<code>COMMNAD</code>。經常通過<code>ps</code>來找到<code>CONTAINER_ID</code>。

<code>docker ps</code> 預設顯示目前正在運作中的container

<code>docker ps -a</code> 檢視包括已經停止的所有容器

<code>docker ps -l</code> 顯示最新啟動的一個容器(包括已停止的)

容器運作時不一定有<code>/bin/bash</code>終端來互動執行top指令,檢視container中正在運作的程序,況且還不一定有<code>top</code>指令,這是<code>docker top &lt;container_id/container_name&gt;</code>就很有用了。實際上在host上使用<code>ps -ef|grep docker</code>也可以看到一組類似的程序資訊,把container裡的程序看成是host上啟動docker的子程序就對了。

docker還有一些如<code>login</code>、<code>cp</code>、<code>logs</code>、<code>export</code>、<code>import</code>、<code>load</code>、<code>kill</code>等不是很常用的指令,比較簡單,請參考官網。

本文轉自 h2appy  51CTO部落格,原文連結:http://blog.51cto.com/h2appy/1865360,如需轉載請自行聯系原作者

繼續閱讀