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 Hub查找和下載鏡像
- 創建鏡像
- 查看鏡像信息
- 導入和導出鏡像
- 修改鏡像
- 刪除鏡像
一、使用Docker Hub
鏡像存儲中的核心概念倉庫(Repository)是鏡像存儲的位置。Docker 注冊服務器(Registry)是倉庫存儲的位置。每個倉庫包含不同的鏡像。
比如一個鏡像名稱 ubuntu:14.04
,冒號前面的ubuntu
是倉庫名,后面的14.04
是TAG,不同的TAG可以對應相同的鏡像,TAG通常設置為鏡像的版本號。
Docker Hub 是Docker官方提供公共倉庫,提供大量的常用鏡像,由於國內網絡原因經常連接Docker Hub會比較慢,所以我們也可以選擇一些國內提供類似Docker Hub鏡像服務站點。連接Docker Hub的常用命令包括:
- 搜索鏡像
docker search
- 下載鏡像
docker pull
本節實驗中,我們需要一個busybox鏡像,首先首先進行搜索,然后使用docker pull
下載到本地:
查找到的數據中包含倉庫名稱,描述,以及有多少人關注。我們只需要下載最基本的Busybox base image
就可以。
查找命令返回的結果中通常可以看到不同版本的busybox,不指定版本號默認下載busybox:latest
。
使用 docker pull
命令將鏡像下載到本地:
我們也可以在Docker Hub上創建一個賬戶,用來保存所需的鏡像,但是在國內使用實在是太慢了。這里簡單介紹下Docker中使用命令登陸Docker Hub保存鏡像的方式:
- 首先在Docker Hub注冊一個賬號:注冊鏈接
- 然后可以基於Docker Hub上現有的鏡像創建一個鏡像
- 在本地完成修改后使用
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、其他方法
創建鏡像的方法很多,除了上述兩種之外還可以使用下述方法進行創建,每種方法都會在本節或其他章節實驗中學習:
- 在容器管理中我們學過的
docker import
- 本章節后續要學習的提交修改
docker commit
- 本章節后續要學習的導入鏡像
docker load
三、查看鏡像信息
1、基本命令 docker images
docker images
命令查看本地的鏡像列表,信息包括:
- REPOSITORY:倉庫名稱
- TAG:標簽名,一個倉庫可以有若干個標簽對應不同的鏡像,默認都是
latest
- IMAGE ID:鏡像ID
- CREATED:創建時間,注意不是本地的pull時間
- 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
可以強制刪除存在容器依賴的鏡像,但這不是一個好習慣,請先刪除容器再清理鏡像。
總結
- 使用Docker Hub查找和下載鏡像
- 創建鏡像
- 查看鏡像信息
- 導入和導出鏡像
- 修改鏡像
- 刪除鏡像
請務必保證自己能夠動手完成整個實驗,只看文字很簡單,真正操作的時候會遇到各種各樣的問題,解決問題的過程才是收獲的過程。