第一節實驗中咱們已經接觸了一些鏡像的概念,簡單的說鏡像就是一個容器的只讀模板,用來建立容器。當運行容器時須要指定鏡像,若是本地沒有該鏡像,則會從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
鏡像存儲中的核心概念倉庫(Repository)是鏡像存儲的位置。Docker 註冊服務器(Registry)是倉庫存儲的位置。每一個倉庫包含不一樣的鏡像。vim
好比一個鏡像名稱 ubuntu:14.04
,冒號前面的ubuntu
是倉庫名,後面的14.04
是TAG,不一樣的TAG能夠對應相同的鏡像,TAG一般設置爲鏡像的版本號。bash
Docker Hub 是Docker官方提供公共倉庫,提供大量的經常使用鏡像,因爲國內網絡緣由常常鏈接Docker Hub會比較慢,因此咱們也能夠選擇一些國內提供相似Docker Hub鏡像服務站點。鏈接Docker Hub的經常使用命令包括:服務器
docker search
docker pull
本節實驗中,咱們須要一個busybox鏡像,首先首先進行搜索,而後使用docker pull
下載到本地:網絡
查找到的數據中包含倉庫名稱,描述,以及有多少人關注。咱們只須要下載最基本的Busybox base image
就能夠。app
查找命令返回的結果中一般能夠看到不一樣版本的busybox,不指定版本號默認下載busybox:latest
。編輯器
使用 docker pull
命令將鏡像下載到本地:學習
咱們也能夠在Docker Hub上建立一個帳戶,用來保存所需的鏡像,可是在國內使用實在是太慢了。這裏簡單介紹下Docker中使用命令登錄Docker Hub保存鏡像的方式:ui
docker push
命令推送到Docker Hub上此外,Docker Hub提供一個強大的自動建立鏡像的功能,能夠設定跟蹤某個鏡像中安裝的軟件,若是有更新則自動從新構建新的鏡像。更多有趣的功能能夠登陸到Docker Hub 官網進行體驗。在此不作更多介紹。
若是想建立一個本地的Docker Hub,在後續實驗中咱們會學習如何在本地搭建一個Registry
服務器。
2、建立鏡像
一、下載鏡像 docker pull
在本地建立鏡像的方法有幾種,最簡單的是直接從Registry
服務器上下載。上一節實驗中已經有介紹:
鏡像下載中能夠看到是分層下載,每一層都有一個惟一的ID值表示,每層下載的大小實際爲該層進行的修改增量。
後續章節中咱們會詳細介紹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
三、其餘方法
建立鏡像的方法不少,除了上述兩種以外還可使用下述方法進行建立,每種方法都會在本節或其餘章節實驗中學習:
docker import
docker commit
docker load
3、查看鏡像信息
一、基本命令 docker images
docker images
命令查看本地的鏡像列表,信息包括:
latest
其中須要注意的是運行容器時候若是不指定鏡像的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
幾個參數的說明:
若是指定了目標鏡像,Docker會建立新的鏡像。相似咱們修改一個word文檔後進行的另存爲
二、刪除鏡像 docker rmi
docker rmi
命令能夠刪除本地的鏡像,刪除前須要先使用docker rm
刪除全部依賴該鏡像的容器。
docker rmi -f
能夠強制刪除存在容器依賴的鏡像,但這不是一個好習慣,請先刪除容器再清理鏡像。
請務必保證本身可以動手完成整個實驗,只看文字很簡單,真正操做的時候會遇到各類各樣的問題,解決問題的過程纔是收穫的過程。