目錄
知識點1:鏡像的分層
示例:進入 docker hub查看Jenkins的Dockerfile
知識點2:base鏡像
知識點3:scratch鏡像
scratch 鏡像是什么?
示例:在docker hub里面查看busybox的Dockerfile,
知識點4:bootfs 和 rootfs
知識點5:為什么Docker鏡像要采用這種分層結構?
如果多個容器共享一份基礎鏡像,當某個容器修改了基礎鏡像的內容,比如 /etc 下的文件,這時其他容器的 /etc 是否也會被修改?
可寫層的概念:
Cpoy-on-Write
知識點6:制作一個busybox鏡像
1、編寫Dockerfile
ENTRYPOINT和CMD的區別
2、編寫while.sh
3、制作鏡像
4、啟動容器,使用鏡像
給while.sh賦予可執行權限
知識點1:鏡像的分層
鏡像:鏡像是一個軟件單元
鏡像是各個不同的層組合而成的,這就是鏡像的分層
最底層是基礎鏡像 -- base images
鏡像里的系統使用宿主機的內核,基礎鏡像里面有操作系統,
[root@sc-docker-server mydocker]# vim Dockerfile FROM python:2.7-slim WORKDIR /app # 進入到容器后進入的文件夾 ADD . /app # 將linux系統當前目錄下的內容到容器的/app目錄下,類似于docker cp RUN pip install --trusted-host pypi.python.org -r requirements.txt # 在容器內部執行的命令 EXPOSE 80 # 暴露80端口 ENV NAME World # 定義了環境變量NAME賦值world ENV AUTHOR cali # 定義了環境變量AUTHOR ccali CMD ["python","app.py"] # 容器啟動的時候執行命令 python app.py
在鏡像制作的過程中,每執行一次RUN命令,鏡像就會多一些內容,鏡像就會大一些
鏡像是要加載到容器里面去運行的,一個容器對應一個進程,進程是需要消耗cpu和內存的。
示例:進入 docker hub查看Jenkins的Dockerfile
FROM openjdk:8-jdk : 指定鏡像使用的基礎鏡像 -- 》底座
因為jenkins是使用java開發的軟件,必須有java環境 jdk
知識點2:base鏡像
base鏡像有兩層含義
1. 不依賴其他鏡像,從 scratch 構建。
2. 其他鏡像可以之為基礎進行擴展。
base鏡像通常都是各種linux發行版的Docker鏡像,例如Ubuntu,Debian,Centos等
知識點3:scratch鏡像
scratch 鏡像是什么?
scratch是最基礎的一個空白鏡像,可以用于構建busybox等超小鏡像,可以說實真正的從零開始構建屬于自己的鏡像
示例:在docker hub里面查看busybox的Dockerfile,
busybox鏡像是使用功scratch作為基礎鏡像的,如果被容器使用的話,只有一個shell解釋器,
知識點4:bootfs 和 rootfs
bootfs --》容器啟動的時候需要的內容,是linux kernel 提供了 bootfs boot 啟動/引導 fs file system,容器啟動后,bootfs會被卸載
對于 base 鏡像來說,底層直接用 宿主機的 kernel,kernel 會提供bootfs 自己只需要提供 rootfs 就行了。
rootfs --》容器內部的操作系統,鏡像里的操作系統提供的 root :根 file system,
rootfs加載完成后,容器里就形成了一個封閉的環境。類似于一個操作系統的環境
里面有 /dev /proc /bin /etc/ /usr /tmp 等
不同linux 發行版的區別主要就是rootfs的區別
知識點5:為什么Docker鏡像要采用這種分層結構?
最大的好處是:共享資源
例如:有多個鏡像都是從相同的base鏡像構建而來,那么只需要再Docker 宿主機上面保存一份base鏡像,同時內存中也只需要加載一份base鏡像
就可以為所有容器服務了,而且鏡像的每一層都可以被共享,可以節約磁盤和內存資源
如果多個容器共享一份基礎鏡像,當某個容器修改了基礎鏡像的內容,比如 /etc 下的文件,這時其他容器的 /etc 是否也會被修改?
可寫層的概念:
當容器啟動時,一個新的可寫層會被加載到鏡像的頂部,這一層通常被稱作 容器層,容器層之下的都叫鏡像層
鏡像層數量可能會很多,所有鏡像層會聯合在一起組成一個統一的文件系統
Cpoy-on-Write
容器層保存的是鏡像變化的部分,不會對鏡像本身進行任何修改
所有對容器的改變,無論是添加,刪除,還是修改都只會在容器層發送
容器啟動的時候是自下而上,容器讀數據是自上而下的
1、添加文件
在容器中創建文件時,新文件被添加到容器層中
2、讀取文件
在容器中讀取某個文件時,Docker會從上往下依次在各進行層中查找此文件,一旦找到,打開并讀入內存
3、修改文件
在容器中修改已存在的文件時,Docker會從上往下依次在各鏡像層中查找這個文件,一旦找到,立即將其復制到容器層,然后修改
4、刪除文件
在容器中刪除文件時Docker也是從上往下依次在鏡像層中查找此文件,找到后,會在容器層中記錄下次刪除操作。
示例:制作一個鏡像,觀察容器層的變化
[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
每執行一次操作,都會產生一個臨時的容器,來執行操作,執行完成后就會刪除這個臨時容器
CMD ["/bin/bash"]
CMD里面接的命令,必須一致在容器里面運行,在前臺運行,
只要容器里運行的命令結束,容器就會退出
知識點6:制作一個busybox鏡像
1、編寫Dockerfile
[root@docker1 busybox]# cat Dockerfile FROM busybox COPY . / RUN cat /hello.txt ENTRYPOINT ["/bin/sh","/while.sh"]
ENTRYPOINT :指定啟動容器的時候運行的命令
executable :可執行程序
param2:參數2
ENTRYPOINT和CMD的區別
1、docker run 啟動容器的時候,可以傳遞參數進入給ENTYRPOINT 里面的命令
2、當2者都存在的時候,CMD里的內容會成為ENTRYPOINT里的參數(位置參數)
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 故意放到容器里的,要來驗證從宿主機復制文件到容器里面
while.sh 真正在容器里面運行的程序
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、啟動容器,使用鏡像
會報錯,因為while.sh沒有可執行權限
[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賦予可執行權限
[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
還是會報錯,因為我們只是在宿主機上面修改了,但是鏡像里面還沒有修改,所以我們要重新制作鏡像
[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
然后啟動容器
[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
+關注
關注
0文章
22瀏覽量
11296 -
鏡像
+關注
關注
0文章
169瀏覽量
10773 -
Docker
+關注
關注
0文章
489瀏覽量
11891
原文標題:Docker - 鏡像的分層 - busybox鏡像制作
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論