Docker鏡像與容器命令 專題



https://yeasy.gitbooks.io/docker_practice/content/install/mirror.html

 

docker的工作流程圖:

至少需要配備三樣東西去使用docker容器:

Docker 主機:Docker容器將會在上面運行的Linux虛擬主機。.
Docker 鏡像: 類似於運行在vm虛擬機上的iso鏡像,但它們是高度精簡的版本。所有已經存在於docker主機上的多余的包或庫都會被移除掉。
Docker 容器:Docker鏡像的快照,你可以啟動、停止、修改它們,或者將它們作為另一個鏡像來發布。


Docker是一個開源的引擎,可以輕松的為任何應用創建一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試通過的容器可以批量地在生產環境中部署,包括VMs(虛擬機)、bare metal、OpenStack 集群和其他的基礎應用平台。 
Docker通常用於如下場景:
web應用的自動化打包和發布;
自動化測試和持續集成、發布;
在服務型環境中部署和調整數據庫或其他的后台應用;

從頭編譯或者擴展現有的OpenShift或Cloud Foundry平台來搭建自己的PaaS環境。

一、鏡像相關命令

1、獲取鏡像

 

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. sudo docker pull ubuntu:12.04  

 

 

2、列出本地鏡像

 

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. sudo docker images  

 

 

在列出信息中,可以看到幾個字段信息

來自於哪個倉庫,比如 ubuntu
鏡像的標記,比如 14.04
它的 ID 號(唯一)
創建時間
鏡像大小
其中鏡像的 ID 唯一標識了鏡像,注意到 ubuntu:14.04 和 ubuntu:trusty 具有相同的鏡像 ID,說明它們實際上是同一鏡像。
TAG 信息用來標記來自同一個倉庫的不同鏡像。例如 ubuntu 倉庫中有多個鏡像,通過 TAG 信息來區分發行版本,例如 10.04、12.04、12.10、13.04、14.04 等。例如下面的命令指定使用鏡像 ubuntu:14.04 來啟動一個容器。

3、創建鏡像

 

方法一:

 

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. docker commit  

方法二:

 

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. dockerFile  

 

4、移除本地鏡像

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. 可以使用 docker rmi 命令。注意 docker rm 命令是移除容器。  

*注意:在刪除鏡像之前要先用 docker rm 刪掉依賴於這個鏡像的所有容器。

5、存出和載入鏡像
存出鏡像
如果要導出鏡像到本地文件,可以使用 docker save 命令。

6、載入鏡像

可以使用 docker load 從導出的本地文件中再導入到本地鏡像庫,例如

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. sudo docker load --input ubuntu_14.04.tar  

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. $ sudo docker load < ubuntu_14.04.tar  


這將導入鏡像以及其相關的元數據信息(包括標簽等)。

 

 

二、容器相關命令

1、啟動容器

啟動容器有兩種方式,一種是基於鏡像新建一個容器並啟動,另外一個是將在終止狀態(stopped)的容器重新啟動。

因為 Docker 的容器實在太輕量級了,很多時候用戶都是隨時刪除和新創建容器。所需要的命令主要為 docker run。
(1)新建並啟動

下面的命令則啟動一個 bash 終端,允許用戶進行交互。

 

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. sudo docker run -t -i training/sinatra /bin/bash  

 

其中,-t 選項讓Docker分配一個偽終端(pseudo-tty)並綁定到容器的標准輸入上, -i 則讓容器的標准輸入保持打開。也可以合並起來寫

 

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. sudo docker run -ti ubuntu:14.04 /bin/bash  

 

可見,容器中僅運行了指定的 bash 應用。這種特點使得 Docker 對資源的利用率極高,是貨真價實的輕量級虛擬化。不加-t -i的話,執行完就退出容器例如,下面的命令輸出一個 “Hello World”,之后終止容器。

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. sudo docker run ubuntu:14.04 /bin/echo 'Hello world'  


這跟在本地直接執行 /bin/echo 'hello world' 幾乎感覺不出任何區別。

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1.   

 

在交互模式下,用戶可以通過所創建的終端來輸入命令,例如

如果,只想讓容器在后台運行呢?那就看下面的吧!

(2)守護態運行更多的時候,需要讓 Docker 容器在后台以守護態(Daemonized)形式運行。此時,可以通過添加 -d 參數來實現。例如下面的命令會在后台運行容器。

 

容器啟動后會返回一個唯一的 id,也可以通過 docker ps 命令來查看容器信息。

 

然后使用

 

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. docker attach 容器name  

就可以進入容器交互界面
容器name可以通過以下獲得

 

 

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. docker ps -a   

如進入上面的:

 

然后進入:

 

 

當利用 docker run 來創建容器時,Docker 在后台運行的標准操作包括:
檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
利用鏡像創建並啟動一個容器
分配一個文件系統,並在只讀的鏡像層外面掛載一層可讀寫層
從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
從地址池配置一個 ip 地址給容器
執行用戶指定的應用程序
執行完畢后容器被終止

(3)啟動終止的容器

可以利用 docker start + 容器ID,命令,直接將一個已經終止的容器啟動運行。

先找到要啟動容器的id

 

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. docker ps -a  

 

Exited表示的就是終止的。然后使用

 

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. docker start b3f9d3239bed   

 

上面我以后台運行的方式啟動了兩個新的容器

這是以后台運行的方式來執行的,那怎樣才能再進入容器呢?可以用docker attact +容器name

先通過docker ps -a 取得正在運行的容器名字,然后

 

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. docker attach goofy_mclean  

 

如下:

容器的核心為所執行的應用程序,所需要的資源都是應用程序運行所必需的。除此之外,並沒有其它的資源。可以在偽終端中利用 ps 或 top 來查看進程信息。

(4)退出container但是保持運行

默認情況下,如果使用ctrl-d退出container,那么container也會stop,按ctrl-p ctrl-q可以退出到宿主機,而保持container仍然在運行.然后要進入再使用docker attach

 

2、停止容器

輸入exit或ctrl+d

3、獲取容器信息

要獲取容器的輸出信息,可以通過 docker logs 命令。

 

[plain]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. docker logs 容器name  

 

4、在容器中安裝新的程序

下一步我們要做的事情是在容器里面安裝一個簡單的程序(ping)。我們之前下載的tutorial鏡像是基於ubuntu的,所以你可以使用ubuntu的apt-get命令來安裝ping程序:apt-get install -y ping。
備注:apt-get 命令執行完畢之后,容器就會停止,但對容器的改動不會丟失。

5、保存對容器的修改
當你對某一個容器做了修改之后(通過在容器中運行某一個命令),可以把對容器的修改保存下來,這樣下次可以從保存后的最新狀態運行該容器。docker中保存狀態的過程稱之為committing,它保存的新舊狀態之間的區別,從而產生一個新的版本。或者當結束后,我們使用 exit 來退出,現在我們的容器已經被我們改變了,使用 docker commit 命令來提交更新后的副本。

先取得修改后的容器ID

保存容器,實際上就是保存成了一個新的鏡像

 

其中,-m 來指定提交的說明信息,跟我們使用的版本控制工具一樣;-a 可以指定更新的用戶信息;之后是用來創建鏡像的容器的 ID;最后指定目標鏡像的倉庫名和 tag 信息。創建成功后會返回這個鏡像的 ID 信息。

 

使用 docker images 來查看新創建的鏡像。

 


之后,可以使用新的鏡像來啟動容器

 

6、刪除容器

可以使用 docker rm 來刪除一個處於終止狀態的容器。 例如

 


如果要刪除一個運行中的容器,可以添加 -f 參數。Docker 會發送 SIGKILL 信號給容器。

 

7、檢查運行中的容器

使用docker ps命令可以查看所有正在運行中的容器列表,使用docker inspect命令我們可以查看更詳細的關於某一個容器的信息。查找某一個運行中容器的id,然后使用docker inspect命令查看容器的信息。可以使用鏡像id的前面部分,不需要完整的id。

備注:

刪除命令匯總

 

docker images往往不知不覺就占滿了硬盤空間,為了清理冗余的image,可采用以下方法:

1.進入root權限

sudo su

2.停止所有的container,這樣才能夠刪除其中的images:

docker stop $(docker ps -a -q)

如果想要刪除所有container的話再加一個指令:

docker rm $(docker ps -a -q)

3.查看當前有些什么images

docker images

4.刪除images,通過image的id來指定刪除誰

docker rmi <image id>

想要刪除untagged images,也就是那些id為<None>的image的話可以用

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

要刪除全部image的話

docker rmi $(docker images -q)

http://blog.csdn.net/evankaka/article/details/49866265

當以Dockerfile掛在主機上的目錄是出現oci runtime error

或在Docker Share Drive分享主機磁碟機出現Firewall Detected. A firewall is blocking file Sharing between Windows and the containers.

出現這個現象在Docker for Windows上可以怎樣做?

這個問題在不同的Docker for Windows版本都有可能出現, 而我當前版本是1.13.0 (9861)

問題出現後第二天已經又有1.13.0-Beta38可以更新了

在我的一台Windows 10裡一直都有分享主機磁碟機來做Share Drive給Docker Container使用

有一天當我在測試Dockerfile時意外出現一個oci runtime error錯誤

這時在docker-compose.yml只要不用Volume把host和container的儲存位置對映就能繼續下去

找了一下原因, 重新檢查Share Drive 設定時, 正當想要重新設計Share Drive時

出現了一個有關防火牆阻礙分享磁碟機的錯誤訊息

錯誤訊息明顯地指出是防火牆的問題

Github上有不少關於這個錯誤訊息的討論, 而這應該是Docker for Windows獨有的

但在不同的版本上雖然錯誤訊息是一樣的但原因和解決的辦法卻不同

https://github.com/docker/for-win/issues/114

https://github.com/docker/for-win/issues/355

而我最後也能解決問題, 這裡列舉一些動作樣同樣出現問題的人可以試試

1. 關閉防火牆

如同錯誤訊息所示, 我們應該先排除是防火牆阻擋了些甚麼

如果你關閉了防火牆後就正常運作了, 請重新檢查DockerSmbMount這個Docker安裝時設定的防火牆規則有沒有存在

但Github上通常都說如果真的關閉防火牆就能解決的話, 就只能繼續關閉防火牆才能繼續等待更新文件.

 

2. 重新分享磁碟機

Docker Setting裡沒有清除分享的功能, 那個分享的勾勾可以使使消掉再Apply

但我的情況是反勾了都沒有反應, 如果你鍵入net share, 你仍然會見到C$在表列當中

你要以Administrator身份開啟Powershell , 鍵入Net share c$ /delete  (假設你是分享了C:\ )

之後再試試在Docker裡分享一次磁碟機看看有沒有成功.

 

3. 重設Docker使用的分享用帳號

Docker Shared Drive版面上有"Reset Credentials"的功能

我最後是用這個方式解決問題的, 但我們要先建立一個帳號來使用

開啟Computer Management, 在User選擇New User

建立一個普通使用者帳號, 如dockershare

回到Shared Drives, 按Reset credentials
輸入你剛剛建立的帳號密碼

再到Reset頁選擇Restart Docker, 等待Docker重啟後, 我到這裡就解決問題了


這個問題從2016年中就間斷地出現在某些Docker for Windows版本上

希望這篇文章可以幫助到其他遇到問題的朋友

https://dotblogs.com.tw/swater111/2017/01/26/101009








免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM