如何通過docker pull以外的方式 Tag Docker鏡像

2021-12-23 容器時代

您將花費1~3min瀏覽完這篇文章~

        我在研究多個鏡像之間的文件層合併時,意識到我們並不需要拖拽整個鏡像來標記鏡像,用Docker Registry API也可以完成。下面,我為大家詳細介紹。

理解Docker鏡像倉庫API

        Docker 鏡像由多個問價層組成,每個文件層都作為一個通用規則由 Dockerfile 中的命令創建,每一條命令都給鏡像添加一個新的文件層。

        從 Docker 鏡像倉庫 API 的角度來看,一個鏡像包含三種類型的數據:

        在Docker鏡像倉庫的專門術語中,存儲庫存儲名稱相同但標記不同的所有鏡像的文件層和鏡像配置。例如:docker:18.06和docker:stable-dind來自同一個存儲庫,但是library/docker-dev中的所有圖像都在後者中。注意,存儲庫中的鏡像可能完全不同(例如:docker:18.06和docker:stable-dind)。

        鏡像列表羅列所有層的blob和鏡像配置,只有鏡像列表可以儲存在標記名稱下。因此,為了一個標記,下載一個鏡像列表,然後為了另一個標記,再上傳這個鏡像列表;其效果與運行docker pull,接著docker tag,最後docker push相同。使用這個API的好處是:不需要下載鏡像(鏡像顯示的大小只有幾kb)從而大大加快標記速度。

使用curl進行遠程標記

        使用curl進行遠程標記可以通過兩個調用實現:

 #!/bin/bash
 
 REGISTRY_NAME="http://localhost:5000"
 REPOSITORY=rd/dind
 TAG_OLD=25
 TAG_NEW=stable
 CONTENT_TYPE="application/vnd.docker.distribution.manifest.v2+json"
 
 MANIFEST=$(curl -H "Accept: ${CONTENT_TYPE}" "${REGISTRY_NAME}/v2/${REPOSITORY}/manifests/${TAG_OLD}")

 curl -X PUT -H "Content-Type: ${CONTENT_TYPE}" -d "${MANIFEST}" "${REGISTRY_NAME}/v2/${REPOSITORY}/manifests/${TAG_NEW}"

        注意,上述解決方案中沒有執行任何類型的身份驗證。對於基本身份驗證,首先使用-u "<user>:<pass>"為Docker Hub應用獲取令牌,然後再用-H "Authorization: Bearer <token>"。


使用PowerShell進行遠程標記

        在我之前的一篇文章中,我宣布了一個新的PowerShell 模塊 ,用於將多個鏡像中的層合併到一個新鏡像中。我已經添加了一個新的cmdlet叫做Copy-DockerImage 標記鏡像在版本0.7.5.6:直接對應的註冊表。

 Install-Module -Name DockerRegistry -MinimumVersion 0.7
 $Params = @{
    Registry = 'http://localhost:5000'
    SourceRepository = 'test'
    SourceTag = '25'
    DestinationRepository = 'test2'
    DestinationTag = 'stable'
 }
 Copy-DockerImage @Params

        因為cmdlet還支持以新名稱存儲鏡像,所以它比使用curl的變體稍微複雜一些。上面的命令不僅添加了一個新標籤(25 –> stable),還將圖像存儲在一個新名稱下test –> test2)。

        注意,用於Docker 鏡像倉庫API的PowerShell cmdlet支持多種類型的身份驗證。


點擊閱讀原文查看英文原文~

相關焦點

  • Docker鏡像
    :docker@default:~$ docker pull appium Using default tag: latestError response from daemon: pull access denied for appium, repository does not exist or may require
  • 【Docker】系列教程01-使用Docker鏡像
    docker pull 語法通常情況下, 描述一個鏡像需要包括「名稱+標籤「信息。3)使用history命令查看鏡像歷史docker pull 下載鏡像時也我們發現了鏡像文件由多個層組成,可以使用history子命令列出各層的創建信息。例如,查看Ubuntu:18.04鏡像的創建過程,命令如下:
  • 發布 Docker 鏡像到 Dockhub 倉庫
    推薦內容:複製文件到正在運行的 Docker 容器中[1]|Youtube(需科學上網)[2]將正在運行的容器保存為本地 Docker 鏡像[3]|Youtube(需科學上網)[4]我們已經在本地建立了一個鏡像,並且這個鏡像已經通過了我們的測試,現在我們就可以將它發布到我們的伺服器上,而要發布到伺服器上創建容器就需要一個存儲這些鏡像的地方
  • Docker鏡像運行&刪除(三)
    開啟交互式的命令--rm:容器退出時刪除容器的記錄信息--name:指定容器的名稱-d:後臺方式運行容器每個鏡像運行後,都會在容器中存在一條記錄的信息,查詢的指令為:docker ps -a下面演示主要運行centos:7.8.2003的鏡像信息,來演示它的過程:[root@wuyaShare ~
  • 如何在CentOS7下通過Docker方式搭建OpenStf環境?
    windows上通過VMware安裝虛擬機CentOS7,然後安裝docker,使用docker方式搭建。CentOS如何搭建不在本文範圍。注意:windows系統不建議直接用docker的toolbox版本,會有很多問題。
  • 三分鐘Docker-推送本地鏡像到倉庫
    本文將會演示如何把自己構建的鏡像上傳到docker官網的倉庫和自己私有倉庫本地鏡像推送到官網的registry1.創建倉庫點擊Docker Desktop圖標->Repositories-》create  跳轉到官網創建頁面
  • docker常用命令詳解
    wait|export|port|rename|stat]容器rootfs命令 — docker [commit|cp|diff]鏡像倉庫 — docker [login|pull|push|search]本地鏡像管理 — docker [build|images|rmi|tag|save|import|load]容器資源管理 — docker [volume|network]系統日誌信息 — docker
  • Docker快速入門
    獲取鏡像:docker pull NAME[:TAG]查看鏡像信息: 查看所有鏡像docker images;查看某個鏡像具體信息docker inspect添加標籤: docker tag xxx ubuntu:first搜尋鏡像: docker search xxx, -s=0指定星級刪除鏡像: docker rmi xxx,一般情況下會刪除鏡像的標籤,而不是文件
  • 通過Docker部署深度學習項目環境
    仔細看了一下,最新版的Tensorflow GPU Docker 容器需要的是CUDA>=10.0,這臺機器是9.2,並不符合,兩種解決方案,一種是升級CUDA到10.x版本,但是我暫時不想升級,google了一下,發現這個tag版本可用cuda9.x:1.12.0-gpu ,所以重新拉取Tensorflow相應版本的鏡像:docker pull tensorflow
  • 【Docker學習】2. 操作鏡像
    獲取鏡像Docker Hub 上有大量的高質量的鏡像可以用。從 Docker 鏡像倉庫獲取鏡像的命令是 docker pull。其命令格式為:docker pull [選項] [Docker Registry 地址[:埠號]/]倉庫名[:標籤]具體的選項可以通過 docker pull --help 命令看到,這裡我們說一下鏡像名稱的格式。
  • 巧用Docker鏡像倉庫Harbor部署私有Mirror服務
    點擊項目名稱,進入該項目下的鏡像管理界面,可以查看、檢索鏡像。Docker client以上是UI界面的使用,接下來介紹如何使用docker client進行鏡像的管理,由於Harbor只支持Registry V2 API,因此Docker client版本必須>= 1.6.0。
  • Docker - 私有倉庫Registry
    如果沒有,可以先拉取下來docker image pull registry設置私有倉庫地址vim /etc//etc…" 9 minutes ago Up 9 minutes 5000/tcp nostalgic_elion此時你可以訪問如下地址,如果看到 {} 就說明 Registry 運行正常上傳鏡像比如此時我要將 ubuntu 這個鏡像上傳到私有倉庫docker tag ubuntu
  • docker筆記
    拉取鏡像 docker pull image:latest image表示鏡像名字 , latest 表示最新 , 如 :nginx:latest php:latest 查看鏡像 docker images [ -a -q ] -q 只顯示id刪除鏡像 docker rmi imageID
  • 企業級Docker鏡像倉庫Harbor部署與使用
    例如,開發人員需要對項目構建這就用到讀寫權限(push/pull),測試人員只需要讀權限(pull),運維一般管理鏡像倉庫,具備權限分配能力,項目經理具有所有權限。 鏡像複製可以將倉庫中的鏡像同步到遠程的Harbor,類似於MySQL主從同步功能。
  • 區域網內部署 Docker Registry
    本文將從創建單機的 Docker Registry 開始,逐步完成區域網內可用的 Docker Registry 的創建,並重點解釋如何使用 IP 地址訪問 Registry 的方法。注意,本文假設你已經在使用的 OS 中安裝了 docker 引擎。
  • 使用Docker Registry搭建Docker私有倉庫
    如果本地沒有下載過docker-registry,則首次會pull registry 運行時會映射路徑和埠,以後就可以從/opt/docker-registry下找到私有倉庫,這裡查看下我本機的鏡像$ docker imagesREPOSITORY          TAG                 IMAGE ID            CREATED
  • Docker入門詳解
    注意與註冊伺服器(Registry)的區別:註冊伺服器是存放倉庫的地方,一般會有多個倉庫;而倉庫是存放鏡像的地方,一般每個倉庫存放一類鏡像,每個鏡像利用tag進行區分,比如Ubuntu倉庫存放有多個版本(12.04、14.04等)的Ubuntu鏡像。
  • Docker使用入門介紹
    注意與註冊伺服器(Registry)的區別:註冊伺服器是存放倉庫的地方,一般會有多個倉庫;而倉庫是存放鏡像的地方,一般每個倉庫存放一類鏡像,每個鏡像利用tag進行區分,比如Ubuntu倉庫存放有多個版本(12.04、14.04等)的Ubuntu鏡像。
  • Docker Registry 遷移至 Harbor(4種方法)
    根據《 深入淺出容器鏡像的一生》一文中提到的 registry 的存儲目錄結構。在 registry 存儲目錄中,每個鏡像的 tag 都是由 current/index 這個文件指向該 tag 鏡像的 manifests 文件的,由此我們可以通過遍歷 registry 存儲目錄中 current/index 文件的方式來得到所有鏡像的 tag,由此得到該 registry 中所有鏡像的列表。
  • Docker集群 - Docker簡單入門
    ubuntu的鏡像#docker pull ubuntu:latest //選擇其中的官方鏡像下載,若不指定tag,則默認下載latest版本#docker images  //下載完成後,通過docker images命令查看是否下載成功 3.2  啟動容器# docker run –ti ubuntu /bin