ЁЯПм рдзрдбрд╛ 09 тАФ Registries: рдЧреЛрдард▓реЗрд▓реНрдпрд╛ рдбрдмреНрдпрд╛рдВрдЪреЗ рдЧреЛрджрд╛рдо
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 09 тАФ рднрд╛рдЧ 2 рд╕реБрд░реВ! ┬╖ рдорд╛рдЧреЗ: lesson-08-image-hygiene ┬╖ рдкреБрдвреЗ: lesson-10-ecr-setup
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ08, рдЖрдгрд┐ рддреНрдпрд╛рд╢рд┐рд╡рд╛рдп: laptop рдкрд╛рд╕реВрди cloud рдкрд░реНрдпрдВрддрдЪрд╛ рдкреВрд▓ тАФ registry рдореНрд╣рдгрдЬреЗ рдХрд╛рдп, рдЖрдгрд┐ рднрд╛рдЧ 2 рдЬреНрдпрд╛рд╡рд░ рдЪрд╛рд▓рддреЛ рддреЛ pull/push/tag/digest рдЪрд╛ рд╢рдмреНрджрд╕рдВрдЧреНрд░рд╣.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рддреБрдордЪрд╛ рдбрдмрд╛ рдЕрдЧрджреА рдкрд░рд┐рдкреВрд░реНрдг рдЖрд╣реЗ тАФ рдкрдг рддреЛ рддреБрдордЪреНрдпрд╛ fridge рдордзреНрдпреЗ рдЖрд╣реЗ. рд╢рд╛рд│реЗрдЪреЗ рдХреЕрдиреНрдЯреАрди (рдПрдХ server), рддреБрдордЪреА рд╕рд╣рдХрд╛рд░реА, рднреБрдХреЗрд▓реНрдпрд╛ рдорд╢реАрдирдЪрд╛ рд╕рдВрдкреВрд░реНрдг clusterтАж рдпрд╛рдкреИрдХреА рдХреЛрдгреАрд╣реА рддреБрдордЪреНрдпрд╛ fridge рдкрд░реНрдпрдВрдд рдкреЛрд╣реЛрдЪреВ рд╢рдХрдд рдирд╛рд╣реА. ЁЯзКЁЯЪл
рдЖрддрд╛ рдпреЗрддреЗ рдЧреЛрдард▓реЗрд▓реНрдпрд╛ рдбрдмреНрдпрд╛рдВрдЪреЗ рдЧреЛрджрд╛рдо ЁЯПм (рдПрдХ registry):
- рддреБрдореНрд╣реА рддреБрдордЪрд╛ рдбрдмрд╛ рдПрдХрджрд╛ рдкреЛрд╣реЛрдЪрд╡рддрд╛ (
docker push). - рдкрд░рд╡рд╛рдирдЧреА рдЕрд╕рд▓реЗрд▓реЗ рдХреЛрдгреАрд╣реА рддреНрдпрд╛рдЪреА рдкреНрд░рдд рдШреЗрдК рд╢рдХрддреЗ (
docker pull) тАФ рдХреБрдареВрдирд╣реА. - рдЧреЛрджрд╛рдорд╛рдд рдХрдкреНрдкреЗ (repositories) рдЕрд╕рддрд╛рдд тАФ рдкреНрд░рддреНрдпреЗрдХ ре▓рдкрд╕рд╛рдареА рдПрдХ рдХрдкреНрдкрд╛:
hello-schoolрдХрдкреНрдкреНрдпрд╛рдд рддреНрдпрд╛ рдПрдХрд╛ ре▓рдкрдЪреА рд╕рдЧрд│реА versions рдЕрд╕рддрд╛рдд. - рдХрдкреНрдкреНрдпрд╛рд╡рд░рдЪреНрдпрд╛ рдкреНрд░рддреНрдпреЗрдХ рдбрдмреНрдпрд╛рд╡рд░ рдПрдХ рд▓реЗрдмрд▓ (tag:
v1,abc123) рдЖрдгрд┐ рдПрдХ рдард╕рд╛ (digest:sha256:тАж) рдЕрд╕рддреЛ. рд▓реЗрдмрд▓ рдорд╛рдгрд╕реЗ рд╣рд▓рд╡реВ рд╢рдХрддрд╛рдд; рдард╕рд╛ рдЦреЛрдЯреЗ рдмреЛрд▓реВ рд╢рдХрдд рдирд╛рд╣реА тАФ рдард╢рд╛рдиреЗ pull рдХрд░рд╛ рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ byte-for-byte рддреЛрдЪ рдиреЗрдордХрд╛ рдбрдмрд╛ рдорд┐рд│рддреЛ, рдХрд╛рдпрдордЪрд╛.
рддреБрдореНрд╣реА рдЖрддрд╛рдкрд░реНрдпрдВрдд рдЧреЛрджрд╛рдордЪ рд╡рд╛рдкрд░рдд рд╣реЛрддрд╛! FROM node:20-alpine рд╣реЗ
Docker Hub рд╡рд░реВрди pull рдХрд░рддреЗ тАФ рдкреНрд░рдЪрдВрдб рдореЛрдареЗ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЧреЛрджрд╛рдо. рднрд╛рдЧ 2 рддреБрдордЪреЗ рд╕реНрд╡рддрдГрдЪреЗ
рдЦрд╛рдЬрдЧреА рдЧреЛрджрд╛рдо (ECR) рдорд┐рд│рд╡рдгреНрдпрд╛рдмрджреНрджрд▓ рдЖрд╣реЗ, рдХрд╛рд░рдг рддреБрдордЪреНрдпрд╛ рдХрдВрдкрдиреАрдЪреЗ рдЬреЗрд╡рдг рдЕрдиреЛрд│рдЦреА рд▓реЛрдХрд╛рдВрд╕рд╛рдареА рдирд╛рд╣реА. ЁЯФР
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
lap["ЁЯзСтАНЁЯТ╗ your laptop<br/>image built locally"]
subgraph reg["ЁЯПм registry - the warehouse"]
shelf["ЁЯУЪ repository: hello-school<br/>one shelf, all versions"]
tags["ЁЯП╖я╕П tags: v1, v2, abc123<br/>ЁЯФв digests: sha256:тАж fingerprints"]
shelf --- tags
end
eks["тШ╕я╕П cluster<br/>pulls at deploy"]
mate["ЁЯТ╗ teammate<br/>docker pull"]
lap -->|"1 docker push - once"| reg
reg -->|"2 pull - anywhere, many times"| eks
reg --> mate
тЭУ рдХрд╛рдп
- Registry (рдЧреЛрджрд╛рдо: Docker Hub, ECR, GHCRтАж) тЖТ repository (рдПрдХрд╛ ре▓рдкрдЪрд╛ рдХрдкреНрдкрд╛) тЖТ tags/digests (рдбрдмреЗ).
- Image рдЪреЗ рдкреВрд░реНрдг рдирд╛рд╡ рдореНрд╣рдгрдЬреЗ рдЦрд░реЗ рддрд░ рдПрдХ рдкрддреНрддрд╛ рдЖрд╣реЗ:
REGISTRY/REPOSITORY:TAGтАФ рдЙрджрд╛.docker.io/library/node:20-alpine. Registry рдЪрд╛ рднрд╛рдЧ рдирд╕реЗрд▓ = Docker Hub рдЧреГрд╣реАрдд рдзрд░рд▓рд╛ рдЬрд╛рддреЛ. рдПрд╡рдвреАрдЪ рд╕рдЧрд│реА рдЬрд╛рджреВ. - Push/pull рдерд░рд╛рдВрдмрд╛рдмрдд рд╣реБрд╢рд╛рд░ рдЕрд╕рддрд╛рдд (рдзрдбрд╛ 02 рдЪреЗ рдлрд│ рдорд┐рд│рддреЗ): рдкрд▓реАрдХрдбрдЪреНрдпрд╛ рдмрд╛рдЬреВрдХрдбреЗ рдЖрдзреАрдЪ рдирд╕рд▓реЗрд▓реЗ рдерд░рдЪ wire рд╡рд░реВрди рдЬрд╛рддрд╛рдд. рд▓рд╣рд╛рди рдерд░ = рдЬрд▓рдж рдкрд╛рдард╡рдгреА.
- Tag рд╡рд┐рд░реБрджреНрдз digest: tags рд╣рд▓рд╡рддрд╛ рдпреЗрдгрд╛рд░реЗ рд╕реНрдЯрд┐рдХрд░ (mutable); digests рдореНрд╣рдгрдЬреЗ content рдЪреЗ рдард╕реЗ (immutable). CI systems рдЖрдгрд┐ рдХрд╛рд│рдЬреАрдкреВрд░реНрд╡рдХ рдХреЗрд▓реЗрд▓реЗ deploys digests pin рдХрд░рддрд╛рдд; рдорд╛рдгрд╕реЗ tags рд╡рд╛рдЪрддрд╛рдд.
ЁЯза рдЙрддрд░рдВрдб тАФ registry тЙа repository
Registry (the warehouse тАФ one host)
тЖУ
Repository (one shelf тАФ one application)
тЖУ
Image (one box тАФ one build)
тЖУ
Tag / Digest (the sticker / the fingerprint)
123456789012.dkr.ecr.ap-south-1.amazonaws.com/ тЖР registry
my-app тЖР repository
тФЬтФАтФА v1.0.0 тЖР tags
тФЬтФАтФА v1.1.0
тФФтФАтФА latest (a sticker тАФ it moves)
Registry рд╣реА service рдЖрд╣реЗ; repository рдореНрд╣рдгрдЬреЗ рддрд┐рдЪреНрдпрд╛ рдЖрддрд▓рд╛ рдПрдХрд╛ ре▓рдкрдЪрд╛ рдХрдкреНрдкрд╛. ECR рдордзреНрдпреЗ "repository рдмрдирд╡рд╛" рдореНрд╣рдгрдЬреЗ рддреБрдордЪреНрдпрд╛рдХрдбреЗ рдЖрдзреАрдЪ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдЧреЛрджрд╛рдорд╛рдд рдПрдХ рдХрдкреНрдкрд╛ рдЬреЛрдбрдгреЗ.
ЁЯдФ рдХрд╛
Registry рд╣рд╛ рд╕рдВрдкреВрд░реНрдг trilogy рдЪрд╛ рд╣рд╕реНрддрд╛рдВрддрд░рдгрд╛рдЪрд╛ рдмрд┐рдВрджреВ рдЖрд╣реЗ: рд╣рд╛ рдХреЛрд░реНрд╕ рддреНрдпрд╛рд╡рд░ push рдХрд░рддреЛ, k8s рдХреЛрд░реНрд╕рдЪреЗ Deployments рддреНрдпрд╛рд╡рд░реВрди pull рдХрд░рддрд╛рдд, ArgoCD рдХреЛрд░реНрд╕ рддреНрдпрд╛рдЪреЗ рдкрддреНрддреЗ git рдордзреНрдпреЗ commit рдХрд░рддреЛ. рддреА рдиреИрд╕рд░реНрдЧрд┐рдХ security рд╕реАрдорд╛ рд╣реА рдЖрд╣реЗ (рдХреЛрдг push рдХрд░реВ рд╢рдХрддреЗ? рдХреЛрдг pull рдХрд░реВ рд╢рдХрддреЗ?) рдЖрдгрд┐ рдЕрд╕рд╛ cache рд╣реА, рдЬреНрдпрд╛рдореБрд│реЗ 50 рдорд╢реАрдирдЪрд╛ cluster рддреБрдордЪреНрдпрд╛ laptop рд╡рд░реВрди download рдХрд░рдд рдирд╛рд╣реА.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
# you already speak registry тАФ see today's pulls:
docker pull node:20-alpine # from Docker Hub, layer by layer
docker pull node:20-alpine # again: "Already exists" тАФ layer cache!
# read image ADDRESSES like a pro:
docker image inspect node:20-alpine --format '{{index .RepoDigests 0}}'
# тЖТ docker.io/library/node@sha256:тАж тЖР warehouse/shelf@fingerprint
# a real private-warehouse dry run тАФ run a registry IN a container (how meta):
docker run -d -p 5000:5000 --name warehouse registry:2
docker tag hello-school:v1 localhost:5000/hello-school:v1 # readdress the box
docker push localhost:5000/hello-school:v1 # deliver
docker rmi localhost:5000/hello-school:v1
docker pull localhost:5000/hello-school:v1 # collect тАФ full circle ЁЯОЙ
docker rm -f warehouse
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- repository рд▓рд╛ "registry" рдореНрд╣рдгрдгреЗ (рдЖрдгрд┐ рдЙрд▓рдЯ) тАФ рдПрдХ рдХрдкреНрдкрд╛ рд╡рд┐рд░реБрджреНрдз рд╕рдВрдкреВрд░реНрдг рдЧреЛрджрд╛рдо
- рдЪреБрдХреВрди Docker Hub рдЪреНрдпрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ namespace рдордзреНрдпреЗ push рдХрд░рдгреЗ тАФ image рдЪреЗ рдкреВрд░реНрдг рдирд╛рд╡ рддрдкрд╛рд╕рд╛
- pull рдлреБрдХрдЯ рдЕрд╕рддреЛ рдЕрд╕реЗ рдЧреГрд╣реАрдд рдзрд░рдгреЗ тАФ cross-region рдЖрдгрд┐ cross-cloud pulls рд╡рд░ egress рдЪреЗ рдмрд┐рд▓ рд▓рд╛рдЧрддреЗ
тПня╕П рдкреБрдвреЗ
рдЖрддрд╛ рдЦрд░реА рдЧреЛрд╖реНрдЯ: AWS рдмрдБрдХреЗрддрд▓рд╛ рддреБрдордЪрд╛ рд╕реНрд╡рддрдГрдЪрд╛ locker тАФ ECR repository рдмрдирд╡рдгреЗ рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ рдкреБрдврдЪреНрдпрд╛ рджрд╛рд░рд╛рддреВрди рдЖрдд рдЬрд╛рдгреЗ.
git checkout lesson-10-ecr-setup