ЁЯПл The SchoolтА║ЁЯН▒ DockerтА║ЁЯН▒ рдзрдбрд╛ 01 тАФ рдХрдВрдЯреЗрдирд░ рдХрд╛: "рдорд╛рдЭреНрдпрд╛ рдорд╢реАрдирд╡рд░ рдЪрд╛рд▓рддреЗ" рдЪрд╛ рд╢реЗрд╡рдЯ
ЁЯЦ╝я╕П See the drawing + lab ЁЯПа Course home ЁЯМ┐ Branch on GitHub тЬПя╕П View source
ЁЯЦ╝я╕П рдЖрдХреГрддреА рдЖрдгрд┐ labThe drawing + lab рдкреВрд░реНрдг рдкрд╛рдирд╛рд╡рд░ рдЙрдШрдбрд╛ тЖЧOpen full page тЖЧ

ЁЯН▒ рдзрдбрд╛ 01 тАФ рдХрдВрдЯреЗрдирд░ рдХрд╛: "рдорд╛рдЭреНрдпрд╛ рдорд╢реАрдирд╡рд░ рдЪрд╛рд▓рддреЗ" рдЪрд╛ рд╢реЗрд╡рдЯ

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 01 ┬╖ рдкреБрдвреЗ: lesson-02-images-layers


ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ

рд╕рдЧрд│реНрдпрд╛рдЪрд╛ рдкрд╛рдпрд╛: рдХрдВрдЯреЗрдирд░ рдореНрд╣рдгрдЬреЗ рдХрд╛рдп рдЖрдгрд┐ рддреЛ рдХрд╛ рдЖрд╣реЗ. рдЦрд▒реНрдпрд╛ files:

ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ

рддреБрдордЪреЗ ре▓рдк рддреБрдордЪреНрдпрд╛ laptop рд╡рд░ рдорд╕реНрдд рдЪрд╛рд▓рддреЗ. рддреБрдореНрд╣реА рддреЗ рдореИрддреНрд░рд┐рдгреАрд▓рд╛ рдкрд╛рдард╡рддрд╛тАж ЁЯТе crash. рддрд┐рдЪреНрдпрд╛ laptop рд╡рд░ Node 14 рдЖрд╣реЗ, рддреБрдордЪреНрдпрд╛рдХрдбреЗ Node 20. рддрд┐рдЪреНрдпрд╛рдХрдбреЗ рдПрдХ library рдирд╛рд╣реА. рддрд┐рдЪреЗ paths рд╡реЗрдЧрд│реЗ рдЖрд╣реЗрдд. рдУрд│рдЦреАрдЪреЗ рд╡рд╛рдЯрддреЗ рдирд╛? ЁЯШд

рдЖрддрд╛ рдХрд▓реНрдкрдирд╛ рдХрд░рд╛, рддреБрдордЪреА рдЖрдИ рддреБрдореНрд╣рд╛рд▓рд╛ рдбрдмрд╛ ЁЯН▒ рднрд░реВрди рджреЗрддреЗ тАФ рднрд╛рдд, рдЖрдордЯреА, рдЪрдордЪрд╛, рд░реБрдорд╛рд▓, рддреБрдореНрд╣рд╛рд▓рд╛ рд▓рд╛рдЧрдгрд╛рд░реЗ рд╕рдЧрд│реЗ, рдбрдмреНрдпрд╛рдЪреНрдпрд╛ рдЖрдд. рддреЛ рдбрдмрд╛ рдХреЛрдгрд╛рдЪреНрдпрд╛рд╣реА рдШрд░реА рдЙрдШрдбрд▓рд╛ рддрд░реА рдХрд╛рд╣реА рдлрд░рдХ рдкрдбрдд рдирд╛рд╣реА: рдЬреЗрд╡рдг рдЕрдЧрджреА рддреЗрдЪ рдЕрд╕рддреЗ.

рдХрдВрдЯреЗрдирд░ рдореНрд╣рдгрдЬреЗ рддреБрдордЪреНрдпрд╛ program рд╕рд╛рдареАрдЪрд╛ рдбрдмрд╛: ре▓рдк + Node 20 + libraries

рдЕрдЬреВрди рдПрдХ рдЧреБрдкрд┐рдд: рд╣рд╛ рд╕рдВрдЧрдгрдХрд╛рдЪреНрдпрд╛ рдЖрддрд▓рд╛ рдЫреЛрдЯрд╛ рд╕рдВрдЧрдгрдХ рдирд╛рд╣реА (рддреЛ рдЕрд╕рддреЛ virtual machine тАФ рдЯреНрд░рдХрдордзреВрди рдкрд╛рдард╡рд▓реЗрд▓реЗ рд╕рдВрдкреВрд░реНрдг рдШрд░ ЁЯЪЪ). рдХрдВрдЯреЗрдирд░ рддреБрдордЪреНрдпрд╛ рдорд╢реАрдирдЪрд╛ Linux kernel рд╡рд╛рдЯреВрди рдШреЗрддреЛ рдЖрдгрд┐ рдлрдХреНрдд ре▓рдкрд▓рд╛ рд╡реЗрдЧрд│реЗ рдареЗрд╡рддреЛ тАФ рдореНрд╣рдгреВрдирдЪ рддреЛ milliseconds рдордзреНрдпреЗ рд╕реБрд░реВ рд╣реЛрддреЛ рдЖрдгрд┐ рддреНрдпрд╛рдЪреЗ рд╡рдЬрди gigabytes рдирд╡реНрд╣реЗ рддрд░ megabytes рдЕрд╕рддреЗ.

ЁЯЧ║я╕П рдЖрдХреГрддреА

flowchart LR
    loose["ЁЯШд unpacked app<br/>works here, crashes there"]
    box["ЁЯН▒ container<br/>app + runtime + libs + config<br/>ALL inside the box"]
    a["ЁЯТ╗ laptop A тЬЕ"]
    b["ЁЯТ╗ laptop B тЬЕ"]
    c["тШБя╕П AWS server тЬЕ"]
    loose -->|"1 pack everything"| box
    box -->|"2 identical"| a
    box -->|"2 identical"| b
    box -->|"2 identical"| c

тЭУ рдХрд╛рдп

ЁЯза Container тЙа virtual machine

VM          App тЖТ libraries тЖТ GUEST OS тЖТ hypervisor тЖТ host
Container   App тЖТ libraries тЖТ container runtime тЖТ HOST kernel

рдХрдВрдЯреЗрдирд░ application рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ user-space dependencies (libraries, runtime, config) рдкреЕрдХ рдХрд░рддреЛ тАФ рддреЛ рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ host рдЪрд╛ kernel рд╡рд╛рдЯреВрди рдШреЗрддреЛ. рдбрдмреНрдпрд╛рдЪреНрдпрд╛ рдЖрдд рдХреЛрдгрддреАрд╣реА "рдЫреЛрдЯреА operating system" рдирд╕рддреЗ; рдореНрд╣рдгреВрдирдЪ рддреЛ milliseconds рдордзреНрдпреЗ рд╕реБрд░реВ рд╣реЛрддреЛ рдЖрдгрд┐ megabytes рдЗрддрдХрд╛рдЪ рдЕрд╕рддреЛ. рдиреЗрдордХреЗ рд╕рд╛рдВрдЧрд╛рдпрдЪреЗ рддрд░: рддреАрдЪ image рдкреНрд░рддреНрдпреЗрдХ рдорд╢реАрдирд╡рд░ рд╕реБрд╕рдВрдЧрдд application environment рджреЗрддреЗ тАФ рдЦрд╛рд▓рдЪрд╛ kernel, CPU architecture рдЖрдгрд┐ Docker version рдорд╛рддреНрд░ рддрд░реАрд╣реА рд╡реЗрдЧрд│реЗ рдЕрд╕реВ рд╢рдХрддрд╛рдд.

ЁЯдФ рдХрд╛

рдпрд╛ trilogy рдордзрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ tool рдпрд╛рд╡рд░рдЪ рдЙрднреЗ рдЖрд╣реЗ: Kubernetes containers schedule рдХрд░рддреЗ, ECR container images рд╕рд╛рдард╡рддреЗ, ArgoCD рдЕрд╕реЗ manifests deploy рдХрд░рддреЗ рдЬреЗ containers рдЪрд╛рд▓рд╡рддрд╛рдд. рдбрдмреНрдпрд╛рдЪреА рдХрд▓реНрдкрдирд╛ рдкрдХреНрдХреА рдЭрд╛рд▓реА, рдХреА рдкреБрдврдЪреЗ рд╕рдЧрд│реЗ рдлрдХреНрдд рд╡рд╛рд╣рддреБрдХреАрдЪреЗ рдХрд╛рдо рдЖрд╣реЗ. ЁЯЪЪ

ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)

app/server.js рдореБрджреНрджрд╛рдо dependency-free рдареЗрд╡рд▓реЗ рдЖрд╣реЗ тАФ рдПрдХ file, рд╕рд╛рдзрд╛ Node. рддреЗ рдЖрдкрд▓реНрдпрд╛ hostname рдиреЗ рдЙрддреНрддрд░ рджреЗрддреЗ, рдореНрд╣рдгрдЬреЗ рдкреБрдвреЗ рддреБрдореНрд╣реА 3 рдкреНрд░рддреА рдЪрд╛рд▓рд╡рд╛рд▓ рддреЗрд╡реНрд╣рд╛ рдХреЛрдгрддреНрдпрд╛ рдбрдмреНрдпрд╛рдиреЗ рдЙрддреНрддрд░ рджрд┐рд▓реЗ рддреЗ рдкреНрд░рддреНрдпрдХреНрд╖ рджрд┐рд╕реЗрд▓. рд╣реА рдЫреЛрдЯреА рдпреБрдХреНрддреА рддрд┐рдиреНрд╣реА рдХреЛрд░реНрд╕рдордзреНрдпреЗ рдкреБрдвреЗ рдЪрд╛рд▓рдд рд░рд╛рд╣рддреЗ.

ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛

# 0) install Docker Desktop, then prove the pain is real:
node app/server.js          # works IF you happen to have Node 20... maybe you don't!
                            # ^ that's exactly the problem containers solve

# 1) now the lunchbox way тАФ no Node needed on your machine at all:
docker run --rm -p 3000:3000 -v "$PWD/app":/app -w /app node:20-alpine node server.js
curl localhost:3000         # ЁЯН▒ hello from <container-id>

# 2) peek behind the curtain:
docker ps                   # your running box
docker version              # client + engine

тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛

тПня╕П рдкреБрдвреЗ

рдЖрдкрдг рдЖрддреНрддрд╛ рд╡рд╛рдкрд░рд▓реЗрд▓реА рддреА node:20-alpine рдЧреЛрд╖реНрдЯ рдореНрд╣рдгрдЬреЗ image тАФ рдПрдХрд╛рд╡рд░ рдПрдХ рд░рдЪрд▓реЗрд▓реНрдпрд╛ рдерд░рд╛рдВрдиреА рдмрдирд▓реЗрд▓рд╛ рдЧреЛрдард╡рд▓реЗрд▓рд╛ рдбрдмрд╛. рдЖрддрд╛ рдХреЗрдХрдЪреА рдУрд│рдЦ рдХрд░реВрди рдШреЗрдКрдпрд╛. ЁЯОВ

git checkout lesson-02-images-layers

ЁЯН▒ Lesson 01 тАФ Why containers: the end of "works on my machine"

ЁЯУН You are here: Lesson 01 of 12 ┬╖ Next: lesson-02-images-layers


ЁЯУж What's in this branch

The foundation of everything: what a container is and why it exists. Real files:

ЁЯзТ Explain like I'm 5

Your app runs great on YOUR laptop. You send it to a friendтАж ЁЯТе crash. Their laptop has Node 14, yours has Node 20. They're missing a library. Their paths are different. Sound familiar? ЁЯШд

Now imagine your mom packs you a lunchbox ЁЯН▒ тАФ rice, curry, spoon, napkin, everything you need, inside the box. It doesn't matter whose house you open it in: lunch is identical.

A container is a lunchbox for your program: the app + Node 20 + libraries

One more secret: it's NOT a mini-computer-in-a-computer (that's a virtual machine тАФ an entire house shipped in a truck ЁЯЪЪ). A container shares your machine's Linux kernel and just isolates the app тАФ which is why it starts in milliseconds and weighs megabytes, not gigabytes.

ЁЯЧ║я╕П Diagram

flowchart LR
    loose["ЁЯШд unpacked app<br/>works here, crashes there"]
    box["ЁЯН▒ container<br/>app + runtime + libs + config<br/>ALL inside the box"]
    a["ЁЯТ╗ laptop A тЬЕ"]
    b["ЁЯТ╗ laptop B тЬЕ"]
    c["тШБя╕П AWS server тЬЕ"]
    loose -->|"1 pack everything"| box
    box -->|"2 identical"| a
    box -->|"2 identical"| b
    box -->|"2 identical"| c

тЭУ What

ЁЯза Container тЙа virtual machine

VM          App тЖТ libraries тЖТ GUEST OS тЖТ hypervisor тЖТ host
Container   App тЖТ libraries тЖТ container runtime тЖТ HOST kernel

A container packages the application and its user-space dependencies (libraries, runtime, config) тАФ it normally shares the host's kernel. There is no "little operating system" inside the box; that's why it starts in milliseconds and weighs megabytes. Precisely: the same image produces a consistent application environment across machines тАФ the kernel, CPU architecture and Docker version underneath can still differ.

ЁЯдФ Why

Every tool in the trilogy stands on this: Kubernetes schedules containers, ECR stores container images, ArgoCD deploys manifests that run containers. If the lunchbox idea is solid, everything later is just logistics. ЁЯЪЪ

ЁЯФз How (in this repo)

app/server.js is deliberately dependency-free тАФ one file, plain Node. It answers with its hostname, so when you later run 3 copies you can literally see which box replied. That little trick carries through all three courses.

ЁЯзк Try it

# 0) install Docker Desktop, then prove the pain is real:
node app/server.js          # works IF you happen to have Node 20... maybe you don't!
                            # ^ that's exactly the problem containers solve

# 1) now the lunchbox way тАФ no Node needed on your machine at all:
docker run --rm -p 3000:3000 -v "$PWD/app":/app -w /app node:20-alpine node server.js
curl localhost:3000         # ЁЯН▒ hello from <container-id>

# 2) peek behind the curtain:
docker ps                   # your running box
docker version              # client + engine

тЪая╕П Common mistakes

тПня╕П Next

That node:20-alpine thing we just used is an image тАФ a frozen lunchbox made of stacked layers. Time to meet the cake. ЁЯОВ

git checkout lesson-02-images-layers
тЖР Course homeall lessonsNext тЖТimages layers

This page is the lesson's README from the lesson-01-why-containers branch, shown here so the whole School stays on one site. Code files open on GitHub at the same branch.