容器可以通過<code>run</code>建立一個來運作,也可以重新<code>start</code>已經停止的container,但<code>start</code>不能夠再指定容器啟動時運作的指令,因為docker隻能有一個前台程序。
容器stop(或<code>Ctrl+D</code>)時,會在儲存目前容器的狀态之後退出,下次start時保有上次關閉時更改。而且每次進入<code>attach</code>進去的界面是一樣的,與第一次run啟動或commit送出的時刻相同。
<code>CONTAINER_ID=$(docker start <containner_id>)</code>
<code>docker stop $CONTAINER_ID</code>
<code>docker restart $CONTAINER_ID</code>
要<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># docker attach --sig-proxy=false $CONTAINER_ID</code>
<code>inspect</code>的對象可以是image、運作中的container和停止的container。
<code>檢視容器的内部IP</code>
<code># docker inspect --format='{\{.NetworkSettings.IPAddress}}' $CONTAINER_ID</code>
<code>172.17.42.35</code>
<code>(注:由于代碼塊解析的問題,上面NetworkSettings前面的 \ 去掉)</code>
你可能在使用過程中會<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 <image_id></code>來同時删除剩下的<code>TAG</code>;若在不同Repo則還是需要手動逐個删除<code>TAG</code>;
還存在由這個鏡像啟動的container時(即便已經停止),也無法删除鏡像;
TO-DO
如何檢視鏡像與容器的依存關系
删除容器
<code>docker rm <container_id/contaner_name></code>
<code>删除所有停止的容器</code>
<code>docker </code><code>rm</code> <code>$(docker </code><code>ps</code> <code>-a -q)</code>
删除鏡像
<code>docker rmi <image_id/image_name ...></code>
下面是一個完整的示例:
<code># docker images <==</code>
<code>ubuntu 13.10 195eb90b5349 4 months ago 184.6 MB</code>
<code>ubuntu saucy 195eb90b5349 4 months ago 184.6 MB</code>
<code>seanlook</code><code>/ubuntu</code> <code>rm_test 195eb90b5349 4 months ago 184.6 MB</code>
<code>使用195eb90b5349啟動、停止一個容器後,删除這個鏡像</code>
<code># docker rmi 195eb90b5349</code>
<code>Error response from daemon: Conflict, cannot delete image 195eb90b5349 because it is </code>
<code>tagged </code><code>in</code> <code>multiple repositories, use -f to force</code>
<code>2014</code><code>/11/04</code> <code>14:19:00 Error: failed to remove one or </code><code>more</code> <code>images</code>
<code>删除seanlook倉庫中的tag <==</code>
<code># docker rmi seanlook/ubuntu:rm_test</code>
<code>Untagged: seanlook</code><code>/ubuntu</code><code>:rm_test</code>
<code>現在删除鏡像,還會由于container的存在不能rmi</code>
<code>Error response from daemon: Conflict, cannot delete 195eb90b5349 because the </code>
<code> </code><code>container eef3648a6e77 is using it, use -f to force</code>
<code>2014</code><code>/11/04</code> <code>14:24:15 Error: failed to remove one or </code><code>more</code> <code>images</code>
<code>先删除由這個鏡像啟動的容器 <==</code>
<code># docker rm eef3648a6e77</code>
<code>删除鏡像 <==</code>
<code>Deleted: 195eb90b534950d334188c3627f860fbdf898e224d8a0a11ec54ff453175e081</code>
<code>Deleted: 209ea56fda6dc2fb013e4d1e40cb678b2af91d1b54a71529f7df0bd867adc961</code>
<code>Deleted: 0f4aac48388f5d65a725ccf8e7caada42f136026c566528a5ee9b02467dac90a</code>
<code>Deleted: fae16849ebe23b48f2bedcc08aaabd45408c62b531ffd8d3088592043d5e7364</code>
<code>Deleted: f127542f0b6191e99bb015b672f5cf48fa79d974784ac8090b11aeac184eaaff</code>
注意,上面的删除過程我所舉的例子比較特殊——鏡像被tag在多個倉庫,也有啟動過的容器。按照<code><==</code>訓示的順序進行即可。
<code>build</code>指令可以從<code>Dockerfile</code>和上下文來建立鏡像:
<code>docker build [OPTIONS] PATH | URL | -</code>
上面的<code>PATH</code>或<code>URL</code>中的檔案被稱作上下文,build image的過程會先把這些檔案傳送到docker的服務端來進行的。
請看下面的例子:
<code># cat Dockerfile </code>
<code>FROM seanlook</code><code>/nginx</code><code>:bash_vim</code>
<code>EXPOSE 80</code>
<code>ENTRYPOINT </code><code>/usr/sbin/nginx</code> <code>-c </code><code>/etc/nginx/nginx</code><code>.conf && </code><code>/bin/bash</code>
<code># docker build -t seanlook/nginx:bash_vim_Df .</code>
<code>Sending build context to Docker daemon 73.45 MB</code>
<code>Sending build context to Docker daemon </code>
<code>Step 0 : FROM seanlook</code><code>/nginx</code><code>:bash_vim</code>
<code> </code><code>---> aa8516fa0bb7</code>
<code>Step 1 : EXPOSE 80</code>
<code> </code><code>---> Using cache</code>
<code> </code><code>---> fece07e2b515</code>
<code>Step 2 : ENTRYPOINT </code><code>/usr/sbin/nginx</code> <code>-c </code><code>/etc/nginx/nginx</code><code>.conf && </code><code>/bin/bash</code>
<code> </code><code>---> Running </code><code>in</code> <code>e08963fd5afb</code>
<code> </code><code>---> d9bbd13f5066</code>
<code>Removing intermediate container e08963fd5afb</code>
<code>Successfully built d9bbd13f5066</code>
上面的<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>來保留容器。
<code>docker build github.com/creack/docker-firefox</code>失敗。
tag的作用主要有兩點:一是為鏡像起一個容易了解的名字,二是可以通過<code>docker tag</code>來重新指定鏡像的倉庫,這樣在<code>push</code>時自動送出到倉庫。
<code>将同一IMAGE_ID的所有tag,合并為一個新的</code>
<code># docker tag 195eb90b5349 seanlook/ubuntu:rm_test</code>
<code>建立一個tag,保留舊的那條記錄</code>
<code># docker tag Registry/Repos:Tag New_Registry/New_Repos:New_Tag</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 <container_id/container_name></code>就很有用了。實際上在host上使用<code>ps -ef|grep docker</code>也可以看到一組類似的程序資訊,把container裡的程序看成是host上啟動docker的子程序就對了。
将主機/www/runoob目錄拷貝到容器96f7f14e99ab的/www目錄下。
<code>docker </code><code>cp</code> <code>/www/runoob</code> <code>96f7f14e99ab:</code><code>/www/</code>
将主機/www/runoob目錄拷貝到容器96f7f14e99ab中,目錄重命名為www。
<code>docker </code><code>cp</code> <code>/www/runoob</code> <code>96f7f14e99ab:</code><code>/www</code>
将容器96f7f14e99ab的/www目錄拷貝到主機的/tmp目錄中。
<code>docker </code><code>cp</code> <code>96f7f14e99ab:</code><code>/www</code> <code>/tmp/</code>
10、docker 容器保持背景運作的兩種方式
10.1 run一個容器: (推薦方法)
<code>[root@localhost ~]</code><code># docker run -dit --hostname centos --name centos --restart always a8493f5f50ff /bin/bash</code>
<code> </code>
<code>-dit 是背景運作、互動模式、配置設定終端,容器啟動後不會退出</code>
<code> </code><code>如果沒有it參數,run 一個容器以後,docker </code><code>ps</code> <code>-a 容器狀态就exited了</code>
<code>--restart always 容器可以随docker服務啟動而啟動</code>
10.2 run 一個容器,并一直發送ping包
<code>[root@localhost ~]</code><code># docker run -d --name test --hostname test a8493f5f50ff ping 127.0.0.1</code>
開啟ping程序,則主機一直運作
本文轉自 jackjiaxiong 51CTO部落格,原文連結:http://blog.51cto.com/xiangcun168/1958278