日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

docker 镜像_Docker镜像分层

發布時間:2025/3/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 docker 镜像_Docker镜像分层 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為了有效地利用存儲驅動程序,了解Docker如何構建和存儲鏡像以及如何使用這些鏡像非常重要。

鏡像分層

Docker鏡像是由一系列層來構成的,每層代表Dockerfile中的一條指令,依下面Dockerfile為例:

FROM ubuntu:18.04 COPY . /app RUN make /app CMD python /app/app.py

該Dockerfile包含四個命令,每個命令都會新創建一個層。FROM語句會從ubuntu:18.04鏡像創建一個層。COPY指令會從Docker客戶端的當前目錄下添加一些文件。RUN指令使用了make指令來構建。最后CMD是?在容器中運行什么命令。

而對于Docker來說,創建新容器時,每一層都會彼此堆疊,可以在基礎層的基礎上添加新的可寫容器層。對容器的所做的所有更改都將寫入到該可寫容器層中。下圖顯示了基于Ubuntu 15.04 的容器。對于Image layers都是Read Only的。

容器和層

對于容器和鏡像(container和image)的主要區別就是頂部的可寫層(the top writable layer),在容器中添加數據或者修改現有數據的所有讀寫操作都會存儲在此可寫層中。刪除容器后,可寫層也會被刪除,而基礎鏡像則保持不變。

每個容器都會有自己的可寫層,所有的改變都存儲在該容器層中。多個容器可以共享對同一基礎鏡像的訪問,但可以擁有自己的數據狀態。

如果需要對完全相同的數據的訪問權限,需要將該數據存儲在Docker volume中并且裝入到容器中。

Copy-on-write策略

寫時復制是一種共享和復制文件的策略,可以最大程度地提高效率。

當我們使用dockerpull`指令時會從倉庫拉下一個鏡像例如下面的例子

$ docker pull ubuntu:18.04 18.04: Pulling from library/ubuntu f476d66f5408: Pull complete 8882c27f669e: Pull complete d9af21273955: Pull complete f5029279ec12: Pull complete Digest: sha256:ab6cb8de3ad7bb33e2534677f865008535427390b117d7939193f8d1a6613e34 Status: Downloaded newer image for ubuntu:18.04

所有的這些層都會在Docker主機本地存儲區域內存儲,可以通過以下指令來列出

$ ls /var/lib/docker/overlay2 16802227a96c24dcbeab5b37821e2b67a9f921749cd9a2e386d5a6d5bc6fc6d3 377d73dbb466e0bc7c9ee23166771b35ebdbe02ef17753d79fd3571d4ce659d7 3f02d96212b03e3383160d31d7c6aeca750d2d8a1879965b89fe8146594c453d ec1ec45792908e90484f7e629330666e7eee599f08729c93890a7205a6ba35f5 l

依下面的Dockerfile為例,創建一個名為acme/my-base-image:1.0的鏡像。

FROM ubuntu:18.04 COPY . /app

第二個Dockerfile依第一個Dockerfile為例,但是有用一個增加的層。

FROM acme/my-base-image:1.0 CMD /app/hello.sh

第二個鏡像包含第一個鏡像的所有層,再加上帶有CMD指令的新層,以及一個可讀寫的容器層。因為Docker已經擁有第一個鏡像的所有層,所以不需要再次將其pull下來。

構建這兩個Dockerfile鏡像,可以通過docker history和docker image ls指令來驗證共享層的加密ID是否相同。

  • 創建一個新文件夾cow-test/,并切換到該目錄下。
  • 在cow-test/目錄下,創建一個名為hello.sh的文件內容如下:
  • #!/bin/sh echo "Hello world"

    然后設置可執行

    chmod +x hello.sh
  • 將上面第一個鏡像復制為Dockerfile.base。
  • 將上面第二個鏡像復制為Dockerfile
  • 在cow-test/目錄下,構建第一個鏡像
  • $ docker build -t acme/my-base-image:1.0 -f Dockerfile.base . Sending build context to Docker daemon 812.4MB Step 1/2 : FROM ubuntu:18.04 ---> d131e0fa2585 Step 2/2 : COPY . /app ---> Using cache ---> bd09118bcef6 Successfully built bd09118bcef6 Successfully tagged acme/my-base-image:1.0
  • 構建第二個鏡像
  • $ docker build -t acme/my-final-image:1.0 -f Dockerfile .Sending build context to Docker daemon 4.096kB Step 1/2 : FROM acme/my-base-image:1.0 ---> bd09118bcef6 Step 2/2 : CMD /app/hello.sh ---> Running in a07b694759ba ---> dbf995fc07ff Removing intermediate container a07b694759ba Successfully built dbf995fc07ff Successfully tagged acme/my-final-image:1.0
  • 查看鏡像的大小。
  • $ docker image lsREPOSITORY TAG IMAGE ID CREATED SIZE acme/my-final-image 1.0 dbf995fc07ff 58 seconds ago 103MB acme/my-base-image 1.0 bd09118bcef6 3 minutes ago 103MB
  • 查看每個鏡像中層的大小
  • $ docker history bd09118bcef6 IMAGE CREATED CREATED BY SIZE COMMENT bd09118bcef6 4 minutes ago /bin/sh -c #(nop) COPY dir:35a7eb158c1504e... 100B d131e0fa2585 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 3 months ago /bin/sh -c mkdir -p /run/systemd && echo '... 7B <missing> 3 months ago /bin/sh -c sed -i 's/^#s*(deb.*universe... 2.78kB <missing> 3 months ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B <missing> 3 months ago /bin/sh -c set -xe && echo '#!/bin/sh' >... 745B <missing> 3 months ago /bin/sh -c #(nop) ADD file:eef57983bd66e3a... 103MB$ docker history dbf995fc07ffIMAGE CREATED CREATED BY SIZE COMMENT dbf995fc07ff 3 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/a... 0B bd09118bcef6 5 minutes ago /bin/sh -c #(nop) COPY dir:35a7eb158c1504e... 100B d131e0fa2585 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 3 months ago /bin/sh -c mkdir -p /run/systemd && echo '... 7B <missing> 3 months ago /bin/sh -c sed -i 's/^#s*(deb.*universe... 2.78kB <missing> 3 months ago /bin/sh -c rm -rf /var/lib/apt/lists/* 0B <missing> 3 months ago /bin/sh -c set -xe && echo '#!/bin/sh' >... 745B <missing> 3 months ago /bin/sh -c #(nop) ADD file:eef57983bd66e3a... 103MB

    可以看到除了第二個鏡像的頂層以外,所有層都是相同的,其他層在這兩個鏡像中共享,并且只會在/var/lib/docker目錄中存儲一次,實際上新層并不會占用任何空間,因為它只是運行命令。

    磁盤上容器的大小

    可以使用docker ps -s指令來查看容器的大小。

    • size表示每個容器的可寫層使用的大小。
    • virtual size表示容器使用的用于只讀鏡像的數據的數據量加上容器可寫層的大小。多個容器可以共享一些或者所有的只讀鏡像數據。

    因此每個正在運行的容器所使用磁盤總空間大小是virtual size和size的某種組合。如果多個容器從相同的基礎鏡像開始,所以這些容器在磁盤上的總大小為所有容器的大小size(SUM of all container size)加上一個鏡像的大小(virtual size-size)

    本文簡單介紹了docker鏡像分層。

    • 鏡像如果共享了相同的層只會在/var/lib/docker下存儲一個,通過這個可以大大減少容器編譯、推送的時長。

    總結

    以上是生活随笔為你收集整理的docker 镜像_Docker镜像分层的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。