Docker學(xué)習(xí)(5) Docker鏡像
簡介
- Docker鏡像就是停止運(yùn)行的容器模捂。
- 使用之前需要從鏡像倉庫里拉取鏡像枫绅,下載到本地的docker主機(jī)里
- 鏡像是由多層組成的寓搬,每層重疊之后县耽,在外部看來就是一個(gè)獨(dú)立的個(gè)體兔毙。
- 鏡像內(nèi)部包括操作系統(tǒng)(OS),同時(shí)還包含應(yīng)用運(yùn)行所必要的文件和依賴包锡溯。
- 鏡像設(shè)計(jì)的初衷是快速和小巧祭饭,所有鏡像通常比較小叙量。
詳解
鏡像也可以——停止某個(gè)容器運(yùn)行绞佩,并從中創(chuàng)建新的鏡像胆建。
鏡像可以理解為構(gòu)建時(shí)(build-time)結(jié)構(gòu)眼坏,容器可以理解為運(yùn)行時(shí)(run-time)結(jié)構(gòu)檐蚜。
鏡像和容器
容器一旦從鏡像啟動(dòng)之后闯第,二者之間變成相互依賴的關(guān)系。
從鏡像中啟動(dòng)的全部容器停止之前蛛淋,鏡像無法刪除的
否則會(huì)導(dǎo)致報(bào)錯(cuò),效果如下
lhf@lhf-virtual-machine:~$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
613dad3cfc8d ubuntu:latest "/bin/bash" 17 seconds ago Up 16 seconds beautiful_leakey
lhf@lhf-virtual-machine:~$ docker image rm ubuntu:latest
Error response from daemon: conflict: unable to remove repository reference "ubuntu:latest" (must force) - container 613dad3cfc8d is using its referenced image cf0f3ca922e0
鏡像通常比較小
- 容器追求快速和小巧褐荷,意味這鏡像就必須裁剪掉不必要的部分,保持較小的體積叛甫。
- 一般docker鏡像只有一個(gè)精簡的SHELL,或者沒有杨伙,鏡像不包含內(nèi)核。
- 容器都是共享docker主機(jī)的內(nèi)核限匣。
拉取鏡像
- docker主機(jī)本地的鏡像倉庫位置
lhf@lhf-virtual-machine:~$ sudo ls /var/lib/docker
[sudo] lhf 的密碼:
builder buildkit containers image network overlay2 plugins runtimes swarm tmp trust volumes
- 檢查本地倉庫是否有鏡像
lhf@lhf-virtual-machine:~$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest e63fd667d16a 2 days ago 71.4MB
alpine latest 965ea09ff2eb 4 days ago 5.55MB
ubuntu latest cf0f3ca922e0 7 days ago 64.2MB
- 拉取鏡像到本地
lhf@lhf-virtual-machine:~$ docker pull centos:latest
latest: Pulling from library/centos
729ec3a6ada3: Pull complete
Digest: sha256:f94c1d992c193b3dc09e297ffd54d8a4f1dc946c37cbeceb26d35ce1647f88d9
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
鏡像倉庫服務(wù)
- docker鏡像存儲(chǔ)在鏡像倉庫服務(wù)(image registry)當(dāng)中抖苦。默認(rèn)使用的是docker Hub
- 鏡像倉庫服務(wù)包含多個(gè)鏡像倉庫米死,一個(gè)鏡像倉庫包含多個(gè)鏡像哲身。
官方和非官方鏡像倉庫
- Docker Hub 分官方倉庫(Official Repositiry)和非官方倉庫(UnOfficial Repositiry)
鏡像命名和標(biāo)簽
- 給出鏡像的名字和標(biāo)簽怔揩,從官方倉庫拉取鏡像
lhf@lhf-virtual-machine:~$ docker pull alpine:latest
latest: Pulling from library/alpine
Digest: sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a
Status: Image is up to date for alpine:latest
docker.io/library/alpine:latest
lhf@lhf-virtual-machine:~$ docker pull ubuntu:latest
latest: Pulling from library/ubuntu
Digest: sha256:a7b8b7b33e44b123d7f997bd4d3d0a59fafc63e203d17efedf09ff3f6f516152
Status: Image is up to date for ubuntu:latest
docker.io/library/ubuntu:latest
- 如果沒有在倉庫名稱后制定具體標(biāo)簽脯丝,docker默認(rèn)標(biāo)簽是latest
- 標(biāo)有l(wèi)atest標(biāo)簽的鏡像并不保證是這個(gè)倉庫最新的鏡像
為鏡像打多個(gè)標(biāo)簽
- 一個(gè)鏡像可以根據(jù)用戶需求設(shè)置多個(gè)標(biāo)簽萝风。
- 標(biāo)簽是存放在鏡像的元數(shù)據(jù)中的任意數(shù)字或字符串。
- 在docker image pull 命令中指定-a 參數(shù)拉取倉庫中所有的鏡像材蹬。
- latest 是一個(gè)非強(qiáng)制標(biāo)簽实幕,不保證指向倉庫中的最新鏡像。
過濾docker image ls 的輸出的內(nèi)容
- docker提供參數(shù) --filter 來過濾docker image ls 命令返回鏡像列表的內(nèi)容堤器。
- 返回懸虛(dangling)鏡像
lhf@lhf-virtual-machine:~$ docker image ls --filter dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none>
- 沒有標(biāo)簽的鏡像稱為懸虛鏡像昆庇,列表顯示<none>:<none>
- 使用docker image prune 移除全部懸虛鏡像。加-a參數(shù)闸溃,Docker會(huì)額外移除沒有被使用的鏡像整吆。
docker支持過濾方式:
- dangling:可以指定true后false,返回懸虛鏡像(true)和非懸虛鏡像(false).
- before:需要鏡像名稱和ID作為參數(shù)拱撵,返回在之前被創(chuàng)建的鏡像。
- since:與before類似:返回是指定鏡像之后創(chuàng)建的全部鏡像表蝙。
- label:根據(jù)標(biāo)注(label)的名稱或者值拴测。
- reference:過濾標(biāo)簽為latest的鏡像
lhf@lhf-virtual-machine:~$ docker image ls --filter=reference="*:latest"
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest e63fd667d16a 2 days ago 71.4MB
alpine latest 965ea09ff2eb 4 days ago 5.55MB
ubuntu latest cf0f3ca922e0 7 days ago 64.2MB
centos latest 0f3e07c0138f 3 weeks ago 220MB
可以通過--format 參數(shù)來通過go模板對輸出內(nèi)容格式化
只返回docker主機(jī)上鏡像的大小屬性
lhf@lhf-virtual-machine:~$ docker image ls --format "{{.Size}}"
71.4MB
5.55MB
64.2MB
220MB
- 只返回顯示倉庫、標(biāo)簽和大小的信息
lhf@lhf-virtual-machine:~$ docker image ls --format "{{.Repository}}:{{.Tag}}:{{.Size}}"
test:latest:71.4MB
alpine:latest:5.55MB
ubuntu:latest:64.2MB
centos:latest:220MB
通過CLI方式搜索Docker Hub
- docker search 命令運(yùn)行通過CLI方式搜索Docker Hub
lhf@lhf-virtual-machine:~$ docker search nigelpoulton
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nigelpoulton/pluralsight-docker-ci Simple web app used in my Pluralsight videos… 18 [OK]
nigelpoulton/tu-demo 11
nigelpoulton/k8sbook Simple web app used for demos in The Kuberne… 2
<snip>
lhf@lhf-virtual-machine:~$ docker search alpine
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
alpine A minimal Docker image based on Alpine Linux… 5757 [OK]
mhart/alpine-node Minimal Node.js built on Alpine Linux 444
anapsix/alpine-java Oracle Java 8 (and 7) with GLIBC 2.28 over A… 427
<snip>
- 搜索到的鏡像既有官方和非官方府蛇,顯示只有官方的
lhf@lhf-virtual-machine:~$ docker search alpine --filter "is-official=true"
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
alpine A minimal Docker image based on Alpine Linux… 5757 [OK]
鏡像和分層
Docker鏡像由一些松耦合的只讀鏡像組成的集索。
Docker復(fù)制堆積這些鏡像層,并將它們表示為單個(gè)統(tǒng)一的鏡像
查看鏡像分層
lhf@lhf-virtual-machine:~$ docker image inspect ubuntu:latest
<snip>
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:a090697502b8d19fbc83afb24d8fb59b01e48bf87763a00ca55cfff42423ad36",
"sha256:97e6b67a30f1efeb050ada13c2afa1afd748e175ae744027dd0cce1f2931a594",
"sha256:100ef12ce3a46c3242d186dbbadedff1638dc1f69cab4e1fbf73489049c01c25",
"sha256:19331eff40f01dd084a3f966cc6939e828d617d777163706b8a13d0f972704d1"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
- 顯示該鏡像包含了是4個(gè)鏡像層欲诺、
- 輸出的內(nèi)容使用了鏡像的SHA256散列值來標(biāo)識(shí)鏡像層抄谐。
- 所有Docker鏡像都起始于一個(gè)基礎(chǔ)鏡像層,當(dāng)進(jìn)行修改和添加新的內(nèi)容時(shí)扰法,會(huì)在當(dāng)前鏡像層蛹含,創(chuàng)建一個(gè)新的鏡像層。
- 在添加額外的鏡像層的同時(shí)塞颁,鏡像始終保持當(dāng)前所有鏡像的組合浦箱。
- Docker是通過存儲(chǔ)引擎的方式來實(shí)現(xiàn)鏡像層的堆棧的,并保證多鏡像層對外展示位統(tǒng)一的文件系統(tǒng)
共享鏡像層
- 多個(gè)鏡像直接可以共享鏡像層祠锣,這樣可以節(jié)省空間提供性能酷窥。
根據(jù)摘要拉取鏡像
- 一般是通過標(biāo)簽來拉取鏡像的,但是標(biāo)簽是可變的伴网,可能會(huì)導(dǎo)致問題蓬推,可以通過摘要來拉取鏡像
- 使用鏡像摘要(image Digest)
- 使用參數(shù) --digests 在本地查看鏡像摘要
lhf@lhf-virtual-machine:~$ docker image ls --digests alpine
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
alpine latest sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a 965ea09ff2eb 4 days ago 5.55MB
- 通過摘要來拉取鏡像
鏡像散列值(摘要)
- 鏡像是一系列松耦合的獨(dú)立層的集合
- 鏡像是一個(gè)可配置的對象,包含了鏡像層的列表以及一些元數(shù)據(jù)的信息澡腾。
- 鏡像層才是實(shí)際數(shù)據(jù)存儲(chǔ)的地方
- 鏡像的唯一標(biāo)識(shí)是一個(gè)加密ID沸伏,配置對象本身的散列值。
- 內(nèi)容散列:
- 修改鏡像的內(nèi)容或其中的任意鏡像層都會(huì)導(dǎo)致加密散列值的變化动分。
多層架構(gòu)的鏡像
- docker的優(yōu)點(diǎn):
- 運(yùn)行一個(gè)應(yīng)用就行拉取一個(gè)鏡像并運(yùn)行容器這么簡單毅糟,無需安裝,依賴和配置這些問題了澜公。
- 多層架構(gòu)的鏡像就是解決鏡像與當(dāng)前運(yùn)行環(huán)境匹配問題姆另。
- 一個(gè)鏡像標(biāo)簽可以支持多個(gè)平臺(tái)和架構(gòu)。
- 鏡像倉庫服務(wù)API支持兩種重要架構(gòu):Manifest列表和Manifest
刪除鏡像
使用docker image rm 命令來刪除鏡像
通過鏡像ID來刪除鏡像
lhf@lhf-virtual-machine:~$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
test latest e63fd667d16a 3 days ago 71.4MB
alpine latest 965ea09ff2eb 4 days ago 5.55MB
ubuntu latest cf0f3ca922e0 7 days ago 64.2MB
lhf@lhf-virtual-machine:~$ docker image rm cf0f3ca922e0
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:a7b8b7b33e44b123d7f997bd4d3d0a59fafc63e203d17efedf09ff3f6f516152
Deleted: sha256:cf0f3ca922e08045795f67138b394c7287fbc0f4842ee39244a1a1aaca8c5e1c
Deleted: sha256:c808877c0adcf4ff8dcd2917c5c517dcfc76e9e8a035728fd8f0eae195d11908
Deleted: sha256:cdf75cc6b4d28e72a9931be2a88c6c421ad03cbf984b099916a74f107e6708ff
Deleted: sha256:b9997ded97a1c277d55be0d803cf76ee6e7b2e8235d610de0020a7c84c837b93
Deleted: sha256:a090697502b8d19fbc83afb24d8fb59b01e48bf87763a00ca55cfff42423ad36
- 刪除docker主機(jī)的全部鏡像
lhf@lhf-virtual-machine:~$ docker image rm $(docker image ls -q) -f
Untagged: test:latest
Deleted: sha256:e63fd667d16a799a73adf65c4882461171125f811326827b867eb5acca9d89b5
Deleted: sha256:a3656648909cd134aa602878560463d4e4b4ee48b84cf10d33b93617f98b5beb
Deleted: sha256:677c10bc62019a183422f8142accbcc09d9b65b317421dbbcd1b0935a0ca7179
Deleted: sha256:4f515774097fccbbec3608cee499fa51f1b0e9b70d2b1fdc1af6f3e2d725baf2
Deleted: sha256:6c293be80bd10ff2bdc72e3833be631bf9e734b0abbed353858f4ed04d6e3779
Deleted: sha256:dc254500dcdad9c1092f8e5a37ee6378a7df9320a84767933cf6c8692005d753
Deleted: sha256:5935d67da60e681d0ef3bedd55bde06a54e60f2c2adc8e73640943dcef8ef521
Untagged: alpine:latest
Untagged: alpine@sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a
Deleted: sha256:965ea09ff2ebd2b9eeec88cd822ce156f6674c7e99be082c7efac3c62f3ff652
lhf@lhf-virtual-machine:~$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
Docker 鏡像——命令
- docker image pull :下載鏡像的命令
- docker image ls:列出本地存儲(chǔ)的鏡像,參數(shù) --digests查看鏡像的SHA26簽名
- docker image inspect:展示鏡像細(xì)節(jié)坟乾。包括鏡像層數(shù)據(jù)和元數(shù)據(jù)迹辐。
- docker image rm:刪除鏡像。