Pag-implementar sa docker pull ug docker push commands nga walay docker client gamit ang HTTP requests

Kami adunay 2 ka bag nga sagbot, 75 mescaline tablets unix environment, usa ka docker repository ug ang tahas sa pagpatuman sa docker pull ug docker push commands nga walay kliyente sa docker.

Pag-implementar sa docker pull ug docker push commands nga walay docker client gamit ang HTTP requests

UPS:
Pangutana: Para sa unsa kining tanan?
Tubag: Pag-load sa pagsulay sa produkto (DILI gamit ang bash, ang mga script gihatag alang sa mga katuyoan sa edukasyon). Nakahukom nga dili gamiton ang kliyente sa docker aron makunhuran ang dugang nga mga layer (sulod sa makatarunganon nga mga limitasyon) ug, sumala niana, sundon ang usa ka mas taas nga karga. Ingon usa ka sangputanan, ang tanan nga mga paglangan sa sistema sa kliyente sa Docker gikuha. Nakadawat kami usa ka medyo limpyo nga pagkarga direkta sa produkto.
Ang artikulo migamit ug GNU nga mga bersyon sa mga himan.

Una, atong hibal-an kung unsa kini nga mga sugo.

Busa unsa ang gigamit sa docker pull? Sumala sa dokumentasyon:

"Pagkuha usa ka imahe o usa ka repository gikan sa usa ka rehistro".

Didto usab kita makakita og link sa sabta ang mga hulagway, sudlanan, ug storage drivers.

Pag-implementar sa docker pull ug docker push commands nga walay docker client gamit ang HTTP requests

Gikan dinhi atong masabtan nga ang usa ka docker nga imahe usa ka set sa pipila ka mga layer nga adunay kasayuran bahin sa labing bag-ong mga pagbag-o sa imahe, nga klaro nga kinahanglan naton. Sunod atong tan-awon registry API.

Kini nag-ingon sa mosunod:

"Ang usa ka "larawan" usa ka kombinasyon sa usa ka JSON manifest ug indibidwal nga mga file sa layer. Ang proseso sa pagbira sa usa ka > imahe nagsentro sa pagkuha niining duha ka mga sangkap."

Mao nga ang unang lakang sumala sa dokumentasyon mao ang "Pagbira sa usa ka Image Manifest".

Siyempre, dili namo kini pusilon, apan gikinahanglan namo ang datos gikan niini. Ang mosunod usa ka pananglitan nga hangyo: GET /v2/{name}/manifests/{reference}

"Ang ngalan ug reference parameter nagpaila sa hulagway ug gikinahanglan. Ang reference mahimong maglakip sa usa ka tag o digest."

Ang among docker repository kay gi-deploy sa lokal, atong sulayan nga ipatuman ang hangyo:

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

Pag-implementar sa docker pull ug docker push commands nga walay docker client gamit ang HTTP requests

Agig tubag, nakadawat kami og json diin kami interesado lamang sa mga linya sa kinabuhi, o labi pa sa ilang mga hash. Sa pagkadawat niini, mahimo namong susihon ang matag usa ug ipatuman ang mosunod nga hangyo: "GET /v2/{name}/blobs/{digest}"

"Ang pag-access sa usa ka layer mahimong gated sa ngalan sa repository apan mailhan nga talagsaon sa rehistro pinaagi sa digest."

digest sa kini nga kaso mao ang hash nga among nadawat.

Naningkamot

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

Pag-implementar sa docker pull ug docker push commands nga walay docker client gamit ang HTTP requests

Atong tan-awon kon unsa nga matang sa file ang atong nadawat isip unang linya sa kinabuhi.

file firstLayer

Pag-implementar sa docker pull ug docker push commands nga walay docker client gamit ang HTTP requests

mga. Ang mga riles mga tar archive, pag-unpack niini sa angay nga pagkasunod-sunod makuha namon ang sulud sa imahe.

Magsulat kita og gamay nga bash script aron kining tanan mahimong awtomatiko

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

Karon mahimo na naton kini nga ipadagan sa gusto nga mga parameter ug makuha ang sulud sa gikinahanglan nga imahe

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

Bahin 2 - docker push

Kini mahimong mas komplikado.

Magsugod ta pag-usab sa dokumentasyon. Busa kinahanglan natong i-download ang matag lider, kolektahon ang katugbang nga manifest ug i-download usab kini. Morag simple ra.

Pagkahuman sa pagtuon sa dokumentasyon, mahimo natong bahinon ang proseso sa pag-download sa daghang mga lakang:

  • Pagsugod sa proseso - "POST /v2/{repoName}/blobs/uploads/"
  • Pag-upload og lifeline (gamiton namo ang monolithic upload, i.e. ipadala namo ang matag lifeline sa kinatibuk-an) - "PUT /v2/{repoName}/blobs/uploads/{uuid}?digest={digest}
    Gitas-on sa sulod: {gidak-on sa layer}
    Type-Content: aplikasyon/octe-stream
    Layer Binary Data".
  • Nagkarga sa manifest - "PUT /v2/{repoName}/manifests/{reference}".

Apan ang dokumentasyon napakyas sa usa ka lakang, kung wala kini wala’y mahimo. Alang sa monolithic loading, ingon man alang sa partial (tipak), sa dili pa i-load ang riles, kinahanglan nimo nga buhaton ang usa ka hangyo sa PATCH:

"PATCH /v2/{repoName}/blobs/uploads/{uuid}
Gitas-on sa sulod: {gidak-on sa tipak}
Type-Content: aplikasyon/octe-stream
{Layer Chunk Binary Data}".

Kung dili, dili ka makalihok lapas sa una nga punto, tungod kay... Imbis sa gipaabot nga tubag nga code 202, makadawat ka og 4xx.

Karon ang algorithm sama sa:

  • Pasiuna
  • Patch rail
  • Nagkarga sa handrail
  • Nagkarga sa manifest
    Ang mga punto 2 ug 3, sa tinagsa, sublion sa makadaghang higayon nga ang gidaghanon sa mga linya kinahanglang ikarga.

Una, kinahanglan namon ang bisan unsang imahe. Gamiton nako ang archlinux:latest

docker pull archlinux

Pag-implementar sa docker pull ug docker push commands nga walay docker client gamit ang HTTP requests

Karon atong tipigan kini sa lokal para sa dugang pagtuki

docker save c24fe13d37b9 -o savedArch

Pag-implementar sa docker pull ug docker push commands nga walay docker client gamit ang HTTP requests

Unpack ang resulta nga archive ngadto sa kasamtangan nga direktoryo

tar xvf savedArch

Pag-implementar sa docker pull ug docker push commands nga walay docker client gamit ang HTTP requests

Sama sa imong nakita, ang matag linya sa kinabuhi naa sa usa ka lahi nga folder. Karon atong tan-awon ang istruktura sa manifest nga atong nadawat

cat manifest.json | json_pp

Pag-implementar sa docker pull ug docker push commands nga walay docker client gamit ang HTTP requests

Dili kaayo. Atong tan-awon kung unsa nga manifest ang gikinahanglan aron ma-load, sumala sa dokumentasyon.

Pag-implementar sa docker pull ug docker push commands nga walay docker client gamit ang HTTP requests

Dayag, ang naglungtad nga manifesto dili angay kanamo, mao nga maghimo kami sa among kaugalingon nga adunay blackjack ug courtesans, mga linya sa kinabuhi ug mga config.

Kanunay kami adunay labing menos usa ka config file ug usa ka laray sa mga linya sa kinabuhi. Scheme version 2 (karon sa panahon sa pagsulat), mediaType ibilin nga dili mausab:

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

Pagkahuman sa paghimo sa sukaranan nga pagpakita, kinahanglan nimo nga pun-on kini sa balido nga datos. Aron mahimo kini, among gigamit ang json template sa rail object:

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

Atong idugang kini sa manifest para sa matag riles.

Sunod, kinahanglan natong mahibal-an ang gidak-on sa config file ug pulihan ang mga stub sa manifest sa tinuod nga datos

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

Karon mahimo nimong sugdan ang proseso sa pag-download ug i-save ang imong kaugalingon nga uuid, nga kinahanglan nga kauban sa tanan nga sunod nga mga hangyo.

Ang kompleto nga script ingon niini:

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

mahimo namong gamiton ang andam nga script:

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

UPS:
Unsay atong nakuha isip resulta?
Una, ang tinuud nga datos alang sa pag-analisar, tungod kay ang mga pagsulay gipadagan sa blazemeter ug ang datos sa mga hangyo sa kliyente sa docker dili kaayo impormatibo, dili sama sa puro nga mga hangyo sa HTTP.

Ikaduha, ang transisyon nagtugot kanamo nga madugangan ang gidaghanon sa mga virtual nga tiggamit alang sa pag-upload sa docker sa mga 150% ug makakuha og avg nga oras sa pagtubag nga 20-25% nga mas paspas. Alang sa pag-download sa docker, nakahimo kami sa pagdugang sa gidaghanon sa mga tiggamit sa 500%, samtang ang avg nga oras sa pagtubag mikunhod sa mga 60%.

Salamat sa imong pagtagad.

Source: www.habr.com

Idugang sa usa ka comment