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/)。docker

本節中,咱們須要依次完成下面幾項任務:ubuntu

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

1、使用Docker Hub

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

好比一個鏡像名稱 ubuntu:14.04,冒號前面的ubuntu是倉庫名,後面的14.04是TAG,不一樣的TAG能夠對應相同的鏡像,TAG一般設置爲鏡像的版本號。bash

Docker Hub 是Docker官方提供公共倉庫,提供大量的經常使用鏡像,因爲國內網絡緣由常常鏈接Docker Hub會比較慢,因此咱們也能夠選擇一些國內提供相似Docker Hub鏡像服務站點。鏈接Docker Hub的經常使用命令包括:服務器

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

本節實驗中,咱們須要一個busybox鏡像,首先首先進行搜索,而後使用docker pull下載到本地:網絡

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

查找命令返回的結果中一般能夠看到不一樣版本的busybox,不指定版本號默認下載busybox:latest編輯器

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

咱們也能夠在Docker Hub上建立一個帳戶,用來保存所需的鏡像,可是在國內使用實在是太慢了。這裏簡單介紹下Docker中使用命令登錄Docker Hub保存鏡像的方式:ui

  1. 首先在Docker Hub註冊一個帳號:註冊連接
  2. 而後能夠基於Docker Hub上現有的鏡像建立一個鏡像
  3. 在本地完成修改後使用docker push命令推送到Docker Hub上

此外,Docker Hub提供一個強大的自動建立鏡像的功能,能夠設定跟蹤某個鏡像中安裝的軟件,若是有更新則自動從新構建新的鏡像。更多有趣的功能能夠登陸到Docker Hub 官網進行體驗。在此不作更多介紹。

若是想建立一個本地的Docker Hub,在後續實驗中咱們會學習如何在本地搭建一個Registry服務器。

2、建立鏡像

一、下載鏡像 docker pull

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

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


二、建立鏡像 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

三、其餘方法

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

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

3、查看鏡像信息

一、基本命令 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能夠理解爲鏡像的別名。

查看當前系統中存儲的全部鏡像信息:

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

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

能夠看到輸出的信息很是多,若是想查看其中的一項,只須要使用-f {{}} 指定便可:

4、導出及導入鏡像

與容器的導出和導入相似(請回憶相關命令),鏡像能夠被導出到本地文件,也能夠從本地文件中加載。導出命令是docker save 命令,導出後的鏡像若是須要導入到新的Docker 服務器,則使用docker load命令。

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

5、更新及刪除鏡像

一、更新鏡像 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文檔後進行的另存爲

二、刪除鏡像 docker rmi

docker rmi命令能夠刪除本地的鏡像,刪除前須要先使用docker rm 刪除全部依賴該鏡像的容器。

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

總結

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

請務必保證本身可以動手完成整個實驗,只看文字很簡單,真正操做的時候會遇到各類各樣的問題,解決問題的過程纔是收穫的過程。

相關文章
相關標籤/搜索