Docker 鏡像管理


Docker 鏡像管理

 

 本節內容簡介

第一節實驗中我們已經接觸了一些鏡像的概念,簡單的說鏡像就是一個容器的只讀模板,用來創建容器。當運行容器時需要指定鏡像,如果本地沒有該鏡像,則會從Docker Registry下載。默認查找的是Docker Hub。Docker的鏡像是增量的修改,每次創建新的鏡像都會在老的鏡像上面構建一個增量的,使用到的技術是Another Union File System(AUFS),感興趣的同學可以學習文檔InfoQ:剖析Docker文件系統:Aufs與Devicemapper(http://www.infoq.com/cn/articles/analysis-of-docker-file-system-aufs-and-devicemapper/)。

本節中,我們需要依次完成下面幾項任務:

  1. 使用Docker Hub查找和下載鏡像
  2. 創建鏡像
  3. 查看鏡像信息
  4. 導入和導出鏡像
  5. 修改鏡像
  6. 刪除鏡像

一、使用Docker Hub

鏡像存儲中的核心概念倉庫(Repository)是鏡像存儲的位置。Docker 注冊服務器(Registry)是倉庫存儲的位置。每個倉庫包含不同的鏡像。

比如一個鏡像名稱 ubuntu:14.04,冒號前面的ubuntu是倉庫名,后面的14.04是TAG,不同的TAG可以對應相同的鏡像,TAG通常設置為鏡像的版本號。

Docker Hub 是Docker官方提供公共倉庫,提供大量的常用鏡像,由於國內網絡原因經常連接Docker Hub會比較慢,所以我們也可以選擇一些國內提供類似Docker Hub鏡像服務站點。連接Docker Hub的常用命令包括:

  1. 搜索鏡像 docker search
  2. 下載鏡像 docker pull

本節實驗中,我們需要一個busybox鏡像,首先首先進行搜索,然后使用docker pull下載到本地:

查找到的數據中包含倉庫名稱,描述,以及有多少人關注。我們只需要下載最基本的Busybox base image就可以。

查找命令返回的結果中通常可以看到不同版本的busybox,不指定版本號默認下載busybox:latest

使用 docker pull 命令將鏡像下載到本地:

我們也可以在Docker Hub上創建一個賬戶,用來保存所需的鏡像,但是在國內使用實在是太慢了。這里簡單介紹下Docker中使用命令登陸Docker Hub保存鏡像的方式:

  1. 首先在Docker Hub注冊一個賬號:注冊鏈接
  2. 然后可以基於Docker Hub上現有的鏡像創建一個鏡像
  3. 在本地完成修改后使用docker push命令推送到Docker Hub上

此外,Docker Hub提供一個強大的自動創建鏡像的功能,可以設定跟蹤某個鏡像中安裝的軟件,如果有更新則自動重新構建新的鏡像。更多有趣的功能可以登錄到Docker Hub 官網進行體驗。在此不做更多介紹。

如果想創建一個本地的Docker Hub,在后續實驗中我們會學習如何在本地搭建一個Registry服務器。

二、創建鏡像

1、下載鏡像 docker pull

在本地創建鏡像的方法有幾種,最簡單的是直接從Registry服務器上下載。上一節實驗中已經有介紹:

鏡像下載中可以看到是分層下載,每一層都有一個唯一的ID值表示,每層下載的大小實際為該層進行的修改增量。


2、創建鏡像 Dockerfile

后續章節中我們會詳細介紹Dockerfile的編寫,這里僅僅介紹最簡單的使用。

Dockerfile 可以很方便的基於已有鏡像創建新的鏡像。Dockerfile文件里包含若干條命令,每個命令都會創建一個新的層,Dockerfile創建的層數不可以超過127層。

回顧下先前實驗中我們的一個最簡單的Dockerfile實例:

Dockerfile的詳細編寫方法我們后續有專門的實驗介紹,此處只寫一個最簡單的Dockerfile來介紹。

使用 vim 或 gedit 打開一個文件 Dockerfile

$ cd /home/shiyanlou/
$ mkdir shiyanlouimage
$ cd shiyanlouimage/
$ vim Dockerfile

在文件中輸入以下內容:

from ubuntu:latest
ENV HOSTNAME=shiyanlou

保存退出編輯器。

這個 Dockerfile 中只有兩行,第一行表示基於哪個鏡像創建新的鏡像,類似於程序開發中的 import 或 include,我們這里以 ubuntu:latest 鏡像為基礎創建新的鏡像。第二行是在新的鏡像中我們要對基礎鏡像 ubuntu:latest 做的改變。這句是設置一個環境變量HOSTNAME等於shiyanlou

完成 Dockerfile 后,使用 docker build命令進行構建:

$ cd /home/shiyanlou/shiyanlouimage/
$ docker build -t shiyanlou .

這個命令中第一個參數 -t shiyanlou指定創建的新鏡像的名字,第二個參數是一個點 . 指定從當前目錄查找 Dockerfile 文件。

命令執行過程截圖:

執行完成后我們 docker images 命令中就可以看到新的 shiyanlou 鏡像了。

我們現在運行這個 shiyanlou 鏡像並進入到bash環境:

$ docker run -t -i shiyanlou /bin/bash

進入到bash后,我們查看鏡像是否已經設置了HOSTNAME環境變量:

$ echo $HOSTNAME

3、其他方法

創建鏡像的方法很多,除了上述兩種之外還可以使用下述方法進行創建,每種方法都會在本節或其他章節實驗中學習:

  1. 在容器管理中我們學過的 docker import
  2. 本章節后續要學習的提交修改 docker commit
  3. 本章節后續要學習的導入鏡像 docker load

三、查看鏡像信息

1、基本命令 docker images

docker images 命令查看本地的鏡像列表,信息包括:

  1. REPOSITORY:倉庫名稱
  2. TAG:標簽名,一個倉庫可以有若干個標簽對應不同的鏡像,默認都是latest
  3. IMAGE ID:鏡像ID
  4. CREATED:創建時間,注意不是本地的pull時間
  5. SIZE:鏡像大小

其中需要注意的是運行容器時候如果不指定鏡像的TAG,則默認為latest。鏡像的唯一標識符是鏡像ID,不是TAG,有的時候同一個鏡像可以有不同的TAG,但實際指向的是同一個鏡像ID。TAG可以理解為鏡像的別名。

查看當前系統中存儲的所有鏡像信息:

2、查看鏡像詳細信息 docker inspect

docker inspect 可以查看指定鏡像的詳細信息。這條命令可以查看容器或鏡像的詳細信息,輸出是一個JSON格式的內容,比較重要的信息是創建時間,啟動命令等:

可以看到輸出的信息非常多,如果想查看其中的一項,只需要使用-f {{}} 指定即可:

四、導出及導入鏡像

與容器的導出和導入類似(請回憶相關命令),鏡像可以被導出到本地文件,也可以從本地文件中加載。導出命令是docker save 命令,導出后的鏡像如果需要導入到新的Docker 服務器,則使用docker load命令。

導出的鏡像文件是/home/shiyanlou/busybox.tar,可以拷貝到其他Docker服務器上進行導入:

五、更新及刪除鏡像

1、更新鏡像 docker commit

如果需要對鏡像進行更新的話,一種方法是創建容器,在容器中進行修改,然后將修改后容器提交到鏡像中。提交使用 docker commit命令。

注意:本方法不推薦用在生產系統中,未來會很難維護鏡像。最好的創建鏡像的方法是Dockerfile,修改鏡像的方法是修改Dockerfile,然后重新從Dockerfile中構建新的鏡像。

本實驗中,我們首先基於shiyanlou鏡像創建一個容器:

docker run -t -i --name updateimage shiyanlou /bin/bash

進入到容器中進行修改,創建三個新的文件夾,然后退出容器:

docker diff 查看修改的內容:

docker commit命令將修改后的內容提交到本地,另存為鏡像newshiyanlou

幾個參數的說明:

  • -m 本次提交的描述
  • -a 指定鏡像作者信息
  • -p 提交時暫停容器運行
  • 容器的ID或名稱
  • 目標鏡像

如果指定了目標鏡像,Docker會創建新的鏡像。類似我們修改一個word文檔后進行的另存為

2、刪除鏡像 docker rmi

docker rmi命令可以刪除本地的鏡像,刪除前需要先使用docker rm 刪除所有依賴該鏡像的容器。

docker rmi -f 可以強制刪除存在容器依賴的鏡像,但這不是一個好習慣,請先刪除容器再清理鏡像。

總結

  1. 使用Docker Hub查找和下載鏡像
  2. 創建鏡像
  3. 查看鏡像信息
  4. 導入和導出鏡像
  5. 修改鏡像
  6. 刪除鏡像

請務必保證自己能夠動手完成整個實驗,只看文字很簡單,真正操作的時候會遇到各種各樣的問題,解決問題的過程才是收獲的過程。


免責聲明!

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



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