Kuita docker kudhonza uye docker kusunda mirairo pasina docker mutengi uchishandisa zvikumbiro zveHTTP

Taive nemabhegi maviri euswa, 2 mescaline mapiritsi unix nharaunda, docker repository uye basa rekushandisa docker kudhonza uye docker push mirairo pasina docker mutengi.

Kuita docker kudhonza uye docker kusunda mirairo pasina docker mutengi uchishandisa zvikumbiro zveHTTP

UPS:
Mubvunzo: Zvese izvi ndezvei?
Mhinduro: Kuyedzwa kwemutoro wechigadzirwa (HASI kushandisa bash, zvinyorwa zvinopihwa zvinangwa zvekudzidzisa). Izvo zvakasarudzwa kusashandisa docker mutengi kudzikisa mamwe maseru (mukati memiganho inonzwisisika) uye, maererano, kutevedzera mutoro wepamusoro. Nekuda kweizvozvo, kunonoka kwese system kweDocker mutengi kwakabviswa. Takagamuchira mutoro wakachena zvakananga pane chigadzirwa.
Chinyorwa chakashandisa GNU shanduro dzezvishandiso.

Kutanga, ngationei kuti mirairo iyi inoita sei.

Saka chii chinonzi docker pull chinoshandiswa? Maererano ne zvinyorwa:

"Dhonza mufananidzo kana repository kubva kune registry".

Ikoko tinowanawo chinongedzo ku nzwisisa mifananidzo, midziyo, uye madhiraivha ekuchengetedza.

Kuita docker kudhonza uye docker kusunda mirairo pasina docker mutengi uchishandisa zvikumbiro zveHTTP

Kubva pano isu tinokwanisa kunzwisisa kuti docker mufananidzo seti yemamwe maseru ane ruzivo nezve yazvino shanduko mumufananidzo, zviri pachena kuti ndizvo zvatinoda. Tevere tinotarisa registry API.

Inoti zvinotevera:

"Mufananidzo" musanganiswa we JSON manifest uye mafaera ega ega. Maitiro ekudhonza > image centers pakutora zvikamu zviviri izvi."

Saka nhanho yekutanga maererano nezvinyorwa ndeiyi "Kudhonza mufananidzo Ratidza".

Ehe, isu hatizoipfura, asi isu tinoda iyo data kubva kwairi. Unotevera muenzaniso chikumbiro: GET /v2/{name}/manifests/{reference}

"Zita nereferensi parameter inozivisa mufananidzo uye inodiwa. Referensi inogona kusanganisira tag kana digest."

Yedu docker repository inoiswa munharaunda, ngatiedzei kuita chikumbiro:

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

Kuita docker kudhonza uye docker kusunda mirairo pasina docker mutengi uchishandisa zvikumbiro zveHTTP

Mukupindura, tinogashira json kubva kwatiri kungofarira mitsara yehupenyu, kana kuti hashi yavo. Kana tadzigamuchira, tinogona kuenda kune imwe neimwe toita chikumbiro chinotevera: "GET /v2/{name}/blobs/{digest}"

"Kupinda kune layer kuchavharwa nezita renzvimbo asi inocherechedzwa yakasarudzika muregistry nedigest."

digest munyaya iyi ndiyo hashi yatakagamuchira.

Kuedza

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

Kuita docker kudhonza uye docker kusunda mirairo pasina docker mutengi uchishandisa zvikumbiro zveHTTP

Ngationei kuti rudzii rwefaira ratakazogamuchira senzira yekutanga yehupenyu.

file firstLayer

Kuita docker kudhonza uye docker kusunda mirairo pasina docker mutengi uchishandisa zvikumbiro zveHTTP

avo. njanji ndeye tar archives, kuiburitsa muhurongwa hwakakodzera tinowana zviri mumufananidzo.

Ngatinyorei diki bash script kuitira kuti zvese izvi zvigone kuve otomatiki

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

Iye zvino tinogona kuimhanyisa nematanho anodiwa uye kuwana zviri mukati memufananidzo unodiwa

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

Chikamu 2 - docker push

Izvi zvichava zvishoma zvakanyanya kuoma.

Ngatitangei zvakare zvinyorwa. Saka isu tinofanirwa kudhawunirodha mutungamiriri wega wega, kuunganidza inoenderana manifest uye kuidhawunirodha futi. Zvinoita sezviri nyore.

Mushure mekudzidza zvinyorwa, tinogona kupatsanura maitiro ekurodha mumatanho akati wandei:

  • Magadzirirwo ekutanga - "POST /v2/{repoName}/blobs/uploads/"
  • Kuisa tambo yeupenyu (tichashandisa monolithic upload, kureva kuti tinotumira tambo yehupenyu yese) - "PUT /v2/{repoName}/blobs/uploads/{uuid}?digest={digest}
    Zvemukati-Kureba: {saizi yedhiza}
    Zvemukati-Rudzi: application/octet-stream
    Layer Binary Data".
  • Kukwidza manifest - "PUT /v2/{repoName}/manifests/{reference}".

Asi zvinyorwa zvinopotsa danho rimwe chete, pasina izvo hapana chichashanda. Zvekurodha monolithic, pamwe nechidimbu (chunked), usati warodha njanji, unofanirwa kuita PATCH chikumbiro:

"PATCH /v2/{repoName}/blobs/uploads/{uuid}
Zvemukati-Kureba: {saizi yechunk}
Zvemukati-Rudzi: application/octet-stream
{Layer Chunk Binary Data}".

Zvikasadaro, hauzokwanisi kufambira mberi kupfuura yekutanga poindi, nekuti... Panzvimbo peiyo inotarisirwa mhinduro kodhi 202, iwe unogashira 4xx.

Iye zvino iyo algorithm inoita senge:

  • Kutanga
  • Chigamba njanji
  • Kurodha handrail
  • Kurodha manifest
    Mapoinzi 2 ne3, zvichiteerana, achadzokororwa kakawanda sehuwandu hwemitsara inoda kutakurwa.

Kutanga, tinoda chero mufananidzo. Ini ndichashandisa archlinux:zvino

docker pull archlinux

Kuita docker kudhonza uye docker kusunda mirairo pasina docker mutengi uchishandisa zvikumbiro zveHTTP

Zvino ngatizvichengetei munharaunda kuti tiwedzere kuongororwa

docker save c24fe13d37b9 -o savedArch

Kuita docker kudhonza uye docker kusunda mirairo pasina docker mutengi uchishandisa zvikumbiro zveHTTP

Bvisa dura renhoroondo mudhairekitori razvino

tar xvf savedArch

Kuita docker kudhonza uye docker kusunda mirairo pasina docker mutengi uchishandisa zvikumbiro zveHTTP

Sezvauri kuona, mutsara wega wega wehupenyu uri mune yakaparadzana folda. Zvino ngatitarisei chimiro chemanifesiti yatakagamuchira

cat manifest.json | json_pp

Kuita docker kudhonza uye docker kusunda mirairo pasina docker mutengi uchishandisa zvikumbiro zveHTTP

Kwete zvakawanda. Ngationei kuti manifest chii chinodiwa kurodha, maererano zvinyorwa.

Kuita docker kudhonza uye docker kusunda mirairo pasina docker mutengi uchishandisa zvikumbiro zveHTTP

Zviripachena, iyo manifesto iripo haikodzeri isu, saka isu tichagadzira yedu neblackjack uye macourtesans, mitsara yehupenyu uye configs.

Isu tichagara tiine kanenge faira rimwe chete rekugadzirisa uye ruzhinji rwemararamiro. Scheme version 2 (ikozvino panguva yekunyora), mediaType ichasiiwa isina kuchinjwa:

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

Mushure mekugadzira iyo yakakosha manifest, iwe unofanirwa kuizadza neiyo data data. Kuti tiite izvi, tinoshandisa json template yechitima chinhu:

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

Isu tichazviwedzera kune manifest kune yega yega njanji.

Tevere, isu tinofanirwa kutsvaga saizi ye config faira uye kutsiva iyo stubs mu manifest ne data chaiyo

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

Iye zvino unogona kutanga maitiro ekurodha uye uzvichengetere iwe uuid, iyo inofanirwa kuperekedza zvese zvinotevera zvikumbiro.

Iyo yakazara script inotaridzika seizvi:

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

tinogona kushandisa script yakagadzirira-yakagadzirwa:

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

UPS:
Chii chatakawana semugumisiro?
Chekutanga, data chaiyo yekuongorora, sezvo bvunzo dzichiitwa mublazemeter uye iyo data pane docker mutengi zvikumbiro haina ruzivo rwakanyanya, kusiyana nekwakachena HTTP zvikumbiro.

Chechipiri, shanduko yakatibvumira kuwedzera huwandu hwevashandisi vechokwadi vedocker upload ne150% uye kuwana avg yekupindura nguva 20-25% nekukurumidza. Zvekudhawunirodha docker, takakwanisa kuwedzera nhamba yevashandisi ne500%, nepo avg yekupindura nguva yakadzikira ne60%.

Ndinokutendai uchicherechedze.

Source: www.habr.com

Voeg