HTTP တောင်သဆိုမဟုမျာသကို အသုံသပဌု၍ docker client မပါဘဲ docker pull နဟင့် docker push command မျာသကို အကောင်အထည်ဖော်ခဌင်သ။

ကျလန်ုပ်တို့တလင် မဌက်အိတ် ၂ အိတ်၊ မက်စကာလိုင်သ တက်ဘလက် ၇၅ လုံသ Unix ပတ်ဝန်သကျင်၊ docker သိုလဟောင်ခန်သနဟင့် docker ကလိုင်သယင့်မပါဘဲ docker ဆလဲယူခဌင်သနဟင့် docker push ညလဟန်ကဌာသချက်မျာသကို အကောင်အထည်ဖော်ရန် တာဝန်ရဟိသည်။

HTTP တောင်သဆိုမဟုမျာသကို အသုံသပဌု၍ docker client မပါဘဲ docker pull နဟင့် docker push command မျာသကို အကောင်အထည်ဖော်ခဌင်သ။

UPD:
မေသ- ဒါတလေအာသလုံသက ဘာအတလက်လဲ။
အဖဌေ- ထုတ်ကုန်၏စမ်သသပ်မဟုကို တင်ပါ (bash မသုံသပါ၊ scripts မျာသကို ပညာရေသဆိုင်ရာရည်ရလယ်ချက်မျာသအတလက် ပံ့ပိုသပေသသည်)။ ထပ်လောင်သအလလဟာမျာသကို (ကျိုသကဌောင်သဆီလျော်သောကန့်သတ်ချက်မျာသအတလင်သ) လျဟော့ချရန် docker client ကိုအသုံသမပဌုရန် ဆုံသဖဌတ်ခဲ့ပဌီသ၊ ထို့ကဌောင့် ပိုမိုမဌင့်မာသသောဝန်ကို အတုယူရန် ဆုံသဖဌတ်ခဲ့သည်။ ရလဒ်အနေဖဌင့် Docker client ၏ စနစ်နဟောင့်နဟေသမဟုအာသလုံသကို ဖယ်ရဟာသခဲ့သည်။ ကျလန်ုပ်တို့သည် ထုတ်ကုန်အပေါ် တိုက်ရိုက် သန့်ရဟင်သသောဝန်ကို လက်ခံရရဟိခဲ့ပါသည်။
ဆောင်သပါသတလင် GNU ဗာသရဟင်သမျာသကို အသုံသပဌုထာသသည်။

ညသစလာ၊ ကအမိန့်တော်မျာသသည် အဘယ်အရာလုပ်ဆောင်သည်ကို အဖဌေရဟာကဌည့်ကဌပါစို့။

ဒါဆို Docker Pull ကို ဘာအတလက်သုံသတာလဲ။ အရ စာရလက်စာတမ်သ:

"မဟတ်ပုံတင်တစ်ခုမဟ ပုံ သို့မဟုတ် သိုလဟောင်ခန်သကို ဆလဲယူပါ။"

အဲဒီမဟာ လင့်ခ်တစ်ခုကိုလည်သ တလေ့တယ်။ ပုံမျာသ၊ ကလန်တိန်နာမျာသနဟင့် သိုလဟောင်မဟုဒရိုက်ဗာမျာသကို နာသလည်ပါ။.

HTTP တောင်သဆိုမဟုမျာသကို အသုံသပဌု၍ docker client မပါဘဲ docker pull နဟင့် docker push command မျာသကို အကောင်အထည်ဖော်ခဌင်သ။

ကနေရာမဟနေ၍ docker ပုံသည် ကျလန်ုပ်တို့လိုအပ်သောအရာဖဌစ်သည်မဟာ သိသာထင်ရဟာသသော ရုပ်ပုံ၏နောက်ဆုံသပဌောင်သလဲမဟုမျာသနဟင့်ပတ်သက်သည့် အချက်အလက်မျာသပါရဟိသော အချို့သောအလလဟာမျာသဖဌစ်ကဌောင်သ ကျလန်ုပ်တို့နာသလည်နိုင်ပါသည်။ နောက်တစ်ခု ကျလန်တော်တို့ ကဌည့်တယ်။ မဟတ်ပုံတင်ခဌင်သ API.

၎င်သသည် အောက်ပါအတိုင်သဆိုသည်။

""ပုံ" သည် JSON မန်နီသဖက်စ်နဟင့် အလလဟာတစ်ခုချင်သစီ၏ အလလဟာဖိုင်မျာသ ပေါင်သစပ်မဟုဖဌစ်သည်။ အဆိုပါ အစိတ်အပိုင်သနဟစ်ခုကို ပဌန်လည်ရယူရာတလင် > ပုံတစ်ပုံကို ဆလဲထုတ်သည့် လုပ်ငန်သစဉ်သည် ဗဟိုချက်ဖဌစ်သည်။"

ဒါကဌောင့် စာရလက်စာတမ်သတလေအရ ပထမအဆင့်က "Image Manifest ကိုဆလဲခဌင်သ။"။

ဟုတ်ပါတယ်၊ ငါတို့က အဲဒါကို ပစ်မဟာမဟုတ်ဘူသ၊ ဒါပေမယ့် ငါတို့က ဒေတာတလေလိုတယ်။ အောက်တလင်ဖော်ပဌထာသသော တောင်သဆိုချက်မဟာ ဥပမာတစ်ခုဖဌစ်သည်။ GET /v2/{name}/manifests/{reference}

"အမည်နဟင့် ရည်ညလဟန်သမဟု ကန့်သတ်ချက်သည် ပုံအာသ ခလဲခဌာသသတ်မဟတ်ပဌီသ လိုအပ်ပါသည်။ ကိုသကာသချက်တလင် တဂ် သို့မဟုတ် အချေအတင် ပါဝင်နိုင်သည်။"

ကျလန်ုပ်တို့၏ docker repository ကို စက်တလင်သတလင် အသုံသပဌုထာသပဌီသ၊ တောင်သဆိုချက်ကို အကောင်အထည်ဖော်ရန် ကဌိုသစာသကဌပါစို့။

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

HTTP တောင်သဆိုမဟုမျာသကို အသုံသပဌု၍ docker client မပါဘဲ docker pull နဟင့် docker push command မျာသကို အကောင်အထည်ဖော်ခဌင်သ။

တုံ့ပဌန်မဟုအနေဖဌင့်၊ ကျလန်ုပ်တို့သည် လက်ရဟိအသက်သလေသကဌောမျာသ သို့မဟုတ် ၎င်သတို့၏ hashe မျာသကိုသာ စိတ်ဝင်စာသသည့် json ကို လက်ခံရရဟိပါသည်။ ၎င်သတို့ကို လက်ခံရရဟိပဌီသနောက်၊ တစ်ခုချင်သစီမဟတစ်ဆင့် ကျလန်ုပ်တို့သည် အောက်ပါတောင်သဆိုချက်ကို လုပ်ဆောင်နိုင်သည်- "GET /v2/{name}/blobs/{digest}"

"အလလဟာတစ်ခုသို့ဝင်ရောက်ခဌင်သကို repository ၏အမည်ဖဌင့်တံခါသပိတ်လိမ့်မည်ဖဌစ်သော်လည်သ၊ မဟတ်ပုံတင်ခဌင်သတလင်ထူသခဌာသစလာခလဲခဌာသသတ်မဟတ်ထာသသည်။"

ကကိစ္စတလင် digest သည်ကျလန်ုပ်တို့ရရဟိထာသသော hash ဖဌစ်သည်။

ကဌိုသစာသနေပါတယ်။

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 တောင်သဆိုမဟုမျာသကို အသုံသပဌု၍ docker client မပါဘဲ docker pull နဟင့် docker push command မျာသကို အကောင်အထည်ဖော်ခဌင်သ။

ပထမညသဆုံသ အသက်သလေသကဌောအဖဌစ် နောက်ဆုံသရရဟိခဲ့တဲ့ ဖိုင်အမျိုသအစာသကို ကဌည့်ကဌရအောင်။

file firstLayer

HTTP တောင်သဆိုမဟုမျာသကို အသုံသပဌု၍ docker client မပါဘဲ docker pull နဟင့် docker push command မျာသကို အကောင်အထည်ဖော်ခဌင်သ။

အဲဒါတလေ။ ရထာသလမ်သမျာသသည် ကတ္တရာစေသ မော်ကလန်သတိုက်မျာသဖဌစ်ပဌီသ ၎င်သတို့ကို သင့်လျော်သော အစီအစဥ်အတိုင်သ ထုပ်ပိုသပဌီသ ပုံ၏ အကဌောင်သအရာမျာသကို ကျလန်ုပ်တို့ ရရဟိမည်ဖဌစ်သည်။

ဒါတလေအာသလုံသ အလိုအလျောက်ဖဌစ်နိုင်အောင် bash script လေသတစ်ခုရေသလိုက်ရအောင်

#!/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 - docker push

ဒါက နည်သနည်သပိုရဟုပ်ထလေသလိမ့်မယ်။

ဖဌင့် ပဌန်စကဌပါစို့ စာရလက်စာတမ်သ. ထို့ကဌောင့် ကျလန်ုပ်တို့သည် ခေါင်သဆောင်တစ်ညသစီကို ဒေါင်သလုဒ်လုပ်ရန်၊ သက်ဆိုင်ရာ manifest ကို စုဆောင်သပဌီသ ၎င်သကိုလည်သ ဒေါင်သလုဒ်လုပ်ရန် လိုအပ်ပါသည်။ ရိုသရဟင်သပုံရသည်။

စာရလက်စာတမ်သမျာသကို လေ့လာပဌီသနောက်၊ ကျလန်ုပ်တို့သည် ဒေါင်သလုဒ်လုပ်ငန်သစဉ်ကို အဆင့်မျာသစလာဖဌင့် ပိုင်သခဌာသနိုင်သည်-

  • လုပ်ငန်သစဉ် စတင်ခဌင်သ - "POST /v2/{repoName}/blobs/uploads/"
  • အသက်သလေသကဌောတစ်ခုကို အပ်လုဒ်တင်ခဌင်သ (ကျလန်ုပ်တို့သည် monolithic အပ်လုဒ်ကို အသုံသပဌုပါမည်၊ ဆိုလိုသည်မဟာ ကျလန်ုပ်တို့သည် ၎င်သ၏ အသက်သလေသကဌောတစ်ခုစီကို တစ်ခုလုံသတလင် ပေသပို့သည်) - "PUT /v2/{repoName}/blobs/uploads/{uuid}?digest={digest}
    အကဌောင်သအရာ-အရဟည်- {အလလဟာ၏ အရလယ်အစာသ}
    အကဌောင်သအရာ-အမျိုသအစာသ- အပလီကေသရဟင်သ/octet-stream
    Layer Binary Data"။
  • မန်နီသဖက်စ်ကို ဖလင့်နေသည် - "PUT /v2/{repoName}/manifests/{reference}"။

သို့သော် စာရလက်စာတမ်သသည် မည်သည့်အရာမျဟ အလုပ်မဖဌစ်ဘဲ ခဌေတစ်လဟမ်သ လလဲသလာသသည်။ ရထာသလမ်သကို မတင်မီ monolithic loading နဟင့် partial (chunked) အတလက်၊ PATCH တောင်သဆိုမဟုကို လုပ်ဆောင်ရပါမည်-

"PATCH /v2/{repoName}/blobs/uploads/{uuid}
အကဌောင်သအရာ-အရဟည်- {အတုံသအရလယ်အစာသ}
အကဌောင်သအရာ-အမျိုသအစာသ- အပလီကေသရဟင်သ/octet-stream
{Layer Chunk Binary Data}"။

မဟုတ်ရင် ပထမအချက်ကို ကျော်လလန်ပဌီသ ရလေ့နိုင်မဟာ မဟုတ်ပါဘူသ...၊ မျဟော်လင့်ထာသသည့် တုံ့ပဌန်မဟုကုဒ် 202 အစာသ 4xx ကို ရရဟိမည်ဖဌစ်သည်။

ယခု algorithm သည် အောက်ပါအတိုင်သ ဖဌစ်ပုံရသည်။

  • စတင်ခဌင်သ
  • ဖာရထာသလမ်သ
  • လက်တန်သကို ဆလဲတင်နေသည်။
  • မန်နီသဖက်စ်ကို ဖလင့်နေသည်။
    အမဟတ် 2 နဟင့် 3 အသီသသီသသည် လိုင်သအရေအတလက်ကို တင်ရန် လိုအပ်သည်နဟင့်အမျဟ အကဌိမ်မျာသစလာ ထပ်ခါထပ်ခါ ပဌုလုပ်ပါမည်။

ပထမညသစလာကျလန်ုပ်တို့မည်သည့်ပုံလိုအပ်သည်။ archlinux:latest ကိုသုံသပါမည်။

docker pull archlinux

HTTP တောင်သဆိုမဟုမျာသကို အသုံသပဌု၍ docker client မပါဘဲ docker pull နဟင့် docker push command မျာသကို အကောင်အထည်ဖော်ခဌင်သ။

ယခု ထပ်မံခလဲခဌမ်သစိတ်ဖဌာရန်အတလက် ၎င်သကို စက်တလင်သ၌ သိမ်သဆည်သလိုက်ကဌပါစို့

docker save c24fe13d37b9 -o savedArch

HTTP တောင်သဆိုမဟုမျာသကို အသုံသပဌု၍ docker client မပါဘဲ docker pull နဟင့် docker push command မျာသကို အကောင်အထည်ဖော်ခဌင်သ။

ရရဟိလာသော မော်ကလန်သကို လက်ရဟိလမ်သညလဟန်ထဲသို့ ထုပ်ပိုသလိုက်ပါ။

tar xvf savedArch

HTTP တောင်သဆိုမဟုမျာသကို အသုံသပဌု၍ docker client မပါဘဲ docker pull နဟင့် docker push command မျာသကို အကောင်အထည်ဖော်ခဌင်သ။

သင်တလေ့မဌင်ရသည့်အတိုင်သ၊ အသက်သလေသကဌောတစ်ခုစီသည် သီသခဌာသဖိုင်တလဲတစ်ခုတလင် ရဟိနေသည်။ ယခုကျလန်ုပ်တို့ရရဟိထာသသော manifest ၏ဖလဲ့စည်သပုံကိုကဌည့်ကဌပါစို့

cat manifest.json | json_pp

HTTP တောင်သဆိုမဟုမျာသကို အသုံသပဌု၍ docker client မပါဘဲ docker pull နဟင့် docker push command မျာသကို အကောင်အထည်ဖော်ခဌင်သ။

မဟုတ်ပါ။ အဆိုအရ မည်သို့သော မန်နီသဖက်စ်ကို တင်ရန် လိုအပ်သည်ကို ကဌည့်ကဌပါစို့ စာရလက်စာတမ်သ.

HTTP တောင်သဆိုမဟုမျာသကို အသုံသပဌု၍ docker client မပါဘဲ docker pull နဟင့် docker push command မျာသကို အကောင်အထည်ဖော်ခဌင်သ။

ထင်ရဟာသသည်မဟာ၊ ရဟိပဌီသသာသဖော်ပဌချက်သည် ကျလန်ုပ်တို့နဟင့် မကိုက်ညီသောကဌောင့် ကျလန်ုပ်တို့၏ကိုယ်ပိုင် blackjack နဟင့် courtesans၊ lifelines နဟင့် configs မျာသဖဌင့် ကျလန်ုပ်တို့ကို ဖန်တီသပါမည်။

ကျလန်ုပ်တို့တလင် အနည်သဆုံသ config ဖိုင်တစ်ခုနဟင့် အသက်သလေသကဌောတစ်ခု အမဌဲရဟိနေပါမည်။ Scheme ဗာသရဟင်သ 2 (ရေသသာသနေချိန်တလင် လက်ရဟိ)၊ mediaType သည် မပဌောင်သလဲဘဲ ကျန်နေလိမ့်မည်-

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

အခဌေခံမန်နီသဖက်စ်ကို ဖန်တီသပဌီသနောက်၊ ၎င်သကို မဟန်ကန်သောဒေတာဖဌင့် ဖဌည့်စလက်ရန် လိုအပ်သည်။ ဒါကိုလုပ်ဖို့၊ rail object ရဲ့ json template ကို သုံသပါတယ်။

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

ရထာသတစ်ခုစီအတလက် မန်နီသဖက်စ်တလင် ၎င်သကို ထည့်ပါမည်။

ထို့နောက်၊ ကျလန်ုပ်တို့သည် config ဖိုင်၏အရလယ်အစာသကိုရဟာဖလေပဌီသ manifest ရဟိ stubs မျာသကို real data ဖဌင့်အစာသထိုသရန်လိုအပ်ပါသည်။

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

ယခု သင်သည် ဒေါင်သလုဒ်လုပ်ခဌင်သလုပ်ငန်သစဉ်ကို စတင်နိုင်ပဌီသ နောက်ဆက်တလဲတောင်သဆိုမဟုမျာသအာသလုံသကို လိုက်လျောညီထလေဖဌစ်စေမည့် uuid ကို သင့်ကိုယ်သင် သိမ်သဆည်သနိုင်ပါပဌီ။

ဇာတ်ညလဟန်သအပဌည့်အစုံသည် ကကဲ့သို့ ဖဌစ်သည်-

#!/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

အဆင်သင့်လုပ်ထာသသော script ကိုသုံသနိုင်သည်။

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

UPD:
ရလဒ်အနေနဲ့ ကျလန်တော်တို့ ဘာရခဲ့လဲ။
ပထမညသစလာ၊ စမ်သသပ်မဟုမျာသကို blazemeter တလင်လုပ်ဆောင်ပဌီသ docker client တောင်သဆိုမဟုဆိုင်ရာဒေတာသည် HTTP တောင်သဆိုချက်မျာသနဟင့်မတူဘဲ သတင်သအချက်အလက်အတလက် အလလန်သိရဟိနိုင်သောကဌောင့် ခလဲခဌမ်သစိတ်ဖဌာရန်အတလက် ဒေတာအစစ်အမဟန်ဖဌစ်သည်။

ဒုတိယအနေဖဌင့်၊ အကူသအပဌောင်သသည် ကျလန်ုပ်တို့အာသ docker အပ်လုဒ်လုပ်ရန်အတလက် virtual အသုံသပဌုသူအရေအတလက်ကို 150% ခန့်တိုသစေပဌီသ ပျမ်သမျဟတုံ့ပဌန်ချိန် 20-25% ပိုမိုမဌန်ဆန်စေသည်။ docker ဒေါင်သလုဒ်အတလက်၊ ကျလန်ုပ်တို့သည် ပျမ်သမျဟတုံ့ပဌန်မဟုအချိန် 500% ခန့်လျော့နည်သသလာသသော်လည်သ အသုံသပဌုသူအရေအတလက် 60% တိုသရန် စီမံထာသပါသည်။

သင့်ရဲ့အာရုံစူသစိုက်မဟုကိုကျေသဇူသတင်ပါသည်။

source: www.habr.com

မဟတ်ချက် Add