1. <i id="s6b2k"><small id="s6b2k"></small></i>
    <b id="s6b2k"><bdo id="s6b2k"></bdo></b>
  2. <wbr id="s6b2k"></wbr>

    Docker鏡像構建原理解析(不裝docker也能構建鏡像)_docker

    來源:腳本之家  責任編輯:小易  

    在devops流程里面 構建鏡像是一個非常重要的過程,一般構建鏡像是寫dockerfile文件然后通過docker client來構建的image。

    docker client 會先檢查本地有沒有image,如果沒有幫你 從鏡像倉庫 pull 下來

    然后解析你寫的dockerfile構建新的image。

    本文帶你了解

    pull 命令 背后是怎么做的?  build 命令 背后是怎么做的?

    下篇文章帶你解析:

    如果我不用docker 我如何構建一個鏡像?

    我們以微軟的aspnet2.2為基礎構建一個aspnetcore項目的鏡像為例子

    mcr.microsoft.com/dotnet/core/aspnet:2.2

    根據基礎鏡像REGISTRY去獲取mainfest信息

    https://mcr.microsoft.com/v2/dotnet/core/aspnet/manifests/2.2
    Accept:
    application/vnd.oci.image.manifest.v1+json,application/vnd.docker.distribution.manifest.v2+json,application/vnd.docker.distribution.manifest.v1+json

    獲取到的內容如下:

    {
      "schemaVersion": 2,
      "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
      "config": {
        "mediaType": "application/vnd.docker.container.image.v1+json",
        "size": 4039,
        "digest": "sha256:e7e3b238011ce0f2b9350153535fe273caa01f0e7188d0b91f965b3802ddc600"
      },
      "layers": [
        {
          "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
          "size": 22524609,
          "digest": "sha256:804555ee037604c40de144f9f8da0d826d38db82f15d74cded32790fe279a8f6"
        },
        {
          "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
          "size": 17692725,
          "digest": "sha256:970251047358aea56ba6db6975b14ff12470b75de0c2477f4445240ddd727fd4"
        },
        {
          "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
          "size": 2978257,
          "digest": "sha256:f3d4c41a4fd13f35c0b46f19a4e27845f4695163cc7174d908ff84836bbc2f5a"
        },
        {
          "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
          "size": 62145592,
          "digest": "sha256:bd391c46585f9f8d84992bbaa9087189148c1601968eaaf097d5b3ed60840e5e"
        }
      ]
    }

    mainfest文件里面都是摘要(digest)記錄

    config信息摘要 每個layer的摘要 (上面的例子有4個)

    根據上面的config信息摘要獲取config詳情

    GET:https://mcr.microsoft.com/v2/dotnet/core/aspnet/blobs/sha256:e7e3b238011ce0f2b9350153535fe273caa01f0e7188d0b91f965b3802ddc600
    {
      "architecture": "amd64",
      "config": {
        "Hostname": "",
        "Domainname": "",
        "User": "",
        "AttachStdin": false,
        "AttachStdout": false,
        "AttachStderr": false,
        "Tty": false,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": [
          "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
          "ASPNETCORE_URLS=http://+:80",
          "DOTNET_RUNNING_IN_CONTAINER=true",
          "ASPNETCORE_VERSION=2.2.8"
        ],
        "Cmd": [
          "bash"
        ],
        "ArgsEscaped": true,
        "Image": "sha256:5ecfe4016ac8e911a94aa601a675f7204e9ccab00cbb08e7067c184ad40f34e9",
        "Volumes": null,
        "WorkingDir": "",
        "Entrypoint": null,
        "OnBuild": null,
        "Labels": null
      },
      "container": "14196c2f9c327d41e26682d32c7c89c4e7c78aa32f8b7501a23192035a9f4844",
      "container_config": {
        "Hostname": "",
        "Domainname": "",
        "User": "",
        "AttachStdin": false,
        "AttachStdout": false,
        "AttachStderr": false,
        "Tty": false,
        "OpenStdin": false,
        "StdinOnce": false,
        "Env": [
          "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
          "ASPNETCORE_URLS=http://+:80",
          "DOTNET_RUNNING_IN_CONTAINER=true",
          "ASPNETCORE_VERSION=2.2.8"
        ],
        "Cmd": [
          "/bin/sh",
          "-c",
          "curl -SL --output aspnetcore.tar.gz https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$ASPNETCORE_VERSION/aspnetcore-runtime-$ASPNETCORE_VERSION-linux-x64.tar.gz   && aspnetcore_sha512='954072376698be69acb7e277df2c243f931e10529def21dcbf9ce277609b30d462126bf8b8b3cab36476bec3d63a927b8e44e59e4d4cade23eef45956fba1ffd'   && echo \"$aspnetcore_sha512 aspnetcore.tar.gz\" | sha512sum -c -   && mkdir -p /usr/share/dotnet   && tar -zxf aspnetcore.tar.gz -C /usr/share/dotnet   && rm aspnetcore.tar.gz   && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet"
        ],
        "Image": "sha256:5ecfe4016ac8e911a94aa601a675f7204e9ccab00cbb08e7067c184ad40f34e9",
        "Volumes": null,
        "WorkingDir": "",
        "Entrypoint": null,
        "OnBuild": null,
        "Labels": null
      },
      "created": "2019-12-28T08:12:05.676492579Z",
      "docker_version": "3.0.8",
      "history": [
        {
          "created": "2019-12-28T04:23:47.4966447Z",
          "created_by": "/bin/sh -c #(nop) ADD file:90a2c81769a336bed3f731f44a385f2a65b0916f517a0b77c06c224579bf9a9a in / "
        },
        {
          "created": "2019-12-28T04:23:47.719507596Z",
          "created_by": "/bin/sh -c #(nop) CMD [\"bash\"]",
          "empty_layer": true
        },
        {
          "created": "2019-12-28T08:11:05.607009582Z",
          "created_by": "/bin/sh -c apt-get update   && apt-get install -y --no-install-recommends     ca-certificates         libc6     libgcc1     libgssapi-krb5-2     libicu57     liblttng-ust0     libssl1.0.2     libstdc++6     zlib1g   && rm -rf /var/lib/apt/lists/*"
        },
        {
          "created": "2019-12-28T08:11:07.64336022Z",
          "created_by": "/bin/sh -c #(nop) ENV ASPNETCORE_URLS=http://+:80 DOTNET_RUNNING_IN_CONTAINER=true",
          "empty_layer": true
        },
        {
          "created": "2019-12-28T08:11:16.475068844Z",
          "created_by": "/bin/sh -c apt-get update   && apt-get install -y --no-install-recommends     curl   && rm -rf /var/lib/apt/lists/*"
        },
        {
          "created": "2019-12-28T08:11:43.814078508Z",
          "created_by": "/bin/sh -c #(nop) ENV ASPNETCORE_VERSION=2.2.8",
          "empty_layer": true
        },
        {
          "created": "2019-12-28T08:12:05.676492579Z",
          "created_by": "/bin/sh -c curl -SL --output aspnetcore.tar.gz https://dotnetcli.azureedge.net/dotnet/aspnetcore/Runtime/$ASPNETCORE_VERSION/aspnetcore-runtime-$ASPNETCORE_VERSION-linux-x64.tar.gz   && aspnetcore_sha512='954072376698be69acb7e277df2c243f931e10529def21dcbf9ce277609b30d462126bf8b8b3cab36476bec3d63a927b8e44e59e4d4cade23eef45956fba1ffd'   && echo \"$aspnetcore_sha512 aspnetcore.tar.gz\" | sha512sum -c -   && mkdir -p /usr/share/dotnet   && tar -zxf aspnetcore.tar.gz -C /usr/share/dotnet   && rm aspnetcore.tar.gz   && ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet"
        }
      ],
      "os": "linux",
      "rootfs": {
        "type": "layers",
        "diff_ids": [
          "sha256:814c70fdae62bc26c603bfae861f00fb1c77fc0b1ee8d565717846f4df24ae5d",
          "sha256:0cf75cb98eb2e0a82631d4aff71b40ba79ff7f83e0361f696875e592a1a4cefc",
          "sha256:15e45d99c92686fb1fd61a41431d8400d7a0e8381595d09d666b0809c4f5d993",
          "sha256:579a8f1d6a123f98095c0b1a1395079f7504391fd2a8bc529dede305a2072a36"
        ]
      }
    }

    根據diff_ids里面去下載對應layers

    下載完后對比摘要一致,確保鏡像文件合法性

    路徑規則:

    https://mcr.microsoft.com/v2/dotnet/core/aspnet/blobs/sha256:XXXXXX

    構建我們的鏡像

    在基礎鏡像的配置基礎上加入我們的自定義配置

    Entrypoint Cmd Ports Environment ImageWorkingDirectory Volumes Labels

    在基礎鏡像的所有的layers把我們要打包到鏡像也做成一個layer

    生成的鏡像tar包解壓出來

    多了一個 tar.gz文件,解壓之后 就是我們打包放進去的文件

    原來基礎鏡像有4個layer 加上我們的 共5個 config.json manifest.json

    config.json對比與基礎鏡像

     

    我們來復習下構建鏡像的過程 根據鏡像名稱拉取mainfest

    根據mainfest拉取config 根據config拉取layers 下載各個layer 修改到基礎鏡像的配置(config.json和mainfest.json) 加入我們要加入的文件layer

    知道原理后我們可以自己寫一個工具來實現整個過程

    我開源的docker鏡像構建,讓你不用裝docker也能快速構建容器鏡像

    支持以下鏡像倉庫作為基礎鏡像構建

    docker hub aliyun 騰訊云

    到此這篇關于Docker鏡像構建原理解析(不裝docker也能構建鏡像)的文章就介紹到這了,更多相關Docker鏡像構建內容請搜索真格學網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持真格學網!

    您可能感興趣的文章:Docker 安裝及配置鏡像加速的實現Docker打包鏡像及修改配置的實現Docker load之后鏡像名字為none問題解決方法Docker 查看鏡像信息的方法使用Docker構建一個Git鏡像使用clone倉庫docker下載鏡像太慢的解決方案

  3. 本文相關:
  4. docker圖文詳解
  5. docker運行容器遠程掛載卷的方法
  6. docker centos7 安裝ssh具體步驟
  7. 詳解dockerfile 中的 copy 與 add 命令
  8. 詳解使用docker搭建hadoop分布式集群
  9. docker安裝rocketmq教程(最詳細)
  10. docker安裝mysql和redis的方法步驟
  11. docker容器端口映射后突然無法連接的排查過程
  12. 如何通過vs2017的dockerfile來生成鏡像
  13. ubuntu docker 源碼編譯(1.9.1 )詳解
  14. 如何不通過Dockerfile從已有鏡像構建新鏡像
  15. 如何使用Dockerfile構建鏡像
  16. 在制作Docker鏡像過程中,能直接使用已有的docker...
  17. docker 鏡像必須在基礎鏡像上創建么
  18. docker 怎么創建基礎鏡像
  19. 為什么Docker鏡像大都是基于Ubuntu構建
  20. eclipse工程可以構建docker鏡像嗎
  21. docker 能將本地環境做成鏡像嗎
  22. 構建docker鏡像,download依賴包存儲問題?
  23. docker tomcat鏡像 應該拿什么鏡像為基礎鏡像
  24. 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全dockerhyper-vvmwarevirtualboxxenserverkvmqemuopenvzxencloudstackopenstack云計算技術云其它首頁服務器云和虛擬化docker 安裝及配置鏡像加速的實現docker打包鏡像及修改配置的實現docker load之后鏡像名字為none問題解決方法docker 查看鏡像信息的方法使用docker構建一個git鏡像使用clone倉庫docker下載鏡像太慢的解決方案docker圖文詳解docker運行容器遠程掛載卷的方法docker centos7 安裝ssh具體步驟詳解dockerfile 中的 copy 與 add 命令詳解使用docker搭建hadoop分布式集群docker安裝rocketmq教程(最詳細)docker安裝mysql和redis的方法步驟docker容器端口映射后突然無法連接的排查過程如何通過vs2017的dockerfile來生成鏡像ubuntu docker 源碼編譯(1.9.1 )詳解docker 給運行中的容器設置端口映docker獲取鏡像報錯docker: errodocker.service啟動失敗:unit ndocker 清理命令集錦淺談docker-compose網絡設置之neubuntu14.04+docker的安裝及使用docker容器如何優雅的終止詳解docker容器訪問宿主機網絡的方法詳解如何使用docker部署一個web項詳解docker國內鏡像拉取和鏡像加docker搭建zookeeper&kafka集群的實現docker完整配置nginx+php+mysql的方法步驟docker的理解和基本命令詳解docker容器修改配置文件的實現docker學習筆記之docker端口映射使用docker ce 還是 docker eedocker如何固定ip設置的方法解決docker run 或者 docker restart 啟動docker 常見問題解決使用 docker 搭建 laravel 本地環境的教程
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.yu113.com All Rights Reserved
    战天txt全集下载