د HTTP غوښتنو په کارولو سره د ډاکر پیرودونکي پرته د ډاکر پل او ډاکر پش کمانډ پلي کول

موږ د واښو 2 کڅوړې درلودې ، 75 میسکلین ټابلیټونه یونیکس چاپیریال ، د ډاکر ذخیره او د ډاکر پیرودونکي پرته د ډاکر پل او ډاکر پش کمانډونو پلي کولو دنده.

د HTTP غوښتنو په کارولو سره د ډاکر پیرودونکي پرته د ډاکر پل او ډاکر پش کمانډ پلي کول

UPD:
پوښتنه: دا ټول د څه لپاره؟
ځواب: د محصول بار ازموینه (بش نه کارول کیږي، سکریپټونه د تعلیمي موخو لپاره چمتو شوي). دا پریکړه وشوه چې د ډاکر پیرودونکي د اضافي پرتونو کمولو لپاره ونه کاروئ (په مناسب حد کې) او په وینا یې د لوړ بار تقلید وکړئ. د پایلې په توګه ، د ډاکر پیرودونکي ټول سیسټم ځنډونه لرې شوي. موږ په مستقیم ډول په محصول کې نسبتا پاک بار ترلاسه کړ.
مقاله د GNU وسیلو نسخې کارولې.

لومړی، راځئ چې معلومه کړو چې دا حکمونه څه کوي.

نو د ډاکر پل د څه لپاره کارول کیږي؟ په وینا د اسناد:

"د ثبت څخه یو عکس یا ذخیره راوباسئ".

هلته موږ یو لینک هم موندلی شو د انځورونو، کانتینرونو، او ذخیره کولو چلوونکي پوهه کړئ.

د HTTP غوښتنو په کارولو سره د ډاکر پیرودونکي پرته د ډاکر پل او ډاکر پش کمانډ پلي کول

له دې ځایه موږ پوهیږو چې د ډاکر عکس د ځانګړو پرتونو یوه مجموعه ده چې په عکس کې د وروستي بدلونونو په اړه معلومات لري ، کوم چې په څرګند ډول هغه څه دي چې موږ ورته اړتیا لرو. بیا موږ ګورو د راجستر API.

دا لاندې وايي:

"انځور" د JSON منشور او انفرادي پرت فایلونو ترکیب دی. د عکس ایستلو پروسه د دې دوه برخو ترلاسه کولو شاوخوا مرکزونه دي.

نو د اسنادو له مخې لومړی ګام دا دی "د عکس منشور ایستل".

البته، موږ به دا ډزې ونه کړو، مګر موږ له هغې څخه ډاټا ته اړتیا لرو. لاندې یوه بیلګه غوښتنه ده: GET /v2/{name}/manifests/{reference}

"نوم او د حوالې پیرامیټر انځور پیژني او اړین دي. په حواله کې کیدای شي ټګ یا هضم شامل وي."

زموږ د ډاکر ذخیره په ځایی توګه ځای پرځای شوې، راځئ چې د غوښتنې اجرا کولو هڅه وکړو:

curl -s -X GET "http://localhost:8081/link/to/docker/registry/v2/centos-11-10/manifests/1.1.1" -H "header_if_needed"

د HTTP غوښتنو په کارولو سره د ډاکر پیرودونکي پرته د ډاکر پل او ډاکر پش کمانډ پلي کول

په ځواب کې ، موږ json ترلاسه کوو له کوم څخه چې موږ اوس مهال یوازې د ژوند لیکونو سره علاقه لرو ، یا د دوی هشونه. د دوی په ترلاسه کولو سره، موږ کولی شو هر یو ته لاړ شو او لاندې غوښتنه اجرا کړو: "GET /v2/{name}/blobs/{digest}"

"یو پرت ته لاسرسی به د ذخیره په نوم وتړل شي مګر د هضم لخوا په راجسټری کې په ځانګړي ډول پیژندل کیږي."

په دې قضیه کې هضم هغه هش دی چې موږ ترلاسه کړی.

هڅه کوي

curl -s -X GET "http://localhost:8081/link/to/docker/registry/v2/centos-11-10/blobs/sha256:f972d139738dfcd1519fd2461815651336ee25a8b54c358834c50af094bb262f" -H "header_if_needed" --output firstLayer

د HTTP غوښتنو په کارولو سره د ډاکر پیرودونکي پرته د ډاکر پل او ډاکر پش کمانډ پلي کول

راځئ وګورو چې کوم ډول فایل موږ په پای کې د لومړي لایف لاین په توګه ترلاسه کړ.

file firstLayer

د HTTP غوښتنو په کارولو سره د ډاکر پیرودونکي پرته د ډاکر پل او ډاکر پش کمانډ پلي کول

هغه. ریلونه د ټار آرشیف دي، په مناسب ترتیب کې یې پیک کول موږ به د عکس مینځپانګې ترلاسه کړو.

راځئ چې یو کوچنی بش سکریپټ ولیکئ ترڅو دا ټول اتومات شي

#!/bin/bash -eu

downloadDir=$1
# url as http://localhost:8081/link/to/docker/registry
url=$2
imageName=$3
tag=$4

# array of layers
layers=($(curl -s -X GET "$url/v2/$imageName/manifests/$tag" | grep -oP '(?<=blobSum" : ").+(?=")'))

# download each layer from array
for layer in "${layers[@]}"; do
    echo "Downloading ${layer}"
    curl -v -X GET "$url/v2/$imageName/blobs/$layer" --output "$downloadDir/$layer.tar"
done

# find all layers, untar them and remove source .tar files
cd "$downloadDir" && find . -name "sha256:*" -exec tar xvf {} ;
rm sha256:*.tar
exit 0

اوس موږ کولی شو دا د مطلوب پیرامیټونو سره پرمخ یوسو او د اړتیا وړ عکس مینځپانګه ترلاسه کړو

./script.sh dirName “http://localhost:8081/link/to/docker/registry” myAwesomeImage 1.0

2 برخه - د ډاکر فشار

دا به یو څه ډیر پیچلي وي.

راځئ چې بیا سره پیل وکړو اسناد. نو موږ اړتیا لرو چې هر مشر ډاونلوډ کړو ، ورته منشور راټول کړو او دا یې هم ډاونلوډ کړو. دا ساده ښکاري.

د اسنادو د مطالعې وروسته، موږ کولی شو د ډاونلوډ پروسه په څو مرحلو ویشو:

  • د پروسې پیل کول - "POST /v2/{repoName}/blobs/uploads/"
  • د لایف لاین اپلوډ کول (موږ به یو واحد اپلوډ وکاروو، د بیلګې په توګه موږ هر ژوند لیک په بشپړ ډول لیږو) - "PUT /v2/{repoName}/blobs/uploads/{uuid}?digest={digest}
    د منځپانګې اوږدوالی: {د پرت اندازه}
    د منځپانګې ډول: غوښتنلیک/اوکټیټ سټریم
    پرت بائنری ډیټا".
  • د منشور پورته کول - "PUT /v2/{repoName}/manifests/{reference}".

مګر اسناد یو ګام له لاسه ورکوي، پرته له دې چې هیڅ شی به کار وکړي. د واحد بار کولو لپاره ، او همدارنګه د جزوي (ټوټو) لپاره ، د ریل بار کولو دمخه ، تاسو باید د PATCH غوښتنه ترسره کړئ:

"پیچ /v2/{repoName}/blobs/uploads/{uuid}
د منځپانګې اوږدوالی: {د ټوټې اندازه}
د منځپانګې ډول: غوښتنلیک/اوکټیټ سټریم
{د پرت برخه بائنري ډاټا}".

که نه نو تاسو به نشئ کولی د لومړي ټکي څخه تیر شئ، ځکه چې ... د متوقع ځواب کوډ 202 پرځای، تاسو به 4xx ترلاسه کړئ.

اوس الګوریتم داسې ښکاري:

  • پیل کول
  • پیچ ریل
  • د دستګاه بار کول
  • منشور پورته کول
    په ترتیب سره 2 او 3 ټکي به څو ځله تکرار شي څومره چې د لینونو شمیر ته اړتیا وي.

لومړی، موږ هر انځور ته اړتیا لرو. زه به archlinux:latest وکاروم

docker pull archlinux

د HTTP غوښتنو په کارولو سره د ډاکر پیرودونکي پرته د ډاکر پل او ډاکر پش کمانډ پلي کول

اوس راځئ چې دا د نورو تحلیلونو لپاره په محلي توګه خوندي کړو

docker save c24fe13d37b9 -o savedArch

د HTTP غوښتنو په کارولو سره د ډاکر پیرودونکي پرته د ډاکر پل او ډاکر پش کمانډ پلي کول

پایله لرونکی آرشیف په اوسني لارښود کې خلاص کړئ

tar xvf savedArch

د HTTP غوښتنو په کارولو سره د ډاکر پیرودونکي پرته د ډاکر پل او ډاکر پش کمانډ پلي کول

لکه څنګه چې تاسو لیدلی شئ، هر ژوند لیک په جلا فولډر کې دی. اوس راځئ چې د منشور جوړښت ته وګورو چې موږ ترلاسه کړي

cat manifest.json | json_pp

د HTTP غوښتنو په کارولو سره د ډاکر پیرودونکي پرته د ډاکر پل او ډاکر پش کمانډ پلي کول

ډیر نه. راځئ وګورو چې د بارولو لپاره کوم مینیفیسټ ته اړتیا ده ، په وینا اسناد.

د HTTP غوښتنو په کارولو سره د ډاکر پیرودونکي پرته د ډاکر پل او ډاکر پش کمانډ پلي کول

په ښکاره ډول، موجوده منشور موږ ته مناسب نه دی، نو موږ به خپل ځان د بلیک جیک او محکمو، ژوند لیکونو او تشکیلاتو سره جوړ کړو.

موږ به تل لږترلږه یو ترتیب فایل او د ژوند لیکونو لړۍ ولرو. د سکیم نسخه 2 (د لیکلو په وخت کې اوسنی)، د میډیا ډول به بدله پاتې شي:

echo ‘{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
   "config": {
      "mediaType": "application/vnd.docker.container.image.v1+json",
      "size": config_size,
      "digest": "config_hash"
   },
   "layers": [
      ’ > manifest.json

د بنسټیز منشور جوړولو وروسته، تاسو اړتیا لرئ چې دا د باوري معلوماتو سره ډک کړئ. د دې کولو لپاره، موږ د ریل اعتراض json ټیمپلیټ کاروو:

{
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": ${layersSizes[$i]},
         "digest": "sha256:${layersNames[$i]}"
      },

موږ به دا د هر ریل لپاره منشور ته اضافه کړو.

بیا ، موږ اړتیا لرو د تشکیل فایل اندازه معلومه کړو او سټبونه د ریښتیني معلوماتو سره په مینی فیسټ کې ځای په ځای کړو

sed -i "s/config_size/$configSize/g; s/config_hash/$configName/g" $manifestFile

اوس تاسو کولی شئ د ډاونلوډ پروسه پیل کړئ او خپل ځان یو uid خوندي کړئ، کوم چې باید د ټولو راتلونکو غوښتنو سره وي.

بشپړ سکریپټ داسې ښکاري:

#!/bin/bash -eux

imageDir=$1
# url as http://localhost:8081/link/to/docker/registry
url=$2
repoName=$3
tag=$4
manifestFile=$(readlink -f ${imageDir}/manifestCopy)
configFile=$(readlink -f $(find $imageDir -name "*.json" ! -name "manifest.json"))

# calc layers sha 256 sum, rename them accordingly, and add info about each to manifest file
function prepareLayersForUpload() {
  info_file=$imageDir/info
  # lets calculate layers sha256 and use it as layers names further
  layersNames=($(find $imageDir -name "layer.tar" -exec shasum -a 256 {} ; | cut -d" " -f1))

  # rename layers according to shasums. !!!Set required amount of fields for cut command!!!
  # this part definitely can be done easier but i didn't found another way, sry
  find $imageDir -name "layer.tar" -exec bash -c 'mv {} "$(echo {} | cut -d"/" -f1,2)/$(shasum -a 256 {} | cut -d" " -f1)"' ;

  layersSizes=($(find $imageDir -name "*.tar" -exec ls -l {} ; | awk '{print $5}'))

  for i in "${!layersNames[@]}"; do
    echo "{
         "mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
         "size": ${layersSizes[$i]},
         "digest": "sha256:${layersNames[$i]}"
      }," >> $manifestFile
  done
  # remove last ','
  truncate -s-2 $manifestFile
  # add closing brakets to keep json consistent
  printf "nt]n}" >> $manifestFile
}

# calc config sha 256 sum and add info about it to manifest
function setConfigProps() {
  configSize=$(ls -l $configFile | awk '{print $5}')
  configName=$(basename $configFile | cut -d"." -f1)

  sed -i "s/config_size/$configSize/g; s/config_hash/$configName/g" $manifestFile
}

#prepare manifest file
prepareLayersForUpload
setConfigProps
cat $manifestFile

# initiate upload and get uuid
uuid=$(curl -s -X POST -I "$url/v2/$repoName/blobs/uploads/" | grep -oP "(?<=Docker-Upload-Uuid: ).+")

# patch layers
# in data-binary we're getting absolute path to layer file
for l in "${!layersNames[@]}"; do
  pathToLayer=$(find $imageDir -name ${layersNames[$l]} -exec readlink -f {} ;)
    curl -v -X PATCH "$url/v2/$repoName/blobs/uploads/$uuid" 
  -H "Content-Length: ${layersSizes[$i]}" 
  -H "Content-Type: application/octet-stream" 
  --data-binary "@$pathToLayer"

# put layer
  curl -v -X PUT "$url/v2/$repoName/blobs/uploads/$uuid?digest=sha256:${layersNames[$i]}" 
  -H 'Content-Type: application/octet-stream' 
  -H "Content-Length: ${layersSizes[$i]}" 
  --data-binary "@$pathToLayer"
done

# patch and put config after all layers
curl -v -X PATCH "$url/v2/$repoName/blobs/uploads/$uuid" 
  -H "Content-Length: $configSize" 
  -H "Content-Type: application/octet-stream" 
  --data-binary "@$configFile"

  curl -v -X PUT "$url/v2/$repoName/blobs/uploads/$uuid?digest=sha256:$configName" 
  -H 'Content-Type: application/octet-stream' 
  -H "Content-Length: $configSize" 
  --data-binary "@$configFile"

# put manifest
curl -v -X PUT "$url/v2/$repoName/manifests/$tag" 
  -H 'Content-Type: application/vnd.docker.distribution.manifest.v2+json' 
  --data-binary "@$manifestFile"

exit 0

موږ کولی شو یو چمتو شوی سکریپټ وکاروو:

./uploadImage.sh "~/path/to/saved/image" "http://localhost:8081/link/to/docker/registry" myRepoName 1.0

UPD:
په پایله کې مو څه ترلاسه کړل؟
لومړی ، د تحلیل لپاره ریښتیني معلومات ، ځکه چې ازموینې په بلیزمیټر کې پرمخ وړل کیږي او د ډاکر پیرودونکي غوښتنو ډاټا خورا معلوماتي ندي ، د خالص HTTP غوښتنو برخلاف.

دوهم، لیږد موږ ته اجازه راکړه چې د ډاکر اپلوډ لپاره د مجازی کاروونکو شمیر شاوخوا 150٪ زیات کړو او د اوسط غبرګون وخت 20-25٪ ګړندی ترلاسه کړو. د ډاکر ډاونلوډ لپاره، موږ د 500٪ لخوا د کاروونکو شمیر زیاتولو توان درلود، پداسې حال کې چې د اوسط غبرګون وخت شاوخوا 60٪ کم شوی.

تاسو د پاملرنې څخه مو مننه.

سرچینه: www.habr.com

Add a comment