0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Docker-鏡像的分層-busybox鏡像制作

馬哥Linux運(yùn)維 ? 來源:馬哥Linux運(yùn)維 ? 2025-01-15 10:44 ? 次閱讀

目錄

知識點(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

bb13e070-d0e6-11ef-9310-92fbcf53809c.png

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解釋器,

bb31a448-d0e6-11ef-9310-92fbcf53809c.png

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

bb47b74c-d0e6-11ef-9310-92fbcf53809c.png

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ū)別

bb60ae28-d0e6-11ef-9310-92fbcf53809c.png

知識點(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)

bb801c18-d0e6-11ef-9310-92fbcf53809c.png

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)行的命令

bb915316-d0e6-11ef-9310-92fbcf53809c.png

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)容會成為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

bb9da5c6-d0e6-11ef-9310-92fbcf53809c.png

鏈接:https://www.cnblogs.com/jacklovey/p/18003849

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 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)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    Flexusx 實(shí)例與 Harbor 私有鏡像倉庫的完美結(jié)合

    。Harbor 作為領(lǐng)先的私有鏡像倉庫,與 Flexus X 完美結(jié)合,助力企業(yè)輕松管理 Docker 鏡像,確保應(yīng)用部署的安全與高效。828 特惠期間,選擇 Flexus X + Harbor,不僅享受
    的頭像 發(fā)表于 01-22 18:04 ?88次閱讀
    Flexusx 實(shí)例與 Harbor 私有<b class='flag-5'>鏡像</b>倉庫的完美結(jié)合

    華為云 X 實(shí)例的鏡像管理詳解

    前言 隨著云計(jì)算的不斷普及,云服務(wù)器成為企業(yè)和開發(fā)者日常工作中的重要工具。為了提升工作效率和降低運(yùn)維成本,云服務(wù)器鏡像的管理尤為重要。鏡像作為服務(wù)器或磁盤的模板,預(yù)裝了操作系統(tǒng)、軟件及配置,是快速
    的頭像 發(fā)表于 01-07 17:01 ?131次閱讀
    華為云 X 實(shí)例的<b class='flag-5'>鏡像</b>管理詳解

    Dockerfile鏡像制作Docker-Compose容器編排

    Dockerfile鏡像制作 docker/podman中, 鏡像是容器的基礎(chǔ),每次執(zhí)行docker run的時(shí)候都會指定哪個(gè)基本
    的頭像 發(fā)表于 01-07 11:01 ?139次閱讀
    Dockerfile<b class='flag-5'>鏡像</b><b class='flag-5'>制作</b>與<b class='flag-5'>Docker</b>-Compose容器編排

    docker通過中間鏡像加速部署

    使用 docker 打包鏡像的時(shí)候, 每次耗費(fèi)時(shí)間最多的就是 docker build 的過程. 特別是對于前端工程的打包, 有時(shí)候下載依賴包的時(shí)間就要 10 幾分鐘, 這就導(dǎo)致發(fā)布版本的效率極低.
    的頭像 發(fā)表于 01-06 12:39 ?125次閱讀

    OpenHarmony通過掛載鏡像來修改鏡像內(nèi)容,RK3566鴻蒙開發(fā)板演示

    OpenHarmony通過掛載鏡像來修改鏡像內(nèi)容的教程,提高修改鏡像內(nèi)容效率!
    的頭像 發(fā)表于 01-03 14:21 ?164次閱讀
    OpenHarmony通過掛載<b class='flag-5'>鏡像</b>來修改<b class='flag-5'>鏡像</b>內(nèi)容,RK3566鴻蒙開發(fā)板演示

    在 Huawei Cloud EulerOS 系統(tǒng)中安裝 Docker 的詳細(xì)步驟與常見問題解決

    Docker鏡像 ? 6. 配置Docker鏡像加速 ? 6.1 修改daemon.json文件 ? 6.2 再次拉取鏡像 ? 結(jié)語 ? 前
    的頭像 發(fā)表于 12-26 18:12 ?366次閱讀
    在 Huawei Cloud EulerOS 系統(tǒng)中安裝 <b class='flag-5'>Docker</b> 的詳細(xì)步驟與常見問題解決

    Flexus X 實(shí)例 C#/.Net Core 結(jié)合(git 代碼管理、docker 自定義鏡像)快速發(fā)布部署 - 讓你的項(xiàng)目飛起來~

    ,并通過 Docker 技術(shù)自定義構(gòu)建鏡像,從而實(shí)現(xiàn)項(xiàng)目從代碼到應(yīng)用的快速構(gòu)建、打包與部署流程。這一流程不僅提升了
    的頭像 發(fā)表于 12-25 21:15 ?207次閱讀
    Flexus X 實(shí)例 C#/.Net Core 結(jié)合(git 代碼管理、<b class='flag-5'>docker</b> 自定義<b class='flag-5'>鏡像</b>)快速發(fā)布部署 - 讓你的項(xiàng)目飛起來~

    如何在樹莓派上安裝Docker容器

    Pi官網(wǎng) 下載最新版本的Raspberry Pi OS。 使用SD卡寫入工具將鏡像寫入SD卡:可以使用 Etcher 等工具。 將SD卡插入樹莓派并啟動(dòng)。 2. 更新系統(tǒng) 在安裝Docker之前
    的頭像 發(fā)表于 11-11 11:38 ?954次閱讀

    詳解寄存器模型鏡像

    DUT的配置寄存器的值是實(shí)際值,reg_model有鏡像值、期望值的概念。
    的頭像 發(fā)表于 10-23 09:43 ?369次閱讀
    詳解寄存器模型<b class='flag-5'>鏡像</b>值

    手動(dòng)構(gòu)建Docker鏡像的方法

    不推薦使用docker commit命令,而應(yīng)該使用更靈活、更強(qiáng)大的dockerfile來構(gòu)建docker鏡像。
    的頭像 發(fā)表于 08-05 15:30 ?579次閱讀
    手動(dòng)構(gòu)建<b class='flag-5'>Docker</b><b class='flag-5'>鏡像</b>的方法

    ARM平臺實(shí)現(xiàn)Docker容器技術(shù)

    平臺上,而不用擔(dān)心運(yùn)行環(huán)境的變化導(dǎo)致應(yīng)用無法正常運(yùn)行的情況。 更輕松的維護(hù)和拓展:Docker使用的分層存儲以及鏡像的技術(shù),使得應(yīng)用重復(fù)部分的復(fù)用更為容易,也使得應(yīng)用的維護(hù)更新更加簡單,基于基礎(chǔ)
    發(fā)表于 07-25 14:36

    ARM平臺實(shí)現(xiàn)Docker容器技術(shù)

    不用擔(dān)心運(yùn)行環(huán)境的變化導(dǎo)致應(yīng)用無法正常運(yùn)行的情況。更輕松的維護(hù)和拓展:Docker使用的分層存儲以及鏡像的技術(shù),使得應(yīng)用重復(fù)部分的復(fù)用更為容易,也使得應(yīng)用的維護(hù)更新更加簡單,基于基礎(chǔ)鏡像
    發(fā)表于 07-17 11:05

    關(guān)于Docker 的清理命令集錦

    : docker rm $(docker ps -a -q) ?刪除所有未打 dangling 標(biāo)簽的鏡像 復(fù)制代碼代碼如下: docker rmi $(
    的頭像 發(fā)表于 06-13 15:56 ?423次閱讀

    對Ubuntu16.04系統(tǒng)鏡像進(jìn)行熱點(diǎn)測試

    首先簡單介紹一下Docker容器技術(shù): Docker容器分為三部分:鏡像、容器、倉庫。 鏡像(Image)——一個(gè)特殊的文件系統(tǒng) 操作系統(tǒng)分為內(nèi)核和用戶空間。對于Linux而言,內(nèi)核
    發(fā)表于 05-27 17:10

    華中科技大學(xué)開源鏡像站上線44個(gè)軟件鏡像,歡迎下載

    此站早在去年11月即在學(xué)校內(nèi)部試運(yùn)行,正式開放之前,已積累大量開放資源,包括44款開源軟件的最新版本。截至目前,該鏡像庫已有超40TB的有效鏡像數(shù)據(jù)。
    的頭像 發(fā)表于 05-09 15:53 ?645次閱讀