目錄
知識(shí)點(diǎn)1:鏡像的分層
示例:進(jìn)入 docker hub查看Jenkins的Dockerfile
知識(shí)點(diǎn)2:base鏡像
知識(shí)點(diǎn)3:scratch鏡像
scratch 鏡像是什么?
示例:在docker hub里面查看busybox的Dockerfile,
知識(shí)點(diǎn)4:bootfs 和 rootfs
知識(shí)點(diǎn)5:為什么Docker鏡像要采用這種分層結(jié)構(gòu)?
如果多個(gè)容器共享一份基礎(chǔ)鏡像,當(dāng)某個(gè)容器修改了基礎(chǔ)鏡像的內(nèi)容,比如 /etc 下的文件,這時(shí)其他容器的 /etc 是否也會(huì)被修改?
可寫層的概念:
Cpoy-on-Write
知識(shí)點(diǎn)6:制作一個(gè)busybox鏡像
1、編寫Dockerfile
ENTRYPOINT和CMD的區(qū)別
2、編寫while.sh
3、制作鏡像
4、啟動(dòng)容器,使用鏡像
給while.sh賦予可執(zhí)行權(quán)限
知識(shí)點(diǎn)1:鏡像的分層
鏡像:鏡像是一個(gè)軟件單元
鏡像是各個(gè)不同的層組合而成的,這就是鏡像的分層
最底層是基礎(chǔ)鏡像 -- base images
鏡像里的系統(tǒng)使用宿主機(jī)的內(nèi)核,基礎(chǔ)鏡像里面有操作系統(tǒng),
[root@sc-docker-server mydocker]# vim Dockerfile FROM python:2.7-slim WORKDIR /app # 進(jìn)入到容器后進(jìn)入的文件夾 ADD . /app # 將linux系統(tǒng)當(dāng)前目錄下的內(nèi)容到容器的/app目錄下,類似于docker cp RUN pip install --trusted-host pypi.python.org -r requirements.txt # 在容器內(nèi)部執(zhí)行的命令 EXPOSE 80 # 暴露80端口 ENV NAME World # 定義了環(huán)境變量NAME賦值world ENV AUTHOR cali # 定義了環(huán)境變量AUTHOR ccali CMD ["python","app.py"] # 容器啟動(dòng)的時(shí)候執(zhí)行命令 python app.py
在鏡像制作的過(guò)程中,每執(zhí)行一次RUN命令,鏡像就會(huì)多一些內(nèi)容,鏡像就會(huì)大一些
鏡像是要加載到容器里面去運(yùn)行的,一個(gè)容器對(duì)應(yīng)一個(gè)進(jìn)程,進(jìn)程是需要消耗cpu和內(nèi)存的。
示例:進(jìn)入 docker hub查看Jenkins的Dockerfile

FROM openjdk:8-jdk : 指定鏡像使用的基礎(chǔ)鏡像 -- 》底座
因?yàn)閖enkins是使用java開發(fā)的軟件,必須有java環(huán)境 jdk
知識(shí)點(diǎn)2:base鏡像
base鏡像有兩層含義
1. 不依賴其他鏡像,從 scratch 構(gòu)建。
2. 其他鏡像可以之為基礎(chǔ)進(jìn)行擴(kuò)展。
base鏡像通常都是各種linux發(fā)行版的Docker鏡像,例如Ubuntu,Debian,Centos等
知識(shí)點(diǎn)3:scratch鏡像
scratch 鏡像是什么?
scratch是最基礎(chǔ)的一個(gè)空白鏡像,可以用于構(gòu)建busybox等超小鏡像,可以說(shuō)實(shí)真正的從零開始構(gòu)建屬于自己的鏡像
示例:在docker hub里面查看busybox的Dockerfile,
busybox鏡像是使用功scratch作為基礎(chǔ)鏡像的,如果被容器使用的話,只有一個(gè)shell解釋器,

知識(shí)點(diǎn)4:bootfs 和 rootfs

bootfs --》容器啟動(dòng)的時(shí)候需要的內(nèi)容,是linux kernel 提供了 bootfs boot 啟動(dòng)/引導(dǎo) fs file system,容器啟動(dòng)后,bootfs會(huì)被卸載
對(duì)于 base 鏡像來(lái)說(shuō),底層直接用 宿主機(jī)的 kernel,kernel 會(huì)提供bootfs 自己只需要提供 rootfs 就行了。
rootfs --》容器內(nèi)部的操作系統(tǒng),鏡像里的操作系統(tǒng)提供的 root :根 file system,
rootfs加載完成后,容器里就形成了一個(gè)封閉的環(huán)境。類似于一個(gè)操作系統(tǒng)的環(huán)境
里面有 /dev /proc /bin /etc/ /usr /tmp 等
不同linux 發(fā)行版的區(qū)別主要就是rootfs的區(qū)別

知識(shí)點(diǎn)5:為什么Docker鏡像要采用這種分層結(jié)構(gòu)?
最大的好處是:共享資源
例如:有多個(gè)鏡像都是從相同的base鏡像構(gòu)建而來(lái),那么只需要再Docker 宿主機(jī)上面保存一份base鏡像,同時(shí)內(nèi)存中也只需要加載一份base鏡像
就可以為所有容器服務(wù)了,而且鏡像的每一層都可以被共享,可以節(jié)約磁盤和內(nèi)存資源
如果多個(gè)容器共享一份基礎(chǔ)鏡像,當(dāng)某個(gè)容器修改了基礎(chǔ)鏡像的內(nèi)容,比如 /etc 下的文件,這時(shí)其他容器的 /etc 是否也會(huì)被修改?
可寫層的概念:
當(dāng)容器啟動(dòng)時(shí),一個(gè)新的可寫層會(huì)被加載到鏡像的頂部,這一層通常被稱作 容器層,容器層之下的都叫鏡像層
鏡像層數(shù)量可能會(huì)很多,所有鏡像層會(huì)聯(lián)合在一起組成一個(gè)統(tǒng)一的文件系統(tǒng)

Cpoy-on-Write
容器層保存的是鏡像變化的部分,不會(huì)對(duì)鏡像本身進(jìn)行任何修改
所有對(duì)容器的改變,無(wú)論是添加,刪除,還是修改都只會(huì)在容器層發(fā)送
容器啟動(dòng)的時(shí)候是自下而上,容器讀數(shù)據(jù)是自上而下的
1、添加文件
在容器中創(chuàng)建文件時(shí),新文件被添加到容器層中
2、讀取文件
在容器中讀取某個(gè)文件時(shí),Docker會(huì)從上往下依次在各進(jìn)行層中查找此文件,一旦找到,打開并讀入內(nèi)存
3、修改文件
在容器中修改已存在的文件時(shí),Docker會(huì)從上往下依次在各鏡像層中查找這個(gè)文件,一旦找到,立即將其復(fù)制到容器層,然后修改
4、刪除文件
在容器中刪除文件時(shí)Docker也是從上往下依次在鏡像層中查找此文件,找到后,會(huì)在容器層中記錄下次刪除操作。
示例:制作一個(gè)鏡像,觀察容器層的變化
[root@docker1 scdocker]# cat Dockerfile
FROM centos:7
RUN yum install vim -y
RUN yum install net-tools tree -y
RUN mkdir /sanchuang
RUN touch /sanchuang/fengdeyong{1..10}.txt
RUN rm -rf /sanchuang/fengdeyong1.txt
CMD ["/bin/bash"]
[root@docker1 scdocker]# docker build -t sccentos:7.9 . Sending build context to Docker daemon 2.048kB Step 1/7 : FROM centos:7 ---> eeb6ee3f44bd Step 2/7 : RUN yum install vim -y ---> Running in 93af96c0310c Loaded plugins: fastestmirror, ovl ........... .......... Complete! Removing intermediate container 4a96fbf70500 ---> 6fa74b2106fa Step 4/7 : RUN mkdir /sanchuang ---> Running in 3a1cf78d4ca0 Removing intermediate container 3a1cf78d4ca0 ---> 01a4d2f21282 Step 5/7 : RUN touch /sanchuang/fengdeyong{1..10}.txt ---> Running in c25513038189 Removing intermediate container c25513038189 ---> f39a961d3899 Step 6/7 : RUN rm -rf /sanchuang/fengdeyong1.txt ---> Running in f6dc4e06812b Removing intermediate container f6dc4e06812b ---> 56c7f9f45d6f Step 7/7 : CMD ["/bin/bash"] ---> Running in 3f959c0752c6 Removing intermediate container 3f959c0752c6 ---> c66b1be73d66 Successfully built c66b1be73d66
Removing intermediate container 4a96fbf70500
每執(zhí)行一次操作,都會(huì)產(chǎn)生一個(gè)臨時(shí)的容器,來(lái)執(zhí)行操作,執(zhí)行完成后就會(huì)刪除這個(gè)臨時(shí)容器
CMD ["/bin/bash"]
CMD里面接的命令,必須一致在容器里面運(yùn)行,在前臺(tái)運(yùn)行,
只要容器里運(yùn)行的命令結(jié)束,容器就會(huì)退出
知識(shí)點(diǎn)6:制作一個(gè)busybox鏡像
1、編寫Dockerfile
[root@docker1 busybox]# cat Dockerfile FROM busybox COPY . / RUN cat /hello.txt ENTRYPOINT ["/bin/sh","/while.sh"]
ENTRYPOINT :指定啟動(dòng)容器的時(shí)候運(yùn)行的命令

executable :可執(zhí)行程序
param1:參數(shù)1
param2:參數(shù)2
ENTRYPOINT和CMD的區(qū)別
1、docker run 啟動(dòng)容器的時(shí)候,可以傳遞參數(shù)進(jìn)入給ENTYRPOINT 里面的命令
2、當(dāng)2者都存在的時(shí)候,CMD里的內(nèi)容會(huì)成為ENTRYPOINT里的參數(shù)(位置參數(shù))
2、編寫while.sh
[root@docker1 busybox]# cat while.sh #! /bin/bash i=1 while: do echo "hello world,sanchuang $i" let i++ sleep 1 done
[root@docker1 busybox]# ls Dockerfile hello.txt while.sh
Dockerfile 制作鏡像的配置文件
hello.txt 故意放到容器里的,要來(lái)驗(yàn)證從宿主機(jī)復(fù)制文件到容器里面
while.sh 真正在容器里面運(yùn)行的程序
3、制作鏡像
[root@docker1 busybox]# docker build -t scbusybox:1.0 . Sending build context to Docker daemon 4.096kB Step 1/4 : FROM busybox latest: Pulling from library/busybox 2c39bef88607: Pull complete Digest: sha256:20142e89dab967c01765b0aea3be4cec3a5957cc330f061e5503ef6168ae6613 Status: Downloaded newer image for busybox:latest ---> c98db043bed9 Step 2/4 : COPY . / ---> 2cffc30469ea Step 3/4 : RUN cat /hello.txt ---> Running in 776107d1c216 welcome to sanchuang! Removing intermediate container 776107d1c216 ---> 20a16576f67a Step 4/4 : ENTRYPOINT ["/while.sh"] ---> Running in 9b742e805ee6 Removing intermediate container 9b742e805ee6 ---> 7fb76760295e Successfully built 7fb76760295e Successfully tagged scbusybox:1.0
[root@docker1 busybox]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE scbusybox 1.0 7fb76760295e 40 seconds ago 1.24MB
4、啟動(dòng)容器,使用鏡像
會(huì)報(bào)錯(cuò),因?yàn)閣hile.sh沒(méi)有可執(zhí)行權(quán)限
[root@docker1 busybox]# docker run -d --name scbusybox-1 scbusybox:1.0 e19ac4541e0908bcc60c5b685a7968a35f9f600a3d307095c3c5ab64920613ee docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/while.sh": permission denied: unknown. [root@docker1 busybox]# ls Dockerfile hello.txt while.sh [root@docker1 busybox]# ll 總用量 12 -rw-r--r--. 1 root root 66 9月 3 16:48 Dockerfile -rw-r--r--. 1 root root 22 9月 3 17:34 hello.txt -rw-r--r--. 1 root root 84 9月 3 17:38 while.sh
給while.sh賦予可執(zhí)行權(quán)限
[root@docker1 busybox]# chmod +x while.sh [root@docker1 busybox]# ll 總用量 12 -rw-r--r--. 1 root root 66 9月 3 16:48 Dockerfile -rw-r--r--. 1 root root 22 9月 3 17:34 hello.txt -rwxr-xr-x. 1 root root 84 9月 3 17:38 while.sh
還是會(huì)報(bào)錯(cuò),因?yàn)槲覀冎皇窃谒拗鳈C(jī)上面修改了,但是鏡像里面還沒(méi)有修改,所以我們要重新制作鏡像
[root@docker1 busybox]# docker run -d --name scbusybox-2 scbusybox:1.0 40b729eeede30cfb75119001c6ad489ead452322ced8188b5f2306534c37e135 docker: Error response from daemon: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "/while.sh": permission denied: unknown. [root@docker1 busybox]#
[root@docker1 busybox]# docker build -t scbusybox:1.1 . Sending build context to Docker daemon 4.096kB Step 1/4 : FROM busybox ---> c98db043bed9 Step 2/4 : COPY . / ---> ec25c9060e17 Step 3/4 : RUN cat /hello.txt ---> Running in ec27802a5ca9 welcome to sanchuang! Removing intermediate container ec27802a5ca9 ---> d10143844fcb Step 4/4 : ENTRYPOINT ["/while.sh"] ---> Running in f698d042c7fd Removing intermediate container f698d042c7fd ---> 4883eded6503 Successfully built 4883eded6503 Successfully tagged scbusybox:1.1
然后啟動(dòng)容器
[root@docker1 busybox]# docker run -itd --name scbusybox-6 scbusybox:1.1 2e55c707993466b6f13ee004ad022790219dacbdbceb21b3a63503aa3100727b [root@docker1 busybox]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2e55c7079934 scbusybox:1.1 "/bin/sh /while.sh" 2 seconds ago Up 1 second scbusybox-6

鏈接:https://www.cnblogs.com/jacklovey/p/18003849
-
busybox
+關(guān)注
關(guān)注
0文章
22瀏覽量
11737 -
鏡像
+關(guān)注
關(guān)注
0文章
181瀏覽量
11661 -
Docker
+關(guān)注
關(guān)注
0文章
534瀏覽量
14312
原文標(biāo)題:Docker - 鏡像的分層 - busybox鏡像制作
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
使用Dockerfile構(gòu)建鏡像的詳細(xì)步驟
深入解析U-Boot image.c:RK平臺(tái)鏡像處理核心邏輯
無(wú)法從eMMC啟動(dòng)最新Debian鏡像怎么解決?
開發(fā)者指南 | 華為昇騰Ascend310B啟動(dòng)鏡像制作與燒寫全攻略
創(chuàng)龍 瑞芯微 RK3588 國(guó)產(chǎn)2.4GHz八核 工業(yè)開發(fā)板—Docker容器部署方法說(shuō)明
IQ混頻器為何能抑制鏡像頻率
【嘉楠堪智K230開發(fā)板試用體驗(yàn)】 使用非 docker 環(huán)境構(gòu)建系統(tǒng)鏡像
Docker鏡像構(gòu)建與管理指南
深入剖析Docker全鏈路安全防護(hù)策略
參考STM32 MPU生態(tài)資源利用Yocto構(gòu)建STM32MP2芯片鏡像運(yùn)行docker
Allegro Skill布局功能之整體模塊鏡像介紹
Linux文件系統(tǒng)打包及鏡像制作,觸覺(jué)智能RK3562開發(fā)板演示
全志T113-i一鍵升級(jí)攻略:輕松搞定鏡像更新!
rootfs鏡像制作其實(shí)沒(méi)那么難
Docker-鏡像的分層-busybox鏡像制作
評(píng)論