使用docker鏡像
鏡像(image)是docker三大核心概念中最為重要的,自docker誕生之日起“鏡像”就是相關社群最為熱門的關鍵詞。
docker運作容器前需要本地存在對應的鏡像,如果鏡像沒儲存在本地,docker會嘗試先從預設鏡像倉庫下載下傳(預設使用docker hub公共注冊伺服器中的倉庫),使用者也可以通過配置,使用自定義的鏡像倉庫。
本章将介紹圍繞鏡像這一核心概念的具體操作,包括如何使用pull指令從docker hub倉庫中下載下傳鏡像到本地,如何檢視本地已有的鏡像資訊和管理鏡像标簽,如何在遠端倉庫使用search指令進行搜尋和過濾,如何删除鏡像标簽和鏡像檔案,如何建立使用者定制的鏡像并且儲存為外部檔案。最後,還介紹如何往docker hub倉庫中推送自己的鏡像。
一份非官方研究報告表明,image一直是docker官方社群(2014~2016年)和stackoverflow docker闆塊(2013~2016年)的年度熱詞。
3.1 擷取鏡像
鏡像是運作容器的前提,官方的docker hub網站已經提供了數十萬個鏡像供大家開放下載下傳。
可以使用docker pull指令直接從docker hub鏡像源來下載下傳鏡像。該指令的格式為docker pull name[:tag]。其中,name是鏡像倉庫的名稱(用來區分鏡像),tag是鏡像的标簽(往往用來表示版本資訊)。通常情況下,描述一個鏡像需要包括“名稱+标簽”資訊。
例如,擷取一個ubuntu 14.04系統的基礎鏡像可以使用如下的指令:
$ docker pull ubuntu:14.04
14.04: pulling from library/ubuntu
6c953ac5d795: pull complete
3eed5ff20a90: pull complete
f8419ea7c1b5: pull complete
51900bc9e720: pull complete
a3ed95caeb02: pull complete
digest: sha256:97421885f3da3b23f52eeddcaa9f8f91172a8ac3cd5d3cd40b51c7aad09f66cc
status: downloaded newer image for ubuntu:14.04
對于docker鏡像來說,如果不顯式指定tag,則預設會選擇latest标簽,這會下載下傳倉庫中最新版本的鏡像。
下面的例子将從docker hub的ubuntu倉庫下載下傳一個最新的ubuntu作業系統的鏡像。
$ docker pull ubuntu
using default tag: latest
latest: pulling from library/ubuntu
5ba4f30e5bea: pull complete
9d7d19c9dc56: pull complete
ac6ad7efd0f9: pull complete
e7491a747824: pull complete
digest: sha256:46fb5d001b88ad904c5c732b086b596b92cfb4a4840a3abd0e35dbb6870585e4
status: downloaded newer image for ubuntu:latest
該指令實際上下載下傳的就是ubuntu:latest鏡像。
一般來說,鏡像的latest标簽意味着該鏡像的内容會跟蹤最新的非穩定版本而釋出,内容是不穩定的。目前ubuntu最新的發行版本為16.04,latest鏡像實際上就是16.04鏡像,使用者可以下載下傳ubuntu:16.04鏡像并檢視,兩者的數字摘要值是一緻的。從穩定性上考慮,不要在生産環境中忽略鏡像的标簽資訊或使用預設的latest标記的鏡像。
下載下傳過程中可以看出,鏡像檔案一般由若幹層(layer)組成,6c953ac5d795這樣的串是層的唯一id(實際上完整的id包括256比特,由64個十六進制字元組成)。使用docker pull指令下載下傳時會擷取并輸出鏡像的各層資訊。當不同的鏡像包括相同的層時,本地僅存儲層的一份内容,減小了需要的存儲空間。
讀者可能會想到,在使用不同的鏡像倉庫伺服器的情況下,可能會出現鏡像重名的情況。
嚴格地講,鏡像的倉庫名稱中還應該添加倉庫位址(即registry,注冊伺服器)作為字首,隻是我們預設使用的是docker hub服務,該字首可以忽略。
例如,docker pull ubuntu:14.04指令相當于docker pull registry.hub.docker.com/ubuntu:14.04指令,即從預設的注冊伺服器docker hub registry中的ubuntu倉庫來下載下傳标記為14.04的鏡像。
如果從非官方的倉庫下載下傳,則需要在倉庫名稱前指定完整的倉庫位址。例如從網易蜂巢的鏡像源來下載下傳ubuntu:14.04鏡像,可以使用如下指令,此時下載下傳的鏡像名稱為hub.c.163.com/public/ubuntu:14.04:
$ docker pull hub.c.163.com/public/ubuntu:14.04
pull子指令支援的選項主要包括:
-a, --all-tags=true|false:是否擷取倉庫中的所有鏡像,預設為否。
下載下傳鏡像到本地後,即可随時使用該鏡像了,例如利用該鏡像建立一個容器,在其中運作bash應用,執行ping localhost指令:
$ docker run -it ubuntu:14.04 bash
root@9c74026df12a:/# ping localhost
ping localhost (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.058 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.023 ms
64 bytes from localhost (127.0.0.1): icmp_seq=3 ttl=64 time=0.018 ms
^c
--- localhost ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.018/0.033/0.058/0.017 ms
root@9c74026df12a:/# exit
exit