HTTP เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด•เตเดฒเดฏเดจเตเดฑเต เด‡เดฒเตเดฒเดพเดคเต† เดกเต‹เด•เตเด•เตผ เดชเตเตพ, เดกเต‹เด•เตเด•เตผ เดชเตเดทเต เด•เดฎเดพเตปเดกเตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต

เดžเด™เตเด™เตพเด•เตเด•เต 2 เดฌเดพเด—เต เดชเตเดฒเตเดฒเต, 75 เดฎเต†เดธเตโ€Œเด•เดฒเตˆเตป เดŸเดพเดฌเตโ€Œเดฒเต†เดฑเตเดฑเตเด•เตพ เดฏเตเดฃเดฟเด•เตเดธเต เดŽเตปเดตเดฏเต‹เตบเดฎเต†เตปเตเดฑเต, เด’เดฐเต เดกเต‹เด•เตเด•เตผ เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟ, เดกเต‹เด•เตเด•เตผ เด•เตเดฒเดฏเตปเตเดฑเต เด‡เดฒเตเดฒเดพเดคเต† เดกเต‹เด•เตเด•เตผ เดชเตเตพ, เดกเต‹เด•เตเด•เตผ เดชเตเดทเต เด•เดฎเดพเตปเดกเตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดšเตเดฎเดคเดฒ เดŽเดจเตเดจเดฟเดต เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเตเดจเตเดจเต.

HTTP เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด•เตเดฒเดฏเดจเตเดฑเต เด‡เดฒเตเดฒเดพเดคเต† เดกเต‹เด•เตเด•เตผ เดชเตเตพ, เดกเต‹เด•เตเด•เตผ เดชเตเดทเต เด•เดฎเดพเตปเดกเตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต

เดฏเตเดชเดฟเดŽเดธเต:
เดšเต‹เดฆเตเดฏเด‚: เด‡เดคเต†เดฒเตเดฒเดพเด‚ เดŽเดจเตเดคเดฟเดจเตเดตเต‡เดฃเตเดŸเดฟเดฏเดพเดฃเต?
เด‰เดคเตเดคเดฐเด‚: เด‰เตฝเดชเตเดชเดจเตเดจเดคเตเดคเดฟเตปเตเดฑเต† เดฒเต‹เดกเต เดŸเต†เดธเตเดฑเตเดฑเดฟเด‚เด—เต (เดฌเดพเดทเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดฟเดฒเตเดฒ, เดตเดฟเดฆเตเดฏเดพเดญเตเดฏเดพเดธ เด†เดตเดถเตเดฏเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเตเด•เตพ เดจเตฝเด•เดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต). เด…เดงเดฟเด• เดฒเต†เดฏเดฑเตเด•เตพ เด•เตเดฑเดฏเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต (เดจเตเดฏเดพเดฏเดฎเดพเดฏ เดชเดฐเดฟเดงเดฟเด•เตเด•เตเดณเตเดณเดฟเตฝ) เดกเต‹เด•เตเด•เตผ เด•เตเดฒเดฏเตปเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เต‡เดฃเตเดŸเดคเดฟเดฒเตเดฒเต†เดจเตเดจเต เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต, เด…เดคเดจเตเดธเดฐเดฟเดšเตเดšเต, เด‰เดฏเตผเดจเตเดจ เดฒเต‹เดกเต เด…เดจเตเด•เดฐเดฟเด•เตเด•เตเด•. เดคเตฝเดซเดฒเดฎเดพเดฏเดฟ, เดกเต‹เด•เตเด•เตผ เด•เตเดฒเดฏเตปเตเดฑเดฟเตปเดฑเต† เดŽเดฒเตเดฒเดพ เดธเดฟเดธเตเดฑเตเดฑเด‚ เด•เดพเดฒเดคเดพเดฎเดธเด™เตเด™เดณเตเด‚ เดจเต€เด•เตเด•เด‚ เดšเต†เดฏเตเดคเต. เดžเด™เตเด™เตพเด•เตเด•เต เด‰เตฝเดชเตเดชเดจเตเดจเดคเตเดคเดฟเตฝ เดจเต‡เดฐเดฟเดŸเตเดŸเต เดคเดพเดฐเดคเดฎเตเดฏเต‡เดจ เดถเตเดฆเตเดงเดฎเดพเดฏ เดฒเต‹เดกเต เดฒเดญเดฟเดšเตเดšเต.
เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เด‰เดชเด•เดฐเดฃเด™เตเด™เดณเตเดŸเต† เด—เตเดจเต เดชเดคเดฟเดชเตเดชเตเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต.

เด†เดฆเตเดฏเด‚, เดˆ เด•เดฎเดพเตปเดกเตเด•เตพ เดŽเดจเตเดคเดพเดฃเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเต†เดจเตเดจเต เดจเดฎเตเด•เตเด•เต เดจเต‹เด•เตเด•เดพเด‚.

เด…เดชเตเดชเต‹เตพ เดกเต‹เด•เตเด•เตผ เดชเตเตพ เดŽเดจเตเดคเดฟเดจเตเดตเต‡เดฃเตเดŸเดฟเดฏเดพเดฃเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเต? เด‡เดคเดจเตเดธเดฐเดฟเดšเตเดšเต เดชเตเดฐเดฎเดพเดฃเต€เด•เดฐเดฃเด‚:

"เด’เดฐเต เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟเดฏเดฟเตฝ เดจเดฟเดจเตเดจเต เด’เดฐเต เด‡เดฎเต‡เดœเต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด’เดฐเต เดถเต‡เด–เดฐเด‚ เดตเดฒเดฟเด•เตเด•เตเด•".

เด…เดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดฒเดฟเด™เตเด•เตเด‚ เด…เดตเดฟเดŸเต† เด•เดพเดฃเดพเด‚ เด‡เดฎเต‡เดœเตเด•เตพ, เด•เดฃเตเดŸเต†เดฏเตเดจเดฑเตเด•เตพ, เดธเตเดฑเตเดฑเต‹เดฑเต‡เดœเต เดกเตเดฐเตˆเดตเดฑเตเด•เตพ เดŽเดจเตเดจเดฟเดต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เตเด•.

HTTP เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด•เตเดฒเดฏเดจเตเดฑเต เด‡เดฒเตเดฒเดพเดคเต† เดกเต‹เด•เตเด•เตผ เดชเตเตพ, เดกเต‹เด•เตเด•เตผ เดชเตเดทเต เด•เดฎเดพเตปเดกเตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต

เดšเดฟเดคเตเดฐเดคเตเดคเดฟเดฒเต† เดเดฑเตเดฑเดตเตเด‚ เดชเตเดคเดฟเดฏ เดฎเดพเดฑเตเดฑเด™เตเด™เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดตเดฟเดตเดฐเด™เตเด™เตพ เด‰เตพเด•เตเด•เตŠเดณเตเดณเตเดจเตเดจ เดšเดฟเดฒ เดฒเต†เดฏเดฑเตเด•เดณเตเดŸเต† เด’เดฐเต เด•เต‚เดŸเตเดŸเดฎเดพเดฃเต เดกเต‹เด•เตเด•เตผ เด‡เดฎเต‡เดœเต เดŽเดจเตเดจเต เด‡เดตเดฟเดŸเต† เดจเดฟเดจเตเดจเต เดจเดฎเตเด•เตเด•เต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดพเด‚, เด…เดคเต เดจเดฎเตเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเตเดณเตเดณเดคเดพเดฃเต. เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ เดžเด™เตเด™เตพ เดจเต‹เด•เตเด•เตเดจเตเดจเต เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟ API.

เด…เดคเดฟเตฝ เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดต เดชเดฑเดฏเตเดจเตเดจเต:

"เด’เดฐเต "เดšเดฟเดคเตเดฐเด‚" เดŽเดจเตเดจเดคเต เด’เดฐเต JSON เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเดฟเตปเตเดฑเต†เดฏเตเด‚ เดตเตเดฏเด•เตเดคเดฟเด—เดค เดฒเต†เดฏเตผ เดซเดฏเดฒเตเด•เดณเตเดŸเต†เดฏเตเด‚ เดธเด‚เดฏเต‹เดœเดจเดฎเดพเดฃเต. เด’เดฐเต > เด‡เดฎเต‡เดœเต เดตเดฒเดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเด•เตเดฐเดฟเดฏ เดˆ เดฐเดฃเตเดŸเต เด˜เดŸเด•เด™เตเด™เดณเตเด‚ เดตเต€เดฃเตเดŸเต†เดŸเตเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดšเตเดฑเตเดฑเตเด‚ เด•เต‡เดจเตเดฆเตเดฐเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต."

เด…เดคเดฟเดจเดพเตฝ เดกเต‹เด•เตเดฏเตเดฎเต†เตปเตเดฑเต‡เดทเตป เด…เดจเตเดธเดฐเดฟเดšเตเดšเต เด†เดฆเตเดฏ เด˜เดŸเตเดŸเด‚ "เด’เดฐเต เด‡เดฎเต‡เดœเต เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเต เดตเดฒเดฟเด•เตเด•เตเดจเตเดจเต".

เดคเต€เตผเดšเตเดšเดฏเดพเดฏเตเด‚, เดžเด™เตเด™เตพ เด…เดคเต เดทเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดฟเดฒเตเดฒ, เดชเด•เตเดทเต‡ เดžเด™เตเด™เตพเด•เตเด•เต เด…เดคเดฟเตฝ เดจเดฟเดจเตเดจเตเดณเตเดณ เดกเดพเดฑเตเดฑ เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจเดคเต เด’เดฐเต เด‰เดฆเดพเดนเดฐเดฃ เด…เดญเตเดฏเตผเดคเตเดฅเดจเดฏเดพเดฃเต: GET /v2/{name}/manifests/{reference}

"เดชเต‡เดฐเตเด‚ เดฑเดซเดฑเตปเดธเต เดชเดพเดฐเดพเดฎเต€เดฑเตเดฑเดฑเตเด‚ เดšเดฟเดคเตเดฐเด‚ เดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดฏเตเดจเตเดจเต, เด…เดต เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เดฑเดซเดฑเตปเดธเดฟเตฝ เด’เดฐเต เดŸเดพเด—เต เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เดกเตˆเดœเดธเตเดฑเตเดฑเต เด‰เตพเดชเตเดชเต†เดŸเตเดŸเต‡เด•เตเด•เดพเด‚."

เดžเด™เตเด™เดณเตเดŸเต† เดกเต‹เด•เตเด•เตผ เดถเต‡เด–เดฐเด‚ เดชเตเดฐเดพเดฆเต‡เดถเดฟเด•เดฎเดพเดฏเดฟ เดตเดฟเดจเตเดฏเดธเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเตป เดถเตเดฐเดฎเดฟเด•เตเด•เดพเด‚:

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

HTTP เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด•เตเดฒเดฏเดจเตเดฑเต เด‡เดฒเตเดฒเดพเดคเต† เดกเต‹เด•เตเด•เตผ เดชเตเตพ, เดกเต‹เด•เตเด•เตผ เดชเตเดทเต เด•เดฎเดพเตปเดกเตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต

เดชเตเดฐเดคเดฟเด•เดฐเดฃเดฎเดพเดฏเดฟ, เดžเด™เตเด™เตพเด•เตเด•เต json เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเต, เด…เดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดžเด™เตเด™เตพเด•เตเด•เต เดจเดฟเดฒเดตเดฟเตฝ เดฒเตˆเดซเตโ€Œเดฒเตˆเดจเตเด•เดณเดฟเตฝ เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ เด…เดตเดฏเตเดŸเต† เดนเดพเดทเตเด•เดณเดฟเตฝ เดฎเดพเดคเตเดฐเดฎเต‡ เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดณเตเดณเต‚. เด…เดต เดฒเดญเดฟเดšเตเดšเตเด•เดดเดฟเดžเตเดžเดพเตฝ, เดจเดฎเตเด•เตเด•เต เด“เดฐเต‹เดจเตเดจเดฟเดฒเต‚เดŸเต†เดฏเตเด‚ เดชเต‹เดฏเดฟ เด‡เดจเดฟเดชเตเดชเดฑเดฏเตเดจเตเดจ เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เดพเด‚: "GET /v2/{name}/blobs/{digest}"

"เดฑเต†เดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเดฏเตเดŸเต† เดชเต‡เดฐเดฟเตฝ เด’เดฐเต เดฒเต†เดฏเดฑเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด†เด•เตเดธเดธเต เด—เต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดชเตเดชเต†เดŸเตเด‚, เดชเด•เตเดทเต‡ เดกเตˆเดœเดธเตเดฑเตเดฑเต เดตเดดเดฟ เดฐเดœเดฟเดธเตเดŸเตเดฐเดฟเดฏเดฟเตฝ เด…เดฆเตเดตเดฟเดคเต€เดฏเดฎเดพเดฏเดฟ เดคเดฟเดฐเดฟเดšเตเดšเดฑเดฟเดฏเตเดจเตเดจเต."

เดˆ เด•เต‡เดธเดฟเตฝ เดกเตˆเดœเดธเตเดฑเตเดฑเต เดžเด™เตเด™เตพเด•เตเด•เต เดฒเดญเดฟเดšเตเดš เดนเดพเดทเต เด†เดฃเต.

เดถเตเดฐเดฎเดฟเด•เตเด•เตเดจเตเดจเต

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 เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด•เตเดฒเดฏเดจเตเดฑเต เด‡เดฒเตเดฒเดพเดคเต† เดกเต‹เด•เตเด•เตผ เดชเตเตพ, เดกเต‹เด•เตเด•เตผ เดชเตเดทเต เด•เดฎเดพเตปเดกเตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต

เด†เดฆเตเดฏ เดฒเตˆเดซเตโ€Œเดฒเตˆเตป เด†เดฏเดฟ เด’เดŸเตเดตเดฟเตฝ เดจเดฎเตเด•เตเด•เต เดฒเดญเดฟเดšเตเดšเดคเต เดเดคเตเดคเดฐเด‚ เดซเดฏเดฒเดพเดฃเต†เดจเตเดจเต เดจเต‹เด•เตเด•เดพเด‚.

file firstLayer

HTTP เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด•เตเดฒเดฏเดจเตเดฑเต เด‡เดฒเตเดฒเดพเดคเต† เดกเต‹เด•เตเด•เตผ เดชเตเตพ, เดกเต‹เด•เตเด•เตผ เดชเตเดทเต เด•เดฎเดพเตปเดกเตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต

เด†. เดฑเต†เดฏเดฟเดฒเตเด•เตพ เดŸเดพเตผ เด†เตผเด•เตเด•เตˆเดตเตเด•เดณเดพเดฃเต, เด…เดต เด‰เดšเดฟเดคเดฎเดพเดฏ เด•เตเดฐเดฎเดคเตเดคเดฟเตฝ เด…เตบเดชเดพเด•เตเด•เต เดšเต†เดฏเตเดคเดพเตฝ เดจเดฎเตเด•เตเด•เต เดšเดฟเดคเตเดฐเดคเตเดคเดฟเตปเตเดฑเต† เด‰เดณเตเดณเดŸเด•เตเด•เด‚ เดฒเดญเดฟเด•เตเด•เตเด‚.

เด’เดฐเต เดšเต†เดฑเดฟเดฏ เดฌเดพเดทเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เดŽเดดเตเดคเดพเด‚, เด…เด™เตเด™เดจเต† เดŽเดฒเตเดฒเดพเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเด‚

#!/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 - เดกเต‹เด•เตเด•เตผ เดชเตเดทเต

เด‡เดคเต เด•เตเดฑเดšเตเดšเตเด•เต‚เดŸเดฟ เดธเด™เตเด•เต€เตผเดฃเตเดฃเดฎเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚.

เดจเดฎเตเด•เตเด•เต เดตเต€เดฃเตเดŸเตเด‚ เดคเตเดŸเด™เตเด™เดพเด‚ เดชเตเดฐเดฎเดพเดฃเต€เด•เดฐเดฃเด‚. เด…เดคเดฟเดจเดพเตฝ เดจเดฎเตเดฎเตพ เด“เดฐเต‹ เดจเต‡เดคเดพเดตเดฟเดจเต†เดฏเตเด‚ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เด…เดจเตเดฌเดจเตเดง เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเต เดถเต‡เด–เดฐเดฟเด•เตเด•เตเด•เดฏเตเด‚ เด…เดคเตเด‚ เดกเต—เตบเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเด•เดฏเตเด‚ เดตเต‡เดฃเด‚. เด‡เดคเต เดฒเดณเดฟเดคเดฎเดพเดฏเดฟ เดคเต‹เดจเตเดจเตเดจเตเดจเต.

เดกเต‹เด•เตเดฏเตเดฎเต†เตปเตเดฑเต‡เดทเตป เดชเด เดฟเดšเตเดš เดถเต‡เดทเด‚, เดกเต—เตบเดฒเต‹เดกเต เดชเตเดฐเด•เตเดฐเดฟเดฏเดฏเต† เดจเดฎเตเด•เตเด•เต เดชเดฒ เด˜เดŸเตเดŸเด™เตเด™เดณเดพเดฏเดฟ เดตเดฟเดญเดœเดฟเด•เตเด•เดพเด‚:

  • เดชเตเดฐเต‹เดธเดธเตเดธเต เด†เดฐเด‚เดญเดฟเด•เตเด•เตฝ - "POST /v2/{repoName}/blobs/uploads/"
  • เด’เดฐเต เดฒเตˆเดซเตโ€Œเดฒเตˆเตป เด…เดชเตโ€Œเดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต (เดžเด™เตเด™เตพ เด’เดฐเต เดฎเต‹เดฃเต‹เดฒเดฟเดคเตเดคเดฟเด•เตเด•เต เด…เดชเตโ€Œเดฒเต‹เดกเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚, เด…เดคเดพเดฏเดคเต เด“เดฐเต‹ เดฒเตˆเดซเตโ€Œเดฒเตˆเดจเตเด‚ เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏเดฟ เด…เดฏเดฏเตโ€Œเด•เตเด•เตเด‚) - "PUT /v2/{repoName}/blobs/uploads/{uuid}?digest={digest}
    เด‰เดณเตเดณเดŸเด•เตเด• เดฆเตˆเตผเด˜เตเดฏเด‚: {เดชเดพเดณเดฟเดฏเตเดŸเต† เดตเดฒเดฟเดชเตเดชเด‚}
    เด‰เดณเตเดณเดŸเด•เตเด• เดคเดฐเด‚: เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป/เด’เด•เตเดŸเดฑเตเดฑเต-เดธเตเดŸเตเดฐเต€เด‚
    เดฒเต†เดฏเตผ เดฌเตˆเดจเดฑเดฟ เดกเดพเดฑเตเดฑ".
  • เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเต เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเตเดจเตเดจเต - "PUT /v2/{repoName}/manifests/{reference}".

เดŽเดจเตเดจเดพเตฝ เดกเต‹เด•เตเดฏเตเดฎเต†เตปเตเดฑเต‡เดทเตป เด’เดฐเต เด˜เดŸเตเดŸเด‚ เดจเดทเตโ€ŒเดŸเดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเต, เด…เดคเดฟเดฒเตเดฒเดพเดคเต† เด’เดจเตเดจเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เดฟเดฒเตเดฒ. เดฎเต‹เดฃเต‹เดฒเดฟเดคเตเดคเดฟเด•เตเด•เต เดฒเต‹เดกเดฟเด‚เด—เดฟเดจเตเด‚ เดญเดพเด—เดฟเด•เดฎเดพเดฏเดฟ (เดšเด™เตเด•เตเดกเต) เดฑเต†เดฏเดฟเตฝ เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต, เดจเดฟเด™เตเด™เตพ เด’เดฐเต เดชเดพเดšเตเดšเต เด…เดญเตเดฏเตผเดคเตเดฅเดจ เดจเดŸเดคเตเดคเดฃเด‚:

"PATCH /v2/{repoName}/blobs/uploads/{uuid}
เด‰เดณเตเดณเดŸเด•เตเด• เดฆเตˆเตผเด˜เตเดฏเด‚: {เดšเด™เตเด•เดฟเตปเตเดฑเต† เดตเดฒเดฟเดชเตเดชเด‚}
เด‰เดณเตเดณเดŸเด•เตเด• เดคเดฐเด‚: เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป/เด’เด•เตเดŸเดฑเตเดฑเต-เดธเตเดŸเตเดฐเต€เด‚
{เดฒเต†เดฏเตผ เดšเด™เตเด•เต เดฌเตˆเดจเดฑเดฟ เดกเดพเดฑเตเดฑ}".

เด…เดฒเตเดฒเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด†เดฆเตเดฏ เดชเต‹เดฏเดฟเตปเตเดฑเดฟเดจเดชเตเดชเตเดฑเด‚ เดจเต€เด™เตเด™เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ, เด•เดพเดฐเดฃเด‚... เดชเตเดฐเดคเต€เด•เตเดทเดฟเด•เตเด•เตเดจเตเดจ เดชเตเดฐเดคเดฟเด•เดฐเดฃ เด•เต‹เดกเต 202-เดจเต เดชเด•เดฐเด‚, เดจเดฟเด™เตเด™เตพเด•เตเด•เต 4xx เดฒเดญเดฟเด•เตเด•เตเด‚.

เด‡เดชเตเดชเต‹เตพ เด…เตฝเด—เต‹เดฐเดฟเดคเด‚ เด‡เดคเตเดชเต‹เดฒเต† เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต:

  • เดชเตเดฐเดพเดฐเด‚เดญเด‚
  • เดชเดพเดšเตเดšเต เดฑเต†เดฏเดฟเตฝ
  • เดนเดพเตปเดกเตโ€Œเดฑเต†เดฏเดฟเตฝ เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต
  • เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเต เดฒเต‹เดกเต เดšเต†เดฏเตเดฏเตเดจเตเดจเต
    เดฏเดฅเดพเด•เตเดฐเดฎเด‚ 2-เด‰เด‚ 3-เด‰เด‚ เดชเต‹เดฏเดฟเตปเตเดฑเตเด•เตพ, เดŽเดคเตเดฐ เดตเดฐเดฟเด•เตพ เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต‹ เด…เดคเตเดฐเดฏเตเด‚ เดคเดตเดฃ เด†เดตเตผเดคเตเดคเดฟเด•เตเด•เตเด‚.

เด†เดฆเตเดฏเด‚, เดจเดฎเตเด•เตเด•เต เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เดšเดฟเดคเตเดฐเด‚ เด†เดตเดถเตเดฏเดฎเดพเดฃเต. เดžเดพเตป archlinux:latest เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเด‚

docker pull archlinux

HTTP เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด•เตเดฒเดฏเดจเตเดฑเต เด‡เดฒเตเดฒเดพเดคเต† เดกเต‹เด•เตเด•เตผ เดชเตเตพ, เดกเต‹เด•เตเด•เตผ เดชเตเดทเต เด•เดฎเดพเตปเดกเตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต

เด‡เดจเดฟ เด•เต‚เดŸเตเดคเตฝ เดตเดฟเดถเด•เดฒเดจเดคเตเดคเดฟเดจเดพเดฏเดฟ เด‡เดคเต เดชเตเดฐเดพเดฆเต‡เดถเดฟเด•เดฎเดพเดฏเดฟ เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เดพเด‚

docker save c24fe13d37b9 -o savedArch

HTTP เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด•เตเดฒเดฏเดจเตเดฑเต เด‡เดฒเตเดฒเดพเดคเต† เดกเต‹เด•เตเด•เตผ เดชเตเตพ, เดกเต‹เด•เตเด•เตผ เดชเตเดทเต เด•เดฎเดพเตปเดกเตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต

เดคเดคเตเดซเดฒเดฎเดพเดฏเตเดฃเตเดŸเดพเด•เตเดจเตเดจ เด†เตผเด•เตเด•เตˆเดตเต เดจเดฟเดฒเดตเดฟเดฒเต† เดกเดฏเดฑเด•เตเดŸเดฑเดฟเดฏเดฟเดฒเต‡เด•เตเด•เต เด…เตบเดชเดพเด•เตเด•เต เดšเต†เดฏเตเดฏเตเด•

tar xvf savedArch

HTTP เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด•เตเดฒเดฏเดจเตเดฑเต เด‡เดฒเตเดฒเดพเดคเต† เดกเต‹เด•เตเด•เตผ เดชเตเตพ, เดกเต‹เด•เตเด•เตผ เดชเตเดทเต เด•เดฎเดพเตปเดกเตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เดพเดฃเดพเดจเดพเด•เตเดจเตเดจเดคเตเดชเต‹เดฒเต†, เด“เดฐเต‹ เดฒเตˆเดซเตโ€Œเดฒเตˆเดจเตเด‚ เด’เดฐเต เดชเตเดฐเดคเตเดฏเต‡เด• เดซเต‹เตพเดกเดฑเดฟเดฒเดพเดฃเต. เด‡เดจเดฟ เดจเดฎเตเด•เตเด•เต เดฒเดญเดฟเดšเตเดš เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเดฟเตปเตเดฑเต† เด˜เดŸเดจ เดจเต‹เด•เตเด•เดพเด‚

cat manifest.json | json_pp

HTTP เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด•เตเดฒเดฏเดจเตเดฑเต เด‡เดฒเตเดฒเดพเดคเต† เดกเต‹เด•เตเด•เตผ เดชเตเตพ, เดกเต‹เด•เตเด•เตผ เดชเตเดทเต เด•เดฎเดพเตปเดกเตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต

เดตเดณเดฐเต†เดฏเดงเดฟเด•เดฎเดฟเดฒเตเดฒ. เดฒเต‹เดกเตเดšเต†เดฏเตเดฏเดพเตป เด†เดตเดถเตเดฏเดฎเดพเดฏ เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเต เดŽเดจเตเดคเดพเดฃเต†เดจเตเดจเต เดจเต‹เด•เตเด•เดพเด‚ เดชเตเดฐเดฎเดพเดฃเต€เด•เดฐเดฃเด‚.

HTTP เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เตพ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดกเต‹เด•เตเด•เตผ เด•เตเดฒเดฏเดจเตเดฑเต เด‡เดฒเตเดฒเดพเดคเต† เดกเต‹เด•เตเด•เตผ เดชเตเตพ, เดกเต‹เด•เตเด•เตผ เดชเตเดทเต เด•เดฎเดพเตปเดกเตเด•เตพ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต

เดตเตเดฏเด•เตเดคเดฎเดพเดฏเตเด‚, เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณ เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเต‹ เดžเด™เตเด™เตพเด•เตเด•เต เด…เดจเตเดฏเต‹เดœเตเดฏเดฎเดฒเตเดฒ, เด…เดคเดฟเดจเดพเตฝ เดฌเตเดฒเดพเด•เตเด•เต เดœเดพเด•เตเด•เตเด‚ เดตเต‡เดถเตเดฏเด•เดณเตเด‚, เดฒเตˆเดซเตโ€Œเดฒเตˆเดจเตเด•เดณเตเด‚ เด•เต‹เตบเดซเดฟเด—เต‡เดทเดจเตเด•เดณเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดžเด™เตเด™เตพ เดธเตเดตเดจเตเดคเดฎเดพเดฏเดฟ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเด‚.

เดžเด™เตเด™เตพเด•เตเด•เต เดŽเดฒเตเดฒเดพเดฏเตโ€Œเดชเตเดชเต‹เดดเตเด‚ เด•เตเดฑเดžเตเดžเดคเต เด’เดฐเต เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเดฒเตเด‚ เดฒเตˆเดซเต เดฒเตˆเดจเตเด•เดณเตเดŸเต† เด’เดฐเต เดจเดฟเดฐเดฏเตเด‚ เด‰เดฃเตเดŸเดพเดฏเดฟเดฐเดฟเด•เตเด•เตเด‚. เดธเตเด•เต€เด‚ เดชเดคเดฟเดชเตเดชเต 2 (เดŽเดดเตเดคเตเดจเตเดจ เดธเดฎเดฏเดคเตเดคเต เดจเดฟเดฒเดตเดฟเดฒเตเดณเตเดณเดคเต), เดฎเต€เดกเดฟเดฏเดŸเตˆเดชเตเดชเต เดฎเดพเดฑเตเดฑเดฎเดฟเดฒเตเดฒเดพเดคเต† เดคเตเดŸเดฐเตเด‚:

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

เด…เดŸเดฟเดธเตเดฅเดพเดจ เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเต เดธเตƒเดทเตโ€ŒเดŸเดฟเดšเตเดš เดถเต‡เดทเด‚, เดจเดฟเด™เตเด™เตพ เด…เดคเต เดธเดพเดงเตเดตเดพเดฏ เดกเดพเดฑเตเดฑ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดชเต‚เดฐเดฟเดชเตเดชเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. เด‡เดคเต เดšเต†เดฏเตเดฏเตเดจเตเดจเดคเดฟเดจเต, เดžเด™เตเด™เตพ เดฑเต†เดฏเดฟเตฝ เด’เดฌเตเดœเด•เตเดฑเตเดฑเดฟเตปเตเดฑเต† json เดŸเต†เด‚เดชเตเดฒเต‡เดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเต:

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

เด“เดฐเต‹ เดฑเต†เดฏเดฟเดฒเดฟเดจเตเด‚ เดžเด™เตเด™เตพ เด…เดคเต เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเดฟเดฒเต‡เด•เตเด•เต เดšเต‡เตผเด•เตเด•เตเด‚.

เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ, เด•เต‹เตบเดซเดฟเด—เดฑเต‡เดทเตป เดซเดฏเดฒเดฟเตปเตเดฑเต† เดตเดฒเตเดชเตเดชเด‚ เด•เดฃเตเดŸเต†เดคเตเดคเตเด•เดฏเตเด‚ เดฎเดพเดจเดฟเดซเต†เดธเตเดฑเตเดฑเดฟเดฒเต† เด…เดชเต‚เตผเดฃเตเดฃเดฎเดพเดฏ เดตเดฟเดตเดฐเด™เตเด™เตพ เดฏเดฅเดพเตผเดคเตเดฅ เดกเดพเดฑเตเดฑ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดฎเดพเดฑเตเดฑเดฟเดธเตเดฅเดพเดชเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดตเต‡เดฃเด‚.

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

เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดฑเต†เดกเดฟเดฎเต†เดฏเตเดกเต เดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚:

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

เดฏเตเดชเดฟเดŽเดธเต:
เด…เดคเดฟเตปเตเดฑเต† เดซเดฒเดฎเดพเดฏเดฟ เดจเดฎเตเด•เตเด•เต เดŽเดจเตเดคเดพเดฃเต เดฒเดญเดฟเดšเตเดšเดคเต?
เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดตเดฟเดถเด•เดฒเดจเดคเตเดคเดฟเดจเดพเดฏเตเดณเตเดณ เดฏเดฅเดพเตผเดคเตเดฅ เดกเดพเดฑเตเดฑ, เดฌเตเดฒเต‡เดธเตโ€Œเดฎเต€เดฑเตเดฑเดฑเดฟเดฒเดพเดฃเต เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเต, เด•เต‚เดŸเดพเดคเต† เดกเต‹เด•เตเด•เตผ เด•เตเดฒเดฏเตปเตเดฑเต เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เดณเดฟเดฒเต† เดกเดพเดฑเตเดฑ เดถเตเดฆเตเดงเดฎเดพเดฏ HTTP เด…เดญเตเดฏเตผเดคเตเดฅเดจเด•เดณเดฟเตฝ เดจเดฟเดจเตเดจเต เดตเตเดฏเดคเตเดฏเดธเตเดคเดฎเดพเดฏเดฟ เดตเดณเดฐเต† เดตเดฟเดตเดฐเดฆเดพเดฏเด•เดฎเดฒเตเดฒ.

เดฐเดฃเตเดŸเดพเดฎเดคเดพเดฏเดฟ, เดกเต‹เด•เตเด•เตผ เด…เดชเตโ€Œเดฒเต‹เดกเดฟเดจเดพเดฏเตเดณเตเดณ เดตเต†เตผเดšเตเดตเตฝ เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ เดเด•เดฆเต‡เดถเด‚ 150% เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเตเด‚ เดถเดฐเดพเดถเดฐเดฟ เดชเตเดฐเดคเดฟเด•เดฐเดฃ เดธเดฎเดฏเด‚ 20-25% เดตเต‡เด—เดคเตเดคเดฟเตฝ เดจเต‡เดŸเดพเดจเตเด‚ เดธเด‚เด•เตเดฐเดฎเดฃเด‚ เดžเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเดšเตเดšเต. เดกเต‹เด•เตเด•เตผ เดกเต—เตบเดฒเต‹เดกเดฟเดจเดพเดฏเดฟ, เด‰เดชเดฏเต‹เด•เตเดคเดพเด•เตเด•เดณเตเดŸเต† เดŽเดฃเตเดฃเด‚ 500% เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดžเด™เตเด™เตพเด•เตเด•เต เด•เดดเดฟเดžเตเดžเต, เด…เดคเต‡เดธเดฎเดฏเด‚ เดถเดฐเดพเดถเดฐเดฟ เดชเตเดฐเดคเดฟเด•เดฐเดฃ เดธเดฎเดฏเด‚ เดเด•เดฆเต‡เดถเด‚ 60% เด•เตเดฑเดžเตเดžเต.

เดจเดฟเด™เตเด™เดณเตเดŸเต† เดถเตเดฐเดฆเตเดงเดฏเตเด•เตเด•เต เดจเดจเตเดฆเดฟ.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•