ЁЯН▒ рдзрдбрд╛ 01 тАФ Containers рдЖрдгрд┐ Images: рднрд░рд▓реЗрд▓рд╛ рдЬреЗрд╡рдгрд╛рдЪрд╛ рдбрдмрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 13 рдкреИрдХреА рдзрдбрд╛ 01 ┬╖ рдкреБрдврдЪреА branch: lesson-02-pods
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рд╣реА branch рдЕрдЧрджреА рдкрд╣рд┐рд▓рд╛ рдзрдбрд╛ рдЬреЛрдбрддреЗ: container рдореНрд╣рдгрдЬреЗ рдХрд╛рдп, рдЖрдгрд┐ image рдореНрд╣рдгрдЬреЗ рдХрд╛рдп тАФ рдХрд╛рд░рдг Kubernetes рдЪреЗ рд╕рдВрдкреВрд░реНрдг рдХрд╛рдо containers рдЪрд╛рд▓рд╡рдгреЗ рд╣реЗрдЪ рдЖрд╣реЗ, рддреНрдпрд╛рдореБрд│реЗ рд╣реЗ рд╕рдордЬрд▓реНрдпрд╛рд╢рд┐рд╡рд╛рдп рдкреБрдврдЪреЗ рдХрд╛рд╣реАрдЪ рд╕рдордЬрдд рдирд╛рд╣реА. рдпрд╛ рдзрдбреНрдпрд╛рдд рд╡рд╛рдкрд░рд▓реЗрд▓реНрдпрд╛ рдЦрд▒реНрдпрд╛ files:
- apps/school-api/Dockerfile тАФ Node.js API image рдЪреА рдкрд╛рдХрдХреГрддреА
- apps/school-analytics/Dockerfile тАФ Python image рдЪреА рдкрд╛рдХрдХреГрддреА
- docker-compose.yml тАФ рджреЛрдиреНрд╣реА containers + Postgres рд╕реНрдерд╛рдирд┐рдХ рдкрд╛рддрд│реАрд╡рд░ рдЪрд╛рд▓рд╡рддреЗ
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдХрд▓реНрдкрдирд╛ рдХрд░рд╛, рддреБрдордЪреА рдЖрдИ рддреБрдореНрд╣рд╛рд▓рд╛ рдЬреЗрд╡рдгрд╛рдЪрд╛ рдбрдмрд╛ ЁЯН▒ рднрд░реВрди рджреЗрддреЗ. рддреНрдпрд╛рдд рддреБрдореНрд╣рд╛рд▓рд╛ рд▓рд╛рдЧрдгрд╛рд░реЗ рд╕рдЧрд│реЗ рдЖрд╣реЗ: рднрд╛рдд, рднрд╛рдЬреА, рдЪрдордЪрд╛, рд░реБрдорд╛рд▓. рддреБрдореНрд╣реА рддреЛ рдХреЛрдгрд╛рдЪреНрдпрд╛рд╣реА рдШрд░реА рдЙрдШрдбрд╛ тАФ рддреБрдордЪреЗ рдЬреЗрд╡рдг рдЕрдЧрджреА рддрд╕реЗрдЪ рдЕрд╕рддреЗ, рдХрд╛рд░рдг рд╕рдЧрд│реЗ рдбрдмреНрдпрд╛рдЪреНрдпрд╛ рдЖрддрдЪ рдЖрд▓реЗ рд╣реЛрддреЗ.
Container рдореНрд╣рдгрдЬреЗ program рд╕рд╛рдареАрдЪрд╛ рдЬреЗрд╡рдгрд╛рдЪрд╛ рдбрдмрд╛. рддреНрдпрд╛рдд app рдЖрдгрд┐ рддреНрдпрд╛рд▓рд╛ рд▓рд╛рдЧрдгрд╛рд░реЗ рд╕рдЧрд│реЗ рдЕрд╕рддреЗ тАФ Node.js, libraries, config. рддреНрдпрд╛рдореБрд│реЗ рддреЗ рддреБрдордЪреНрдпрд╛ laptop рд╡рд░, рдореИрддреНрд░рд┐рдгреАрдЪреНрдпрд╛ laptop рд╡рд░ рдЖрдгрд┐ рдПрдЦрд╛рджреНрдпрд╛ рдореЛрдареНрдпрд╛ AWS server рд╡рд░ рдЕрдЧрджреА рд╕рд╛рд░рдЦреЗрдЪ рдЪрд╛рд▓рддреЗ. рдЖрддрд╛ "рдкрдг рдорд╛рдЭреНрдпрд╛ machine рд╡рд░ рддрд░ рдЪрд╛рд▓рддреЗ!" рдЕрд╕реЗ рдореНрд╣рдгрд╛рдпрдЪреА рд╡реЗрд│ рдпреЗрдд рдирд╛рд╣реА ЁЯШд
- Image = рдкрд╛рдХрдХреГрддреА + рдХрдкрд╛рдЯрд╛рдд рдареЗрд╡рд▓реЗрд▓рд╛ рднрд░рд▓реЗрд▓рд╛ рдбрдмрд╛ (рдЧреЛрдард╡рд▓реЗрд▓рд╛, рддрдпрд╛рд░).
- Container = рдЙрдШрдбрд▓реЗрд▓рд╛ рдЖрдгрд┐ рдЦрд╛рд▓реНрд▓рд╛ рдЬрд╛рдд рдЕрд╕рд▓реЗрд▓рд╛ рдбрдмрд╛ (рдЪрд╛рд▓реВ).
- Dockerfile = рдбрдмрд╛ рднрд░рддрд╛рдирд╛ рдЖрдИрдиреЗ рд╡рд╛рдкрд░рд▓реЗрд▓реЗ рдкрд╛рдХрдХреГрддреАрдЪреЗ рдХрд╛рд░реНрдб.
рдПрдХрд╛ рдкрд╛рдХрдХреГрддреАрддреВрди рддреБрдореНрд╣реА 100 рдПрдХрд╕рд╛рд░рдЦреЗ рдбрдмреЗ рдмрдирд╡реВ рд╢рдХрддрд╛. рдореНрд╣рдгреВрдирдЪ рдПрдХ image 100 рдПрдХрд╕рд╛рд░рдЦреНрдпрд╛ containers рдореНрд╣рдгреВрди рдЪрд╛рд▓реВ рд╢рдХрддреЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
subgraph recipe["ЁЯУЭ Recipe - Dockerfile"]
D["FROM node:20<br/>COPY src<br/>RUN npm install"]
end
subgraph shelf["ЁЯзК Image - frozen lunchbox"]
I["school-api:latest<br/>app + Node.js + libs"]
end
subgraph running["ЁЯПГ Containers - lunch time"]
C1["container 1"]
C2["container 2"]
C3["container 3"]
end
D -- "docker build" --> I
I -- "docker run" --> C1
I -- "docker run" --> C2
I -- "docker run" --> C3
тЭУ рдХрд╛рдп
- Container рдореНрд╣рдгрдЬреЗ рд╕реНрд╡рддрдГрдЪреА filesystem, network рдЪреА рджреГрд╖реНрдЯреА рдЖрдгрд┐ dependencies рдЕрд╕рд▓реЗрд▓реА рдПрдХ рд╡реЗрдЧрд│реА рдареЗрд╡рд▓реЗрд▓реА process тАФ virtual machine рдкреЗрдХреНрд╖рд╛ рдЦреВрдк рд╣рд▓рдХреА (рддреА рд╕реНрд╡рддрдГрдЪреА OS boot рдХрд░рдгреНрдпрд╛рдРрд╡рдЬреА host рдЪрд╛ Linux kernel рд╡рд╛рдЯреВрди рдШреЗрддреЗ).
- Image рдореНрд╣рдгрдЬреЗ container рдЬреНрдпрд╛рдкрд╛рд╕реВрди рд╕реБрд░реВ рд╣реЛрддреЛ рддреЛ read-only рд╕рд╛рдЪрд╛, рдЬреЛ Dockerfile рдкрд╛рд╕реВрди рдерд░рд╛рдВрдордзреНрдпреЗ (layers) рдмрдирд╡рд▓рд╛ рдЬрд╛рддреЛ.
- Registry (рдЗрдереЗ AWS ECR рд╕рд╛рд░рдЦреА) рдореНрд╣рдгрдЬреЗ рддреЗ рдХрдкрд╛рдЯ рдЬрд┐рдереЗ images рдареЗрд╡рд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд рдЖрдгрд┐ рдЬрд┐рдереВрди pull рдХреЗрд▓реНрдпрд╛ рдЬрд╛рддрд╛рдд.
ЁЯдФ рдХрд╛
Containers рдирд╕рддреАрд▓ рддрд░: "Node 20, Postgres 16 install рдХрд░рд╛, рд╣реЗ 12 env vars set рдХрд░рд╛тАж" рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ machine рд╣рд│реВрд╣рд│реВ рд╡реЗрдЧрд│реА рд╣реЛрдд рдЬрд╛рддреЗ. Containers рдЕрд╕рддреАрд▓ рддрд░: рдПрдХрджрд╛ build рдХрд░рд╛, рдХреБрдареЗрд╣реА, рдЕрдЧрджреА рд╕рд╛рд░рдЦреЗрдЪ рдЪрд╛рд▓рд╡рд╛. Kubernetes рдЕрд╕реНрддрд┐рддреНрд╡рд╛рдд рдЖрд╣реЗ рддреЗ рдЕрдиреЗрдХ machines рд╡рд░ рдЕрдиреЗрдХ containers рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА тАФ рдореНрд╣рдгреВрди рдкреБрдвреЗ рдпреЗрдгрд╛рд▒реНрдпрд╛ рд╕рдЧрд│реНрдпрд╛рдЪреЗ рдЕрдгреВ рдореНрд╣рдгрдЬреЗ containers.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
apps/school-api/Dockerfile рдЙрдШрдбрд╛:
FROM node:20-alpineтАФ рдЬреНрдпрд╛рдд рдЖрдзреАрдЪ Node рдЖрд╣реЗ рдЕрд╢рд╛ рд▓рд╣рд╛рди рдореВрд│ рдбрдмреНрдпрд╛рдкрд╛рд╕реВрди рд╕реБрд░реБрд╡рд╛рдд рдХрд░рд╛.COPY+RUN npm ciтАФ app рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ libraries рдЖрдд рдареЗрд╡рд╛.- Multi-stage build тАФ рдЕрдВрддрд┐рдо image рдордзреНрдпреЗ рдлрдХреНрдд рдЪрд╛рд▓рд╡рдгреНрдпрд╛рд╕рд╛рдареА рд▓рд╛рдЧрдгрд╛рд░реЗрдЪ рд░рд╛рд╣рддреЗ (рд▓рд╣рд╛рди = рдкрд╛рдард╡рд╛рдпрд▓рд╛ рдЬрд▓рдж).
CMDтАФ рдбрдмрд╛ рдЙрдШрдбрд▓реНрдпрд╛рд╡рд░ рдХрд╛рдп рдХрд░рд╛рдпрдЪреЗ ("server рд╕реБрд░реВ рдХрд░рд╛").
рддреНрдпрд╛рдирдВрддрд░ docker-compose.yml рддреБрдордЪреНрдпрд╛ laptop рд╡рд░ рддреАрди containers
рдПрдХрддреНрд░ рдЪрд╛рд▓рд╡рддреЗ: school-api, school-analytics, рдЖрдгрд┐ postgres.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
# Build the image (bake the lunchbox) тАФ needs Docker Desktop running
docker build -t school-api:v1 apps/school-api
# Run one container from it (open the box)
docker run --rm -p 3000:3000 school-api:v1
# In another terminal тАФ it's alive:
curl http://localhost:3000/healthz
# Or run the WHOLE lunch table (both APIs + Postgres):
docker compose up
ЁЯФз рдпрд╛ рдзрдбреНрдпрд╛рд╕рд╛рдареА kubectl
docker build ┬╖ docker run ┬╖ docker logs
ЁЯФЧ рдпрд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд: ЁЯН▒ Docker рд╢рд╛рд│рд╛ L01тАУL04 (images, run, ports)
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
docker run -p 3000:3000 school-api:v1 рд╣реЗ curl localhost:3000/health рд▓рд╛ рдЙрддреНрддрд░ рджреЗрддреЗ.
ЁЯз╣ рд╕рд╛рдлрд╕рдлрд╛рдИ
Container рд▓рд╛ docker rm -f рдХрд░рд╛ тАФ images рдлрдХреНрдд disk рдЪреА рдЬрд╛рдЧрд╛ рдШреЗрддрд╛рдд
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- container рд▓рд╛ VM рд╕рдордЬрдгреЗ тАФ рддреЛ host рдЪрд╛ kernel рд╡рд╛рдЯреВрди рдШреЗрддреЛ (Docker рд╢рд╛рд│рд╛ L01)
-pрд╢рд┐рд╡рд╛рдп image рдЪрд╛рд▓рд╡рдгреЗ рдЖрдгрд┐ рдордЧ localhost рдЧрдкреНрдк рдХрд╛ рдЖрд╣реЗ рдЕрд╕рд╛ рдкреНрд░рд╢реНрди рдкрдбрдгреЗ
тПня╕П рдкреБрдвреЗ
Kubernetes рдордзреНрдпреЗ container рдХрдзреАрдЪ рдПрдХрдЯрд╛, рдЙрдШрдбреНрдпрд╛рд╡рд░ рдЪрд╛рд▓рдд рдирд╛рд╣реА тАФ рддреЛ рдиреЗрд╣рдореА Pod рдЪреНрдпрд╛ рдЖрдд рдмрд╕реВрди рдЪрд╛рд▓рддреЛ.
git checkout lesson-02-pods