深入理解docker鏡像的分層(小白必看)
大家好,今天分享docker鏡像的分層理解
我們拉取Redis 鏡像
[root@localhost ~]# docker pull redis Using default tag: latest latest: Pulling from library/redis a2abf6c4d29d: Pull complete c7a4e4382001: Pull complete 4044b9ba67c9: Pull complete c8388a79482f: Pull complete 413c8bb60be2: Pull complete 1abfd3011519: Pull complete Digest: sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339 Status: Downloaded newer image for redis:latest docker.io/library/redis:latest
我們發(fā)現(xiàn)整個(gè)下載的過(guò)程里,它是一層一層的
查看Redis 鏡像具體信息
[root@localhost ~]# docker inspect redis:latest
[
{
"Id": "sha256:7614ae9453d1d87e740a2056257a6de7135c84037c367e1fffa92ae922784631",
"RepoTags": [
"redis:latest"
],
"RepoDigests": [
"redis@sha256:db485f2e245b5b3329fdc7eff4eb00f913e09d8feb9ca720788059fdc2ed8339"
],
"Parent": "",
"Comment": "",
"Created": "2021-12-21T12:42:49.755107412Z",
"Container": "13d25f53410417c5220c8dfe8bd49f06abdbcd69faa62a9b877de02464bb04a3",
"ContainerConfig": {
"Hostname": "13d25f534104",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"6379/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"REDIS_VERSION=6.2.6",
"REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.6.tar.gz",
"REDIS_DOWNLOAD_SHA=5b2b8b7a50111ef395bf1c1d5be11e6e167ac018125055daa8b5c2317ae131ab"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"redis-server\"]"
],
"Image": "sha256:e093f59d716c95cfce82c676f099b960cc700432ab531388fcedf79932fc81ec",
"Volumes": {
"/data": {}
},
"WorkingDir": "/data",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {}
},
"DockerVersion": "20.10.7",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"6379/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"GOSU_VERSION=1.12",
"REDIS_VERSION=6.2.6",
"REDIS_DOWNLOAD_URL=http://download.redis.io/releases/redis-6.2.6.tar.gz",
"REDIS_DOWNLOAD_SHA=5b2b8b7a50111ef395bf1c1d5be11e6e167ac018125055daa8b5c2317ae131ab"
],
"Cmd": [
"redis-server"
],
"Image": "sha256:e093f59d716c95cfce82c676f099b960cc700432ab531388fcedf79932fc81ec",
"Volumes": {
"/data": {}
},
"WorkingDir": "/data",
"Entrypoint": [
"docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 112691373,
"VirtualSize": 112691373,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/4330f4d6227b69d1b63675442c8f1fba885046258dcc61d06b2caf176346ac04/diff:/var/lib/docker/overlay2/c2340e727d1c72a5a374c3bc67edb4dc5af45b6c279d949d29e1897262e97d97/diff:/var/lib/docker/overlay2/0890ec7ba8ff12ab8b6b4c392f2b9322ecdb32afdf007e59cbaf1bb9b9954f3d/diff:/var/lib/docker/overlay2/3aee3ca28a64f4b825818c5883ec948d2006b683ce7890716c805b2023540ddf/diff:/var/lib/docker/overlay2/d3b24bd8a350d442e19251f859b45944c5b4af538476f0f5184a3143a7b1debf/diff",
"MergedDir": "/var/lib/docker/overlay2/28334f5d377c08e8e8d83eaa61d10c424ffbc9367ca7d4c5a2f644d99e22418c/merged",
"UpperDir": "/var/lib/docker/overlay2/28334f5d377c08e8e8d83eaa61d10c424ffbc9367ca7d4c5a2f644d99e22418c/diff",
"WorkDir": "/var/lib/docker/overlay2/28334f5d377c08e8e8d83eaa61d10c424ffbc9367ca7d4c5a2f644d99e22418c/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f",
"sha256:9b24afeb7c2f21e50a686ead025823cd2c6e9730c013ca77ad5f115c079b57cb",
"sha256:4b8e2801e0f956a4220c32e2c8b0a590e6f9bd2420ec65453685246b82766ea1",
"sha256:529cdb636f61e95ab91a62a51526a84fd7314d6aab0d414040796150b4522372",
"sha256:9975392591f2777d6bf4d9919ad1b2c9afa12f9a9b4d260f45025ec3cc9b18ed",
"sha256:8e5669d8329116b8444b9bbb1663dda568ede12d3dbcce950199b582f6e94952"
]
},
"Metadata": {
"LastTagTime": "0001-01-01T00:00:00Z"
}
}
]
觀察這一塊
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f",
"sha256:9b24afeb7c2f21e50a686ead025823cd2c6e9730c013ca77ad5f115c079b57cb",
"sha256:4b8e2801e0f956a4220c32e2c8b0a590e6f9bd2420ec65453685246b82766ea1",
"sha256:529cdb636f61e95ab91a62a51526a84fd7314d6aab0d414040796150b4522372",
"sha256:9975392591f2777d6bf4d9919ad1b2c9afa12f9a9b4d260f45025ec3cc9b18ed",
"sha256:8e5669d8329116b8444b9bbb1663dda568ede12d3dbcce950199b582f6e94952"
]
},
截圖:

這就是它一條一條的記錄
看這個(gè)圖
這就是一個(gè)基本的docker 鏡像的層級(jí)

可以將docker 鏡像看成一個(gè)整體
所有的docker 鏡像都是一個(gè) 基礎(chǔ)鏡像(可以理解為依托點(diǎn)),在基礎(chǔ)鏡像的層次和基礎(chǔ)之上,所做的修改以及增加的功能,都會(huì)生成新的一層
在上面的這個(gè)圖當(dāng)中,我們就是在Ubuntu 16.04 這個(gè)鏡像的基礎(chǔ)之上安裝Python,所以它就會(huì)變成一個(gè)二層的整體,再次在上面加上安全補(bǔ)丁,它就會(huì)變成個(gè)三層的整體, 就是說(shuō)此時(shí)的這個(gè)鏡像是一個(gè)三層的鏡像,我們?cè)谑褂煤瓦\(yùn)行的運(yùn)行中,就可以看見(jiàn)我們安裝的Python和安全補(bǔ)丁

畫(huà)個(gè)圖:
解釋一下:
這個(gè)實(shí)例當(dāng)中的鏡像有三層
一層自己有文件1,文件2, 文件3 文件4
二層在一層的基礎(chǔ)上加上文件5,文件6, 文件7 文件8
三層在二層的基礎(chǔ)上加上文件10,文件11
在這里,二層默認(rèn)除了有自己的東西以外,默認(rèn)有一層的所有文件
三層默認(rèn)除了有自己的東西以外,默認(rèn)有二層的所有文件
就是說(shuō),二層全部的東西有 文件1 文件2 文件3 文件4 文件5 文件6 文件7 文件8
三層全部的東西有 文件1 文件2 文件3 文件4 文件5 文件6 文件7 文件8 文件9 文件10 文件11
這個(gè)實(shí)例 鏡像最終包含了 這11個(gè)文件
各層之間是獨(dú)立的,各層之間重復(fù)的東西是共用的,也就是關(guān)于的部分不用再下載了
這就是docker 鏡像分層的概念
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:2edcec3590a4ec7f40cf0743c15d78fb39d8326bc029073b41ef9727da6c851f",
"sha256:9b24afeb7c2f21e50a686ead025823cd2c6e9730c013ca77ad5f115c079b57cb",
"sha256:4b8e2801e0f956a4220c32e2c8b0a590e6f9bd2420ec65453685246b82766ea1",
"sha256:529cdb636f61e95ab91a62a51526a84fd7314d6aab0d414040796150b4522372",
"sha256:9975392591f2777d6bf4d9919ad1b2c9afa12f9a9b4d260f45025ec3cc9b18ed",
"sha256:8e5669d8329116b8444b9bbb1663dda568ede12d3dbcce950199b582f6e94952"
]
},
和這個(gè)意思是一樣的的
一個(gè)新的科
docker 容器都是可讀的,當(dāng)容器啟動(dòng)的時(shí)候,一個(gè)新的可寫(xiě)層加載到容器頂部,這個(gè)新的鏡像層,就是我們的容器層,在容器層之下,
就是我們的鏡像層
我們?cè)谌萜鳟?dāng)中操作的就是我們的容器層,而我們?nèi)绻胍虬@個(gè)容器給別人使用 ,要將鏡像層和容器層一起和起來(lái)進(jìn)行打包

這就是docker 鏡像分層的整個(gè)過(guò)程,好了有關(guān)于docker鏡像的分層理解就到這里了,謝謝大家了
到此這篇關(guān)于深入理解docker鏡像的分層(小白必看)的文章就介紹到這了,更多相關(guān)docker鏡像分層內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
為運(yùn)行中的docker容器設(shè)置時(shí)區(qū)
本文主要介紹了為運(yùn)行中的docker容器設(shè)置時(shí)區(qū),主要介紹了2種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-05-05
docker安裝sentinel的實(shí)現(xiàn)示例
本文主要介紹了docker安裝sentinel的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-12-12
docker run -e傳遞環(huán)境變量的過(guò)程
這篇文章主要介紹了docker run -e傳遞環(huán)境變量的過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01
Docker中部署Nginx并掛載配置文件的實(shí)現(xiàn)
本文主要介紹了Docker中部署Nginx并掛載配置文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
Docker啟動(dòng)容器后自動(dòng)關(guān)閉問(wèn)題解決
在使用Docker創(chuàng)建并啟動(dòng)mysql容器時(shí),發(fā)現(xiàn)mysql容器并沒(méi)有啟動(dòng)而是自動(dòng)關(guān)閉了,本文主要介紹了Docker啟動(dòng)容器后自動(dòng)關(guān)閉問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07

