<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 構建多種系統架構支持的 Docker 鏡像 我們知道使用鏡像創建一個容器,該鏡像必須與 Docker 宿主機系統架構一致,例如 `Linux x86_64` 架構的系統中只能使用 `Linux x86_64` 的鏡像創建容器。 > macOS 除外,其使用了 [binfmt\_misc](https://docs.docker.com/docker-for-mac/multi-arch/) 提供了多種架構支持,在 macOS 系統上 \(x86\_64\) 可以運行 arm 等其他架構的鏡像。 例如我們在 `Linux x86_64` 中構建一個 `username/test` 鏡像。 ```text FROM alpine CMD echo 1 ``` 構建鏡像后推送到 Docker Hub,之后我們嘗試在樹莓派 `Linux arm64v8` 中使用這個鏡像。 ```bash $ docker run -it --rm username/test ``` 可以發現這個鏡像根本獲取不到。 要解決這個問題,通常采用的做法是通過鏡像名區分不同系統架構的鏡像,例如在 `Linux x86_64` 和 `Linux arm64v8` 分別構建 `username/test` 和 `username/arm64v8-test` 鏡像。運行時使用對應架構的鏡像即可。 這樣做顯得很繁瑣,那么有沒有一種方法讓 Docker 引擎根據系統架構自動拉取對應的鏡像呢? 我們發現在 `Linux x86_64` 和 `Linux arm64v8` 架構的計算機中執行 `$ docker run golang:alpine go version` 時我們發現可以正確的運行。 這是什么原因呢? 原因就是 `golang:alpine` 官方鏡像有一個 [`manifest` 列表](https://docs.docker.com/registry/spec/manifest-v2-2/)。 當用戶獲取一個鏡像時,Docker 引擎會首先查找該鏡像是否有 `manifest` 列表,如果有的話 Docker 引擎會按照 Docker 運行環境(系統及架構)查找出對應鏡像(例如 `golang:alpine`)。如果沒有的話會直接獲取鏡像(例如上例中我們構建的 `username/test`)。 我們可以使用 `$ docker manifest inspect golang:alpine` 查看這個 `manifest` 列表的結構。 由于該命令屬于實驗特性,必須設置如下 **環境變量** 之后才能使用: ```bash # Linux、macOS $ export DOCKER_CLI_EXPERIMENTAL=enabled # Windows $ set $env:DOCKER_CLI_EXPERIMENTAL=enabled ``` > 以上是設置環境變量的臨時方法,若使環境變量永久生效請讀者自行設置。 設置之后,執行結果如下 ```bash $ docker manifest inspect golang:alpine ``` ```javascript { "schemaVersion": 2, "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json", "manifests": [ { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 1365, "digest": "sha256:5e28ac423243b187f464d635bcfe1e909f4a31c6c8bce51d0db0a1062bec9e16", "platform": { "architecture": "amd64", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 1365, "digest": "sha256:2945c46e26c9787da884b4065d1de64cf93a3b81ead1b949843dda1fcd458bae", "platform": { "architecture": "arm", "os": "linux", "variant": "v7" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 1365, "digest": "sha256:87fff60114fd3402d0c1a7ddf1eea1ded658f171749b57dc782fd33ee2d47b2d", "platform": { "architecture": "arm64", "os": "linux", "variant": "v8" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 1365, "digest": "sha256:607b43f1d91144f82a9433764e85eb3ccf83f73569552a49bc9788c31b4338de", "platform": { "architecture": "386", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 1365, "digest": "sha256:25ead0e21ed5e246ce31e274b98c09aaf548606788ef28eaf375dc8525064314", "platform": { "architecture": "ppc64le", "os": "linux" } }, { "mediaType": "application/vnd.docker.distribution.manifest.v2+json", "size": 1365, "digest": "sha256:69f5907fa93ea591175b2c688673775378ed861eeb687776669a48692bb9754d", "platform": { "architecture": "s390x", "os": "linux" } } ] } ``` 可以看出 `manifest` 列表中包含了不同系統架構所對應的鏡像 `digest` 值,這樣 Docker 就可以在不同的架構中使用相同的 `manifest` \(例如 `golang:alpine`\) 獲取對應的鏡像。 下面介紹如何使用 `$ docker manifest` 命令創建并推送 `manifest` 列表到 Docker Hub。 ## 構建鏡像 首先在 `Linux x86_64` 構建 `username/x8664-test` 鏡像。并在 `Linux arm64v8` 中構建 `username/arm64v8-test` 鏡像,構建好之后推送到 Docker Hub。 ## 創建 `manifest` 列表 ```bash # $ docker manifest create MANIFEST_LIST MANIFEST [MANIFEST...] $ docker manifest create username/test \ username/x8664-test \ username/arm64v8-test ``` 當要修改一個 `manifest` 列表時,可以加入 `-a,--amend` 參數。 ## 設置 `manifest` 列表 ```bash # $ docker manifest annotate [OPTIONS] MANIFEST_LIST MANIFEST $ docker manifest annotate username/test \ username/x8664-test \ --os linux --arch x86_64 $ docker manifest annotate username/test \ username/arm64v8-test \ --os linux --arch arm64 --variant v8 ``` 這樣就配置好了 `manifest` 列表。 ## 查看 `manifest` 列表 ```bash $ docker manifest inspect username/test ``` ## 推送 `manifest` 列表 最后我們可以將其推送到 Docker Hub。 ```bash $ docker manifest push username/test ``` ## 測試 我們在 `Linux x86_64` `Linux arm64v8` 中分別執行 `$ docker run -it --rm username/test` 命令,發現可以正確的執行。 ## 官方博客 詳細了解 `manifest` 可以閱讀官方博客。 * [https://blog.docker.com/2017/11/multi-arch-all-the-things/](https://blog.docker.com/2017/11/multi-arch-all-the-things/)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看