เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบ”เบถเบ‡ docker เปเบฅเบฐ docker push เป‚เบ”เบเบšเปเปˆเบกเบตเบฅเบนเบเบ„เป‰เบฒ docker เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป HTTP

เบžเบงเบเป€เบฎเบปเบฒเบกเบต 2 เบ–เบปเบ‡เบ‚เบญเบ‡เบซเบเป‰เบฒ, 75 เป€เบกเบฑเบ” mescaline unix เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก, docker repository เปเบฅเบฐเบงเบฝเบเบ‡เบฒเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบ”เบถเบ‡ docker เปเบฅเบฐ docker push เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบฅเบนเบเบ„เป‰เบฒ docker.

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบ”เบถเบ‡ docker เปเบฅเบฐ docker push เป‚เบ”เบเบšเปเปˆเบกเบตเบฅเบนเบเบ„เป‰เบฒ docker เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป HTTP

UPS:
เบ„เปเบฒเบ–เบฒเบก: เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบซเบเบฑเบ‡?
เบ„เปเบฒเบ•เบญเบš: เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป‚เบซเบผเบ”เบ‚เบญเบ‡เบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™ (เบšเปเปˆเปƒเบŠเป‰ bash, scripts เป„เบ”เป‰เบ–เบทเบเบชเบฐเบซเบ™เบญเบ‡เปƒเบซเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบถเบเบชเบฒ). เบกเบฑเบ™เป„เบ”เป‰เบ–เบทเบเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบตเปˆเบˆเบฐเบšเปเปˆเปƒเบŠเป‰เบฅเบนเบเบ„เป‰เบฒ docker เป€เบžเบทเปˆเบญเบซเบผเบธเบ”เบœเปˆเบญเบ™เบŠเบฑเป‰เบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบก (เบžเบฒเบเปƒเบ™เบ‚เบญเบšเป€เบ‚เบ”เบ—เบตเปˆเบชเบปเบกเป€เบซเบ”เบชเบปเบกเบœเบปเบ™) เปเบฅเบฐ, เบ•เบฒเบกเบ„เบงเบฒเบกเป€เบซเบกเบฒเบฐเบชเบปเบก, emulate เบเบฒเบ™เป‚เบซเบผเบ”เบ—เบตเปˆเบชเบนเบ‡เบ‚เบถเป‰เบ™. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เบŠเบฑเบเบŠเป‰เบฒเบ‚เบญเบ‡เบฅเบฐเบšเบปเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒ Docker เป„เบ”เป‰เบ–เบทเบเป‚เบเบเบเป‰เบฒเบ. เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เป‚เบซเบผเบ”เบ—เบตเปˆเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบชเบฐเบญเบฒเบ”เป‚เบ”เบเบเบปเบ‡เบเปˆเบฝเบงเบเบฑเบšเบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™.
เบšเบปเบ”เบ„เบงเบฒเบกเป„เบ”เป‰เปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบฅเบธเป‰เบ™ GNU.

เบ—เปเบฒเบญเบดเบ”, เปƒเบซเป‰เป€เบฎเบปเบฒเบ„เบดเบ”เบญเบญเบเบงเปˆเบฒเบ„เปเบฒเบชเบฑเปˆเบ‡เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป€เบฎเบฑเบ”เบซเบเบฑเบ‡.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™ docker pull เปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบซเบเบฑเบ‡? เบญเบตเบ‡โ€‹เบ•เบฒเบก เป€เบญเบเบฐเบชเบฒเบ™:

"เบ”เบถเบ‡เบฎเบนเบšเบžเบฒเบšเบซเบผเบท repository เบˆเบฒเบเบ—เบฐเบšเบฝเบ™".

เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบŠเบญเบเบซเบฒเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบš เป€เบ‚เบปเป‰เบฒเปƒเบˆเบฎเบนเบšเบžเบฒเบš, เบšเบฑเบ™เบˆเบธ, เปเบฅเบฐเป„เบ”เป€เบงเบตเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ.

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบ”เบถเบ‡ docker เปเบฅเบฐ docker push เป‚เบ”เบเบšเปเปˆเบกเบตเบฅเบนเบเบ„เป‰เบฒ docker เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป HTTP

เบˆเบฒเบเบ—เบตเปˆเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบฎเบนเบšเบžเบฒเบš docker เปเบกเปˆเบ™เบŠเบธเบ”เบ‚เบญเบ‡เบŠเบฑเป‰เบ™เบ‚เปเป‰เบกเบนเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบซเบผเป‰เบฒเบชเบธเบ”เบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบš, เป€เบŠเบดเปˆเบ‡เปเบ™เปˆเบ™เบญเบ™เบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™. เบ•เปเปˆเป„เบ›เบžเบงเบเป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡เบขเบนเปˆ API เบ—เบฐเบšเบฝเบ™.

เบกเบฑเบ™เป€เบงเบปเป‰เบฒเบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

"เบฎเบนเบšเบžเบฒเบš" เปเบกเปˆเบ™เบเบฒเบ™เบฅเบงเบกเบเบฑเบ™เบ‚เบญเบ‡ JSON 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"

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบ”เบถเบ‡ docker เปเบฅเบฐ docker push เป‚เบ”เบเบšเปเปˆเบกเบตเบฅเบนเบเบ„เป‰เบฒ docker เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป HTTP

เปƒเบ™เบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบš json เบˆเบฒเบเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบ„เบงเบฒเบกเบชเบปเบ™เปƒเบˆเปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเปƒเบ™ lifelines, เบซเบผเบทเปเบ—เบ™เบ—เบตเปˆเบˆเบฐ hashes เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ. เป€เบกเบทเปˆเบญเป„เบ”เป‰เบฎเบฑเบšเบžเบงเบเบกเบฑเบ™, เบžเบงเบเป€เบฎเบปเบฒเบชเบฒเบกเบฒเบ”เบœเปˆเบฒเบ™เปเบ•เปˆเบฅเบฐเบญเบฑเบ™เปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเป„เบ›เบ™เบตเป‰: "GET /v2/{name}/blobs/{digest}"

"เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบŠเบฑเป‰เบ™เปƒเบ” เปœเบถเปˆเบ‡ เบˆเบฐเบ–เบทเบเป€เบ›เบตเบ”เป‚เบ”เบเบŠเบทเปˆเบ‚เบญเบ‡เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เปเบ•เปˆเบ–เบทเบ เบเบณ เบ™เบปเบ”เบชเบฐเป€เบžเบฒเบฐเปƒเบ™เบ—เบฐเบšเบฝเบ™เป‚เบ”เบเบเบฒเบ™เบเปˆเบญเบ."

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

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบ”เบถเบ‡ docker เปเบฅเบฐ docker push เป‚เบ”เบเบšเปเปˆเบกเบตเบฅเบนเบเบ„เป‰เบฒ docker เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป HTTP

เปƒเบซเป‰เป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡เบงเปˆเบฒเป„เบŸเบฅเปŒเบ›เบฐเป€เบžเบ”เปƒเบ”เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเปƒเบ™เบ—เบตเปˆเบชเบธเบ”เป€เบ›เบฑเบ™เป€เบชเบฑเป‰เบ™เบŠเบตเบงเบดเบ”เบ—เปเบฒเบญเบดเบ”.

file firstLayer

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบ”เบถเบ‡ docker เปเบฅเบฐ docker push เป‚เบ”เบเบšเปเปˆเบกเบตเบฅเบนเบเบ„เป‰เบฒ docker เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป HTTP

เป€เบซเบผเบปเปˆเบฒเบ™เบฑเป‰เบ™. lifelines เปเบกเปˆเบ™ tar archives, เป‚เบ”เบ unpacking เปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเปƒเบ™เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเป€เบซเบกเบฒเบฐเบชเบปเบก, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป„เบ”เป‰เบฎเบฑเบšเป€เบ™เบทเป‰เบญเปƒเบ™เบ‚เบญเบ‡เบฎเบนเบšเบžเบฒเบš.

เปƒเบซเป‰เบ‚เบฝเบ™ script bash เบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบเป€เบžเบทเปˆเบญเปƒเบซเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบญเบฑเบ”เบ•เบฐเป‚เบ™เบกเบฑเบ”

#!/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}
    เบ„เบงเบฒเบกเบเบฒเบงเป€เบ™เบทเป‰เบญเบซเบฒ: {size of layer}
    เบ›เบฐเป€เบžเบ”เป€เบ™เบทเป‰เบญเบซเบฒ: เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™/octet-stream
    เบŠเบฑเป‰เบ™เบ‚เปเป‰เบกเบนเบ™เบ–เบฒเบ™เบชเบญเบ‡".
  • เบเบณเบฅเบฑเบ‡เป‚เบซเบฅเบ” manifest - "PUT /v2/{repoName}/manifests/{reference}".

เปเบ•เปˆเป€เบญเบเบฐเบชเบฒเบ™เบ‚เบฒเบ”เบ‚เบฑเป‰เบ™เบ•เบญเบ™เบซเบ™เบถเปˆเบ‡, เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ—เบตเปˆเบšเปเปˆเบกเบตเบซเบเบฑเบ‡เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบ. เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป‚เบซเบผเบ” monolithic, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบชเปเบฒเบฅเบฑเบšเบšเบฒเบ‡เบชเปˆเบงเบ™ (chunked), เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป‚เบซเบผเบ”เบฅเบปเบ”เป„เบŸ, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป PATCH:

"PATCH /v2/{repoName}/blobs/uploads/{uuid}
เบ„เบงเบฒเบกเบเบฒเบงเป€เบ™เบทเป‰เบญเบซเบฒ: {size of chunk}
เบ›เบฐเป€เบžเบ”เป€เบ™เบทเป‰เบญเบซเบฒ: เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™/octet-stream
{Layer Chunk Binary Data}".

เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบˆเบปเป‰เบฒเบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เบเป‰เบฒเบงเป„เบ›เป„เบเบเบงเปˆเบฒเบˆเบธเบ”เบ—เปเบฒเบญเบดเบ”, เป€เบžเบฒเบฐเบงเปˆเบฒ ... เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบฅเบฐเบซเบฑเบ”เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบ—เบตเปˆเบ„เบฒเบ”เป„เบงเป‰ 202, เบ—เปˆเบฒเบ™เบˆเบฐเป„เบ”เป‰เบฎเบฑเบš 4xx.

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™ algorithm เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒ:

  • เบเบฒเบ™เบฅเบดเป€เบฅเบตเปˆเบก
  • Patch rail
  • เบเบณเบฅเบฑเบ‡เป‚เบซเบฅเบ” handrail
  • เบเบณเบฅเบฑเบ‡เป‚เบซเบฅเบ” manifest
    เบˆเบธเบ” 2 เปเบฅเบฐ 3, เบ•เบฒเบกเบฅเปเบฒเบ”เบฑเบš, เบˆเบฐเบ–เบทเบเป€เบฎเบฑเบ”เบŠเป‰เปเบฒเบญเบตเบเบซเบผเบฒเบเบ„เบฑเป‰เบ‡เบ•เบฒเบกเบˆเปเบฒเบ™เบงเบ™เบชเบฒเบเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เป‚เบซเบผเบ”.

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบžเบงเบเป€เบฎเบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบฎเบนเบšเบžเบฒเบšเปƒเบ” เปœเบถเปˆเบ‡. เบ‚เป‰เบญเบเบˆเบฐเปƒเบŠเป‰ archlinux:latest

docker pull archlinux

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบ”เบถเบ‡ docker เปเบฅเบฐ docker push เป‚เบ”เบเบšเปเปˆเบกเบตเบฅเบนเบเบ„เป‰เบฒ docker เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป HTTP

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบšเบฑเบ™เบ—เบถเบเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เป€เบžเบทเปˆเบญเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบ•เบทเปˆเบกเบญเบตเบ

docker save c24fe13d37b9 -o savedArch

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบ”เบถเบ‡ docker เปเบฅเบฐ docker push เป‚เบ”เบเบšเปเปˆเบกเบตเบฅเบนเบเบ„เป‰เบฒ docker เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป HTTP

เบ–เบญเบ”เปเบŸเป‰เบกเบˆเบฑเบ”เป€เบเบฑเบšเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เป„เบ”เป€เบฅเบเบฐเบ—เปเบฅเบตเบ›เบฐเบˆเบธเบšเบฑเบ™

tar xvf savedArch

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบ”เบถเบ‡ docker เปเบฅเบฐ docker push เป‚เบ”เบเบšเปเปˆเบกเบตเบฅเบนเบเบ„เป‰เบฒ docker เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป HTTP

เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰, เปเบ•เปˆเบฅเบฐเป€เบชเบฑเป‰เบ™เบŠเบตเบงเบดเบ”เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เป‚เบŸเบ™เป€เบ”เบตเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ. เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบ‚เบญเบ‡ manifest เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบš

cat manifest.json | json_pp

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบ”เบถเบ‡ docker เปเบฅเบฐ docker push เป‚เบ”เบเบšเปเปˆเบกเบตเบฅเบนเบเบ„เป‰เบฒ docker เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป HTTP

เบšเปเปˆโ€‹เบซเบผเบฒเบ. เปƒเบซเป‰เป€เบฎเบปเบฒเป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆ manifest เบกเบตเบ„เบงเบฒเบกเบˆเปเบฒเป€เบ›เบฑเบ™เปƒเบ™เบเบฒเบ™เป‚เบซเบผเบ”, เบญเบตเบ‡เบ•เบฒเบกเบเบฒเบ™ เป€เบญเบเบฐเบชเบฒเบ™.

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ„เปเบฒเบชเบฑเปˆเบ‡เบ”เบถเบ‡ docker เปเบฅเบฐ docker push เป‚เบ”เบเบšเปเปˆเบกเบตเบฅเบนเบเบ„เป‰เบฒ docker เป‚เบ”เบเปƒเบŠเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป HTTP

เปเบ™เปˆเบ™เบญเบ™, manifesto เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบงเบšเปเปˆเป€เบซเบกเบฒเบฐเบชเบปเบกเบเบฑเบšเบžเบงเบเป€เบฎเบปเบฒ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบฎเบฑเบ”เบ”เป‰เบงเบ blackjack เปเบฅเบฐ courtesans, lifelines เปเบฅเบฐ configs.

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบกเบตเบขเปˆเบฒเบ‡เปœเป‰เบญเบเปœเบถเปˆเบ‡เป„เบŸเบฅเปŒ config เปเบฅเบฐ array เบ‚เบญเบ‡ lifelines. 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

เบซเบผเบฑเบ‡เบˆเบฒเบเบเบฒเบ™เบชเป‰เบฒเบ‡ manifest เบžเบทเป‰เบ™เบ–เบฒเบ™, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ•เบทเปˆเบกเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ json template เบ‚เบญเบ‡ rail object:

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

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบžเบตเปˆเบกเบกเบฑเบ™เปƒเบชเปˆ manifest เบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐ rail.

เบ•เปเปˆเป„เบ›, เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบŠเบญเบเบซเบฒเบ‚เบฐเบซเบ™เบฒเบ”เบ‚เบญเบ‡เป„เบŸเบฅเปŒ config เปเบฅเบฐเบ›เปˆเบฝเบ™เปเบ—เบ™ stubs เปƒเบ™ manifest เบ”เป‰เบงเบเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡.

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

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ”เบฒเบงเป‚เบซเบผเบ”เปเบฅเบฐเบŠเปˆเบงเบเบ›เบฐเบขเบฑเบ”เบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡เป€เบ›เบฑเบ™ uuid, เป€เบŠเบดเปˆเบ‡เบ„เบงเบ™เบˆเบฐเบกเบฒเบžเป‰เบญเบกเบเบฑเบšเบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ•เปเปˆเป„เบ›เบ—เบฑเบ‡เบซเบกเบปเบ”.

script เบชเบฐเบšเบฑเบšเบชเบปเบกเบšเบนเบ™เบกเบตเบฅเบฑเบเบชเบฐเบ™เบฐเบ„เป‰เบฒเบเบ„เบทเบ™เบตเป‰:

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

UPS:
เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบœเบปเบ™เบซเบเบฑเบ‡?
เบ—เปเบฒเบญเบดเบ”, เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐ, เบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปเบกเปˆเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบขเบนเปˆเปƒเบ™ blazemeter เปเบฅเบฐเบ‚เปเป‰เบกเบนเบ™เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒ docker เบšเปเปˆเบกเบตเบ‚เปเป‰เบกเบนเบ™เบซเบผเบฒเบ, เบšเปเปˆเป€เบซเบกเบทเบญเบ™เบเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เป HTTP เบšเปเบฅเบดเบชเบธเบ”.

เบญเบฑเบ™เบ—เบตเบชเบญเบ‡, เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป„เบ”เป‰เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเป€เบžเบตเปˆเบกเบˆเปเบฒเบ™เบงเบ™เบœเบนเป‰เปƒเบŠเป‰ virtual เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเบฑเบšเป‚เบซเบฅเบ” docker เบ›เบฐเบกเบฒเบ™ 150% เปเบฅเบฐเปƒเบŠเป‰เป€เบงเบฅเบฒเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบชเบฐเป€เบฅเปˆเบ 20-25%. เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ”เบฒเบงเป‚เบซเบผเบ” docker, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบˆเบฑเบ”เบเบฒเบ™เป€เบžเบตเปˆเบกเบˆเปเบฒเบ™เบงเบ™เบœเบนเป‰เปƒเบŠเป‰ 500%, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเป€เบงเบฅเบฒเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบชเบฐเป€เบฅเปˆเบเบซเบผเบธเบ”เบฅเบปเบ‡เบ›เบฐเบกเบฒเบ™ 60%.

เบ‚เปเบ‚เบญเบšเปƒเบˆเบ—เปˆเบฒเบ™เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบญเบปเบฒเปƒเบˆเปƒเบชเปˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™