目錄
知識點(diǎn)1:鏡像的分層
示例:進(jìn)入 docker hub查看Jenkins的Dockerfile
知識點(diǎn)2:base鏡像
知識點(diǎn)3:scratch鏡像
scratch 鏡像是什么?
示例:在docker hub里面查看busybox的Dockerfile,
知識點(diǎn)4:bootfs 和 rootfs
知識點(diǎn)5:為什么Docker鏡像要采用這種分層結(jié)構(gòu)?
如果多個(gè)容器共享一份基礎(chǔ)鏡像,當(dāng)某個(gè)容器修改了基礎(chǔ)鏡像的內(nèi)容,比如 /etc 下的文件,這時(shí)其他容器的 /etc 是否也會被修改?
可寫層的概念:
Cpoy-on-Write
知識點(diǎn)6:制作一個(gè)busybox鏡像
1、編寫Dockerfile
ENTRYPOINT和CMD的區(qū)別
2、編寫while.sh
3、制作鏡像
4、啟動(dòng)容器,使用鏡像
給while.sh賦予可執(zhí)行權(quán)限
知識點(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
在鏡像制作的過程中,每執(zhí)行一次RUN命令,鏡像就會多一些內(nèi)容,鏡像就會大一些
鏡像是要加載到容器里面去運(yùn)行的,一個(gè)容器對應(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
知識點(diǎn)2:base鏡像
base鏡像有兩層含義
1. 不依賴其他鏡像,從 scratch 構(gòu)建。
2. 其他鏡像可以之為基礎(chǔ)進(jìn)行擴(kuò)展。
base鏡像通常都是各種linux發(fā)行版的Docker鏡像,例如Ubuntu,Debian,Centos等
知識點(diǎn)3:scratch鏡像
scratch 鏡像是什么?
scratch是最基礎(chǔ)的一個(gè)空白鏡像,可以用于構(gòu)建busybox等超小鏡像,可以說實(shí)真正的從零開始構(gòu)建屬于自己的鏡像
示例:在docker hub里面查看busybox的Dockerfile,
busybox鏡像是使用功scratch作為基礎(chǔ)鏡像的,如果被容器使用的話,只有一個(gè)shell解釋器,
知識點(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會被卸載
對于 base 鏡像來說,底層直接用 宿主機(jī)的 kernel,kernel 會提供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ū)別
知識點(diǎn)5:為什么Docker鏡像要采用這種分層結(jié)構(gòu)?
最大的好處是:共享資源
例如:有多個(gè)鏡像都是從相同的base鏡像構(gòu)建而來,那么只需要再Docker 宿主機(jī)上面保存一份base鏡像,同時(shí)內(nèi)存中也只需要加載一份base鏡像
就可以為所有容器服務(wù)了,而且鏡像的每一層都可以被共享,可以節(jié)約磁盤和內(nèi)存資源
如果多個(gè)容器共享一份基礎(chǔ)鏡像,當(dāng)某個(gè)容器修改了基礎(chǔ)鏡像的內(nèi)容,比如 /etc 下的文件,這時(shí)其他容器的 /etc 是否也會被修改?
可寫層的概念:
當(dāng)容器啟動(dòng)時(shí),一個(gè)新的可寫層會被加載到鏡像的頂部,這一層通常被稱作 容器層,容器層之下的都叫鏡像層
鏡像層數(shù)量可能會很多,所有鏡像層會聯(lián)合在一起組成一個(gè)統(tǒng)一的文件系統(tǒng)
Cpoy-on-Write
容器層保存的是鏡像變化的部分,不會對鏡像本身進(jìn)行任何修改
所有對容器的改變,無論是添加,刪除,還是修改都只會在容器層發(fā)送
容器啟動(dòng)的時(shí)候是自下而上,容器讀數(shù)據(jù)是自上而下的
1、添加文件
在容器中創(chuàng)建文件時(shí),新文件被添加到容器層中
2、讀取文件
在容器中讀取某個(gè)文件時(shí),Docker會從上往下依次在各進(jìn)行層中查找此文件,一旦找到,打開并讀入內(nèi)存
3、修改文件
在容器中修改已存在的文件時(shí),Docker會從上往下依次在各鏡像層中查找這個(gè)文件,一旦找到,立即將其復(fù)制到容器層,然后修改
4、刪除文件
在容器中刪除文件時(shí)Docker也是從上往下依次在鏡像層中查找此文件,找到后,會在容器層中記錄下次刪除操作。
示例:制作一個(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í)行一次操作,都會產(chǎn)生一個(gè)臨時(shí)的容器,來執(zhí)行操作,執(zhí)行完成后就會刪除這個(gè)臨時(shí)容器
CMD ["/bin/bash"]
CMD里面接的命令,必須一致在容器里面運(yùn)行,在前臺運(yùn)行,
只要容器里運(yùn)行的命令結(jié)束,容器就會退出
知識點(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í)行程序
param2:參數(shù)2
ENTRYPOINT和CMD的區(qū)別
1、docker run 啟動(dòng)容器的時(shí)候,可以傳遞參數(shù)進(jìn)入給ENTYRPOINT 里面的命令
2、當(dāng)2者都存在的時(shí)候,CMD里的內(nèi)容會成為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 故意放到容器里的,要來驗(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)容器,使用鏡像
會報(bào)錯(cuò),因?yàn)閣hile.sh沒有可執(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
還是會報(bào)錯(cuò),因?yàn)槲覀冎皇窃谒拗鳈C(jī)上面修改了,但是鏡像里面還沒有修改,所以我們要重新制作鏡像
[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瀏覽量
11303 -
鏡像
+關(guān)注
關(guān)注
0文章
170瀏覽量
10786 -
Docker
+關(guān)注
關(guān)注
0文章
492瀏覽量
11927
原文標(biāo)題:Docker - 鏡像的分層 - busybox鏡像制作
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論