国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

馬哥Linux運維 ? 來源:馬哥Linux運維 ? 2025-01-15 10:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

目錄

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

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

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

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

知識點4:bootfs 和 rootfs

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

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的區別

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

知識點5:為什么Docker鏡像要采用這種分層結構?

最大的好處是:共享資源

例如:有多個鏡像都是從相同的base鏡像構建而來,那么只需要再Docker 宿主機上面保存一份base鏡像,同時內存中也只需要加載一份base鏡像

就可以為所有容器服務了,而且鏡像的每一層都可以被共享,可以節約磁盤和內存資源

如果多個容器共享一份基礎鏡像,當某個容器修改了基礎鏡像的內容,比如 /etc 下的文件,這時其他容器的 /etc 是否也會被修改?

可寫層的概念:

當容器啟動時,一個新的可寫層會被加載到鏡像的頂部,這一層通常被稱作 容器層,容器層之下的都叫鏡像層

鏡像層數量可能會很多,所有鏡像層會聯合在一起組成一個統一的文件系統

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

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 :指定啟動容器的時候運行的命令

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

executable :可執行程序

param1:參數1

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

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

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • busybox
    +關注

    關注

    0

    文章

    22

    瀏覽量

    11721
  • 鏡像
    +關注

    關注

    0

    文章

    180

    瀏覽量

    11643
  • Docker
    +關注

    關注

    0

    文章

    532

    瀏覽量

    14243

原文標題:Docker - 鏡像的分層 - busybox鏡像制作

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    使用Dockerfile構建鏡像的詳細步驟

    Dockerfile寫得好不好,直接影響三件事:鏡像大小、構建速度、運行安全性。我見過太多團隊的Dockerfile是"能跑就行"的水平——基礎鏡像用ubuntu:latest
    的頭像 發表于 02-26 09:43 ?167次閱讀

    深入解析U-Boot image.c:RK平臺鏡像處理核心邏輯

    在瑞芯微(RK)平臺的嵌入式開發中,U-Boot作為核心的啟動加載程序,負責完成鏡像解析、校驗、加載等關鍵流程。而image.c正是U-Boot中處理鏡像(uImage)的核心文件,尤其針對RK平臺
    的頭像 發表于 02-24 16:46 ?1446次閱讀
    深入解析U-Boot image.c:RK平臺<b class='flag-5'>鏡像</b>處理核心邏輯

    無法從eMMC啟動最新Debian鏡像怎么解決?

    如題,我可以從MicroSD啟動最新(202405)的Debian鏡像,但是如果改為使用eMMC啟動eMMC鏡像
    發表于 02-04 07:02

    開發者指南 | 華為昇騰Ascend310B啟動鏡像制作與燒寫全攻略

    在嵌入式Linux開發中,啟動鏡像制作與燒寫是硬件部署的核心環節。本文詳細解析華為昇騰Ascend310B啟動鏡像的完整流程,從環境搭建到燒寫驗證,為開發者提供一站式解決方案。華為昇騰310B
    的頭像 發表于 11-24 18:03 ?2051次閱讀
    開發者指南 | 華為昇騰Ascend310B啟動<b class='flag-5'>鏡像</b><b class='flag-5'>制作</b>與燒寫全攻略

    創龍 瑞芯微 RK3588 國產2.4GHz八核 工業開發板—Docker容器部署方法說明

    本文圍繞創龍科技研發的評估板,詳細說明 Docker 容器部署方法,包括 Docker 架構介紹、安裝步驟(依賴包安裝、GPG 密鑰添加等)、本地鏡像倉庫搭建,以及單個 / 多個鏡像
    的頭像 發表于 10-22 17:21 ?725次閱讀
    創龍 瑞芯微 RK3588 國產2.4GHz八核 工業開發板—<b class='flag-5'>Docker</b>容器部署方法說明

    【嘉楠堪智K230開發板試用體驗】 使用非 docker 環境構建系統鏡像

    最新的 genimage 用于鏡像制作。用于構建最新 sd 卡鏡像。 wgethttps://github.com/pengutronix/genimage/releases/download/v16
    發表于 09-06 22:35

    Docker鏡像構建與管理指南

    凌晨2點,生產環境突然告警,新部署的容器啟動失敗。排查后發現:開發環境用的鏡像800MB,生產環境的卻有3.2GB,里面塞滿了編譯工具、測試數據,甚至還有開發同學的 SSH 私鑰...
    的頭像 發表于 09-02 16:37 ?1221次閱讀

    參考STM32 MPU生態資源利用Yocto構建STM32MP2芯片鏡像運行docker

    可以使用Docker鏡像。 配置開發環境 首先,參考下面鏈接,創建編譯Yocto鏡像的編譯環境。 https://wiki.stmicroelectronics.cn/stm32mpu/wiki
    發表于 05-10 16:47

    Allegro Skill布局功能之整體模塊鏡像介紹

    使用“整體鏡像”功能可以實現快速、批量、多元素的鏡像操作,此功能可以將整個模塊電路快速鏡像,包括電路中的走線、銅皮、字符等,有便捷方便的操作方式,例如下文演示。 1、在菜單欄中點擊“FanySkill-布局-整體
    的頭像 發表于 05-08 16:42 ?2405次閱讀
    Allegro Skill布局功能之整體模塊<b class='flag-5'>鏡像</b>介紹

    Linux文件系統打包及鏡像制作,觸覺智能RK3562開發板演示

    本文介紹Linux開發板文件系統打包及鏡像制作的方法,演示Linux文件系統打包及鏡像制作,適用于想將配置好的系統環境打包成鏡像批量燒錄。觸
    的頭像 發表于 04-28 16:45 ?999次閱讀
    Linux文件系統打包及<b class='flag-5'>鏡像</b><b class='flag-5'>制作</b>,觸覺智能RK3562開發板演示

    全志T113-i一鍵升級攻略:輕松搞定鏡像更新!

    前言:本篇將詳細介紹如何對Talowe-EVM-T113-i開發板的系統鏡像進行升級,以確保用戶在需要時能夠快速高效地完成升級目標。文章內容涵蓋鏡像文件的獲取、升級工具的使用步驟、以及常見問題
    的頭像 發表于 04-18 08:33 ?2036次閱讀
    全志T113-i一鍵升級攻略:輕松搞定<b class='flag-5'>鏡像</b>更新!

    rootfs鏡像制作其實沒那么難

    在嵌入式Linux開發中,文件系統的打包和鏡像制作是關鍵步驟。本文介紹了Linux核心板文件系統的打包與鏡像制作方法,適合嵌入式開發人員快速上手。前言致遠電子Linux核心板提供的系統
    的頭像 發表于 04-03 11:37 ?1091次閱讀
    rootfs<b class='flag-5'>鏡像</b><b class='flag-5'>制作</b>其實沒那么難

    樹莓派鏡像制作、燒錄及運行

    你是否想過自己動手打造一個專屬的操作系統鏡像?無論是為極客項目定制開發環境,還是讓老舊設備煥發新生,系統鏡像定制都是極客玩家的必備技能。
    的頭像 發表于 03-27 16:00 ?2567次閱讀

    基于Docker鏡像逆向生成Dockerfile

    在本文中, 我們將通過理解Docker鏡像如何存儲數據, 以及如何使用工具查看鏡像方方面面的信息來逆向工程一個Docker鏡像; 以及如何使
    的頭像 發表于 03-10 09:45 ?1546次閱讀
    基于<b class='flag-5'>Docker</b><b class='flag-5'>鏡像</b>逆向生成Dockerfile

    docker-proxy鏡像加速倉庫

    自建多平臺容器鏡像代理服務,支持 Docker Hub, GitHub, Google, k8s, Quay, Microsoft 等鏡像倉庫。
    的頭像 發表于 03-06 16:06 ?1026次閱讀
    <b class='flag-5'>docker</b>-proxy<b class='flag-5'>鏡像</b>加速倉庫