Docker鏡像與容器命令專題

NO IMAGE
developerguy 2016-03-13 13:50:00 瀏覽19 評論0

docker ubuntu windows 鏡像 主機 容器 Image view

摘要:

docker的工作流程圖: 至少需要配備三樣東西去使用docker容器: Docker 主機:Docker容器將會在上面運行的Linux虛擬主機。.Docker 鏡像: 類似於運行在vm虛擬機上的iso鏡像,但它們是高度精簡的版本。

docker的工作流程圖:

Docker鏡像與容器命令專題

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

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


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

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

一、鏡像相關命令

1、獲取鏡像

  1. sudo docker pull ubuntu:12.04
Docker鏡像與容器命令專題

2、列出本地鏡像

  1. sudo docker images
Docker鏡像與容器命令專題

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

來自於哪個倉庫,比如 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、創建鏡像

方法一:

  1. docker commit

方法二:

  1. dockerFile

4、移除本地鏡像

  1. 可以使用 docker rmi 命令。注意 docker rm 命令是移除容器。

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

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

Docker鏡像與容器命令專題

6、載入鏡像

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

  1. sudo docker load –input ubuntu_14.04.tar

  1. $ sudo docker load < ubuntu_14.04.tar


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

二、容器相關命令

1、啟動容器

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

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

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

  1. sudo docker run -t -i training/sinatra /bin/bash

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

  1. sudo docker run -ti ubuntu:14.04 /bin/bash
Docker鏡像與容器命令專題

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

  1. sudo docker run ubuntu:14.04 /bin/echo ‘Hello world’
Docker鏡像與容器命令專題


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

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

Docker鏡像與容器命令專題

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

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

Docker鏡像與容器命令專題

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

然後使用

  1. docker attach 容器name

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

  1. docker ps -a

如進入上面的:

Docker鏡像與容器命令專題

然後進入:

Docker鏡像與容器命令專題

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

(3)啟動終止的容器

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

先找到要啟動容器的id

  1. docker ps -a

Docker鏡像與容器命令專題

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

  1. docker start b3f9d3239bed

Docker鏡像與容器命令專題

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

Docker鏡像與容器命令專題

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

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

  1. docker attach goofy_mclean

如下:

Docker鏡像與容器命令專題

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

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

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

2、停止容器

輸入exit或ctrl+d

Docker鏡像與容器命令專題

3、獲取容器信息

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

  1. docker logs 容器name

Docker鏡像與容器命令專題

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

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

Docker鏡像與容器命令專題

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

先取得修改後的容器ID

Docker鏡像與容器命令專題

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

Docker鏡像與容器命令專題

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

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

Docker鏡像與容器命令專題


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

Docker鏡像與容器命令專題

6、刪除容器

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

Docker鏡像與容器命令專題


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

7、檢查運行中的容器

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

Docker鏡像與容器命令專題

備註:

刪除命令彙總

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鏡像與容器命令專題這時在docker-compose.yml只要不用Volume把host和container的儲存位置對映就能繼續下去

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

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

Docker鏡像與容器命令專題

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

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

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

github.com/docker/for-…

github.com/docker/for-…

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

1. 關閉防火牆

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

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

Docker鏡像與容器命令專題

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

2. 重新分享磁碟機

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

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

Docker鏡像與容器命令專題

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

Docker鏡像與容器命令專題之後再試試在Docker裡分享一次磁碟機看看有沒有成功.

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

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

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

開啟Computer Management, 在User選擇New User

Docker鏡像與容器命令專題建立一個普通使用者帳號, 如dockershare

Docker鏡像與容器命令專題

回到Shared Drives, 按Reset credentials
Docker鏡像與容器命令專題輸入你剛剛建立的帳號密碼

Docker鏡像與容器命令專題

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

Docker鏡像與容器命令專題
這個問題從2016年中就間斷地出現在某些Docker for Windows版本上

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

https://dotblogs.com.tw/swater111/2017/01/26/101009
本文為雲棲社區原創內容,未經允許不得轉載,如需轉載請發送郵件至[email protected];如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至:[email protected] 進行舉報,並提供相關證據,一經查實,本社區將立刻刪除涉嫌侵權內容。

原文鏈接

相關文章

阿里雲容器服務新增支持Kubernetes編排系統,性能重大提升

【Linux】Linux服務器搭建JDK環境

【Linux】Linux下修改主機名簡單三步搞定

從商用到開源:DB2遷移至MySQL的最佳實踐