Taive nemabhegi maviri euswa, 2 mescaline mapiritsi unix nharaunda, docker repository uye basa rekushandisa docker kudhonza uye docker push mirairo pasina docker mutengi.
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
"Dhonza mufananidzo kana repository kubva kune registry".
Ikoko tinowanawo chinongedzo ku
Kubva pano isu tinokwanisa kunzwisisa kuti docker mufananidzo seti yemamwe maseru ane ruzivo nezve yazvino shanduko mumufananidzo, zviri pachena kuti ndizvo zvatinoda. Tevere tinotarisa
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"
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
Ngationei kuti rudzii rwefaira ratakazogamuchira senzira yekutanga yehupenyu.
file firstLayer
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
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
Zvino ngatizvichengetei munharaunda kuti tiwedzere kuongororwa
docker save c24fe13d37b9 -o savedArch
Bvisa dura renhoroondo mudhairekitori razvino
tar xvf savedArch
Sezvauri kuona, mutsara wega wega wehupenyu uri mune yakaparadzana folda. Zvino ngatitarisei chimiro chemanifesiti yatakagamuchira
cat manifest.json | json_pp
Kwete zvakawanda. Ngationei kuti manifest chii chinodiwa kurodha, maererano
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