ЁЯН╜я╕ПЁЯН╜я╕П рдзрдбрд╛ 06 тАФ Docker Compose: рдПрдХрд╛ command рдиреЗ рд╕рдВрдкреВрд░реНрдг рдЯреЗрдмрд▓ рдорд╛рдВрдбрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 06 ┬╖ рдорд╛рдЧреЗ: lesson-05-volumes-networks ┬╖ рдкреБрдвреЗ: lesson-07-multi-stage
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ05, рдЖрдгрд┐ рддреНрдпрд╛рд╢рд┐рд╡рд╛рдп: Compose тАФ рдзрдбрд╛ 05 рдордзрд▓реЗ рд╕рдЧрд│реЗ, flags рдореНрд╣рдгреВрди рдЯрд╛рдЗрдк рдХрд░рдгреНрдпрд╛рдРрд╡рдЬреА рдПрдХрд╛ file рдордзреНрдпреЗ рдЬрд╛рд╣реАрд░ рдХреЗрд▓реЗрд▓реЗ. рдЦрд▒реНрдпрд╛ files:
- compose.yml тАФ рдЯреЗрдмрд▓рдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛:
web+proxy - proxy/nginx.conf тАФ proxy рдирд╛рд╡рд╛рдиреЗ
http://web:3000рдХрдбреЗ рдкреБрдвреЗ рдкрд╛рдард╡рддреЛ
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдХрд╛рд▓ рддреБрдореНрд╣реА рдЬреЗрд╡рдгрд╛рдЪреЗ рдЯреЗрдмрд▓ рд╣рд╛рддрд╛рдиреЗ рдорд╛рдВрдбрд▓реЗ: network рдмрдирд╡рд╛, рдбрдмрд╛ 1 рд╣реЗ flags рджреЗрдКрди рдЪрд╛рд▓рд╡рд╛, рдбрдмрд╛ 2 рддреЗ flags рджреЗрдКрди рдЪрд╛рд▓рд╡рд╛, fridge рдЬреЛрдбрд╛тАж 15 рдорд┐рдирд┐рдЯреЗ flags рдЯрд╛рдЗрдк рдХрд░рдгреЗ, рдЖрдгрд┐ рддреБрдордЪреА рд╕рд╣рдХрд╛рд░реА рддреЗ рдереЛрдбреЗ рд╡реЗрдЧрд│реЗ рдХрд░рддреЗ рдЖрдгрд┐ рдХрд╛рд╣реАрдЪ рдЪрд╛рд▓рдд рдирд╛рд╣реА. ЁЯШй
Compose рдореНрд╣рдгрдЬреЗ laminate рдХреЗрд▓реЗрд▓рд╛ рдЯреЗрдмрд▓рдЪрд╛ рдЖрд░рд╛рдЦрдбрд╛ ЁЯН╜я╕П: рдПрдХ рдХрд╛рдЧрдж рдЬреЛ рд╕рд╛рдВрдЧрддреЛ "рдпрд╛ рдЯреЗрдмрд▓рд╡рд░ рдПрдХ web рдбрдмрд╛ рдЖрдгрд┐ рдПрдХ proxy рдбрдмрд╛ рдЖрд╣реЗ, рддреЗ intercom рд╡рд╛рдЯреВрди рдШреЗрддрд╛рдд, рдлрдХреНрдд proxy рд▓рд╛ рд╡рд╛рдврд╛рдпрдЪреА рдЦрд┐рдбрдХреА рдЖрд╣реЗ, рд╣рд╛ fridge рдЖрд╣реЗ." рдордЧ:
docker compose upтАФ рд╕рдВрдкреВрд░реНрдг рдЯреЗрдмрд▓, рдХрд╛рдврд▓реЗрд▓реНрдпрд╛ рдЖрд░рд╛рдЦрдбреНрдпрд╛рдкреНрд░рдорд╛рдгреЗ рдЕрдЧрджреА рддрд╕реЗрдЪ, рд╣рдЬрд░ рд╣реЛрддреЗ. тЬиdocker compose downтАФ рд╕рдВрдкреВрд░реНрдг рдЯреЗрдмрд▓ рдирд╛рд╣реАрд╕реЗ рд╣реЛрддреЗ.- рддреБрдордЪреА рд╕рд╣рдХрд╛рд░реА рддреАрдЪ file рдЪрд╛рд▓рд╡рддреЗ тЖТ рдЕрдЧрджреА рддрд╕реЗрдЪ рдЯреЗрдмрд▓. Laptops рдордзреНрдпреЗ рдХреЛрдгрддрд╛рд╣реА рдлрд░рдХ рдкрдбрдд рдирд╛рд╣реА. (рд╡рд┐рд╖рдп рдУрд│рдЦрд▓рд╛? рдЬрд╛рд╣реАрд░ рдХреЗрд▓реЗрд▓реА state > рдЯрд╛рдЗрдк рдХреЗрд▓реЗрд▓реНрдпрд╛ commands тАФ ArgoCD рдХреЛрд░реНрд╕рдордзреНрдпреЗ GitOps рд╣реАрдЪ рдХрд▓реНрдкрдирд╛ рд╕рдВрдкреВрд░реНрдг clusters рд▓рд╛ рд▓рд╛рдЧреВ рдХрд░рддреЗ.)
рдЖрдкрд▓реЗ рдЯреЗрдмрд▓: proxy рд╣рд╛ рдПрдХрдореЗрд╡ рдЦрд┐рдбрдХреА рдЕрд╕рд▓реЗрд▓рд╛ рдбрдмрд╛ рдЖрд╣реЗ (8080:80); рддреЛ
рд╕рдЧрд│реНрдпрд╛рдВрдирд╛ рдирд╛рд╡рд╛рдиреЗ web рдХрдбреЗ рдкрд╛рдард╡рддреЛ. web рд▓рд╛ рд╕реНрд╡рддрдГрд▓рд╛ рдХреЛрдгрддреАрд╣реА рдЦрд┐рдбрдХреА рдирд╛рд╣реА тАФ рддреЛ
рдлрдХреНрдд proxy рдорд╛рд░реНрдлрддрдЪ рдкреЛрд╣реЛрдЪрддрд╛ рдпреЗрддреЛ, рдЬрд╕реЗ рдХрд╛рдЙрдВрдЯрд░рдорд╛рдЧрдЪреЗ рд╕реНрд╡рдпрдВрдкрд╛рдХрдШрд░.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
yml["ЁЯУД compose.yml<br/>the table plan"]
subgraph table["ЁЯН╜я╕П one shared network, auto-created"]
proxy["ЁЯУж proxy - nginx<br/>ЁЯкЯ the ONLY window :8080"]
web["ЁЯУж web - our app<br/>no window, name-only"]
proxy -->|"http://web:3000<br/>by service NAME"| web
end
you["ЁЯзСтАНЁЯТ╗ you"]
yml -->|"1 docker compose up --build"| table
you -->|"2 localhost:8080"| proxy
тЭУ рдХрд╛рдп
services:тАФ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдВрдж рдПрдХ container рдмрдирддреЗ; service рдЪреЗ рдирд╛рд╡ рд╣реЗрдЪ рдЖрдкреЛрдЖрдк рдмрдирд▓реЗрд▓реНрдпрд╛ network рд╡рд░рдЪреЗ рддреНрдпрд╛рдЪреЗ DNS рдирд╛рд╡.build: ./appрд╡рд┐рд░реБрджреНрдзimage: nginx:alpineтАФ рдЖрдкрд▓реЗ рд╕реНрд╡рддрдГ рдмрдирд╡рд╛, рддреНрдпрд╛рдВрдЪреЗ рд╡рд┐рдХрдд рдШреНрдпрд╛.ports:рдлрдХреНрдд рдЬрд┐рдереЗ рдмрд╛рд╣реЗрд░рдЪреЗ рдЬрдЧ рдЖрдд рдпреЗрддреЗ рддрд┐рдереЗрдЪ; рдЖрддрд▓реНрдпрд╛ services рдЦрд┐рдбрдХреАрд╡рд┐рдирд╛ рд░рд╛рд╣рддрд╛рдд (рд╣рд▓реНрд▓реНрдпрд╛рдЪреА рдЬрд╛рдЧрд╛ рдХрдореА тАФ hygiene, рдзрдбрд╛ 08!).volumes:тАФ рдЖрдкрд▓рд╛ proxy рдЖрдкрд▓реА config read-only (:ro) bind-mount рдХрд░рддреЛ.depends_on:тАФ рд╕реБрд░реВ рд╣реЛрдгреНрдпрд╛рдЪрд╛ рдХреНрд░рдо (proxy рдЖрдзреА web). Start тЙа ready тАФ рдЦрд░реА рддрдпрд╛рд░реА k8s probes рдиреАрдЯ рд╕реЛрдбрд╡рддрд╛рдд (k8s рдХреЛрд░реНрд╕, рдзрдбрд╛ 07).- рд░реЛрдЬрдЪреА рдХреНрд░рд┐рдпрд╛рдкрджреЗ:
up --build,down,ps,logs -f web,exec web sh.
ЁЯза Compose рд╣рд╡реА рдЕрд╕рд▓реЗрд▓реА application рд░рдЪрдирд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ
compose.yml
web
тФЬтФАтФА depends_on тЖТ api
тФВ тФФтФАтФА db
тФФтФАтФА network: app-net (everyone by name)
рддреБрдореНрд╣реА рд░реЛрдЬ рдЯрд╛рдЗрдк рдХрд░рд╛рд▓ рдЕрд╢рд╛ рдкрд╛рдЪ commands:
docker compose up -d # create + start the whole table, detached
docker compose ps # who's up
docker compose logs -f # everyone's output, tailed
docker compose exec web sh # a shell inside one service
docker compose down # stop + remove (add -v to drop volumes)
depends_onрдлрдХреНрдд рд╕реБрд░реВ рд╣реЛрдгреНрдпрд╛рдЪрд╛ рдХреНрд░рдо рдард░рд╡рддреЗ. рддреНрдпрд╛рдЪрд╛ рдЕрд░реНрде dependency traffic рд╕реНрд╡реАрдХрд╛рд░рд╛рдпрд▓рд╛ рддрдпрд╛рд░ рдЖрд╣реЗ рдЕрд╕рд╛ рдирд╛рд╣реА тАФdb"рд╕реБрд░реВ" рдЭрд╛рд▓реЗрд▓рд╛ рдЕрд╕реВрди рдЕрдЬреВрди initialize рд╣реЛрдд рдЕрд╕реВ рд╢рдХрддреЛ. рддрдпрд╛рд░реАрд╕рд╛рдареАhealthcheck+condition: service_healthyрд╡рд╛рдкрд░рд╛, рдХрд┐рдВрд╡рд╛ ре▓рдкрд▓рд╛ retry рдХрд░рд╛рдпрд▓рд╛ рд▓рд╛рд╡рд╛. (Kubernetes рд╣рд╛рдЪ рдкреНрд░рд╢реНрди readiness probes рдиреЗ рд╕реЛрдбрд╡рддреЗ.)
ЁЯдФ рдХрд╛
Compose рдордзреНрдпреЗ "рдорд╛рдЭрд╛ dev setup" git рдордзрд▓реА рдПрдХ file рдмрдирддреЛ тАФ review рдХрд░рддрд╛ рдпреЗрдгрд╛рд░реА, рд╢реЗрдЕрд░ рдХрд░рддрд╛ рдпреЗрдгрд╛рд░реА, versioned. Kubernetes рдХрдбреЗ рдЬрд╛рдгрд╛рд░рд╛ рд╣рд╛ рд╕рд░реНрд╡реЛрддреНрддрдо рдорд╛рдирд╕рд┐рдХ рдкреВрд▓рд╣реА рдЖрд╣реЗ: Compose service тЙИ Deployment + Service, рд╕рд╛рдорд╛рдпрд┐рдХ network тЙИ cluster DNS. рд▓рд╣рд╛рди рд╢рд╛рд│рд╛ рд╢рд┐рдХрд╛, рдореНрд╣рдгрдЬреЗ рдореЛрдареА рд╢рд╛рд│рд╛ рдУрд│рдЦреАрдЪреА рд╡рд╛рдЯреЗрд▓.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
docker compose up --build # the whole table, one command
# open http://localhost:8080 # тЖТ proxy тЖТ web, by name ЁЯОЙ
curl localhost:8080 # ЁЯН▒ hello from <web's container id>
curl localhost:3000 || echo "web has NO window тАФ exactly as planned ЁЯЩЕ"
docker compose ps # the table's seating chart
docker compose logs -f web # one box's diary (Ctrl+C)
docker compose down # table vanishes, nothing left behind
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
depends_on= рд╕реБрд░реВ рд╣реЛрдгреНрдпрд╛рдЪрд╛ рдХреНрд░рдо, рддрдпрд╛рд░реА рдирд╛рд╣реА тАФ ре▓рдкрдиреЗ retry рдХрд░рд╛рдпрд▓рд╛ рд╣рд╡реЗ рдХрд┐рдВрд╡рд╛ healthchecks рд╡рд╛рдкрд░рд╛рдпрд▓рд╛ рд╣рд╡реЗрдд- рдкреНрд░рддреНрдпреЗрдХ service рдЪрд╛ port host рд▓рд╛ рдЙрдШрдбрд╛ рдХрд░рдгреЗ тАФ рдлрдХреНрдд рдкреБрдврдЪреНрдпрд╛ рджрд╛рд░рд╛рд▓рд╛
ports:рд▓рд╛рдЧрддрд╛рдд - рдЪреБрдХреАрдЪреНрдпрд╛ directory рдордзреНрдпреЗ
docker compose down -vтАФ рддреЛ рддреНрдпрд╛ project рдЪреЗ volumes delete рдХрд░рддреЛ
тПня╕П рдкреБрдвреЗ
рдЖрдкрд▓реА image рд▓рд╣рд╛рди рдЖрд╣реЗ рдХрд╛рд░рдг ре▓рдкрд▓рд╛ рд╢реВрдиреНрдп dependencies рдЖрд╣реЗрдд. рдЦрд▒реНрдпрд╛ ре▓рдкреНрд╕рдордзреНрдпреЗ build рдкрд╛рдпрд▒реНрдпрд╛ рдЖрдгрд┐ рдЬрдб tools рдЕрд╕рддрд╛рдд тАФ рдЖрдгрд┐ рддрд░реАрд╣реА images рдЫреЛрдЯреНрдпрд╛ рдареЗрд╡рдгреНрдпрд╛рдЪреА рдПрдХ рдпреБрдХреНрддреА рдЖрд╣реЗ: multi-stage builds.
git checkout lesson-07-multi-stage