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

ЁЯН╜я╕П рдзрдбрд╛ 04 тАФ Containers рдЪрд╛рд▓рд╡рдгреЗ: рдЬреЗрд╡рдгрд╛рдЪреА рд╡реЗрд│

ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 04 ┬╖ рдорд╛рдЧреЗ: lesson-03-dockerfile ┬╖ рдкреБрдвреЗ: lesson-05-volumes-networks


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

рдзрдбреЗ 01тАУ03, рдЖрдгрд┐ рддреНрдпрд╛рд╢рд┐рд╡рд╛рдп: рд░реЛрдЬрдЪреА рдХреНрд░рд┐рдпрд╛рдкрджреЗ тАФ run, ps, logs, exec, stop, rm тАФ рдЖрдгрд┐ рддреБрдореНрд╣реА рдХрд╛рдпрдо рдЯрд╛рдЗрдк рдХрд░рд╛рд▓ рдЕрд╕реЗ рджреЛрди flags: -p рдЖрдгрд┐ -e.

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

рдЬреЗрд╡рдгрд╛рдЪреА рд╡реЗрд│! ЁЯН╜я╕П рдбрдмреЗ рдЙрдШрдбрдгреНрдпрд╛рдЪреЗ рдХрд╛рд╣реА рдирд┐рдпрдо рдЖрд╣реЗрдд:

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

flowchart LR
    img["ЁЯзК image<br/>hello-school:v1"]
    c["ЁЯПГ container<br/>node server.js as PID 1<br/>own filesystem + network"]
    win["ЁЯкЯ -p 3000:3000<br/>laptop:3000 тЖТ box:3000"]
    tools["ЁЯСА daily verbs<br/>logs ┬╖ exec ┬╖ stop ┬╖ rm"]
    img -->|"1 docker run<br/>-e APP_VERSION=v2"| c
    win -->|"2 the only way in"| c
    tools -.->|"3 watch, enter, end"| c

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

ЁЯза Container рдЪреЗ рдЬреАрд╡рдирдЪрдХреНрд░

docker create  тЖТ  created
docker start   тЖТ  running
docker stop    тЖТ  stopped   (process gone, filesystem kept)
docker rm      тЖТ  removed   (container gone)

рдирд╡рд╢рд┐рдХреЗ рдЧреЛрдВрдзрд│рддрд╛рдд рдЕрд╢реА рддреАрди рдХреНрд░рд┐рдпрд╛рдкрджреЗ:

docker stop  = stop the process        (container still exists)
docker rm    = remove the container    (its writable layer is gone)
docker rmi   = remove the IMAGE        (the template, from your machine)

docker run = рдПрдХрд╛рдЪ рдлрдЯрдХреНрдпрд╛рдд create + start. docker ps -a рддреБрдореНрд╣реА рд╡рд┐рд╕рд░рд▓реЗрд▓реЗ рдерд╛рдВрдмрд▓реЗрд▓реЗ containers рджрд╛рдЦрд╡рддреЗ; docker system df рдпрд╛ рд╕рдЧрд│реНрдпрд╛рд▓рд╛ disk рд╡рд░ рдХрд┐рддреА рдЬрд╛рдЧрд╛ рд▓рд╛рдЧрддреЗ рддреЗ рджрд╛рдЦрд╡рддреЗ.

ЁЯдФ рдХрд╛

рд╣реА рдХреНрд░рд┐рдпрд╛рдкрджреЗ рдореНрд╣рдгрдЬреЗрдЪ рдкреБрдврдЪреНрдпрд╛ рд╕рдЧрд│реНрдпрд╛рд╕рд╛рдареА рддреБрдордЪрд╛ debugging toolkit: Kubernetes рдордзрд▓рд╛ crash рд╣реЛрдгрд╛рд░рд╛ pod рдпрд╛рдЪ рдХрд▓реНрдкрдирд╛рдВрдиреА рддрдкрд╛рд╕рд▓рд╛ рдЬрд╛рддреЛ (kubectl logs, kubectl exec рд╣реЗ рдЕрдХреНрд╖рд░рд╢рдГ рдЪреБрд▓рддрднрд╛рдК рдЖрд╣реЗрдд). рдЖрдгрд┐ PID-1/SIGTERM рдЪреНрдпрд╛ рдЧреЛрд╖реНрдЯреАрдореБрд│реЗрдЪ рдЖрдкрд▓рд╛ server.js SIGTERM рд╣рд╛рддрд╛рд│рддреЛ тАФ рд╣рд╛рдЪ handler k8s рдХреЛрд░реНрд╕рдордзреНрдпреЗ zero-downtime rollouts рд╕реБрд░рд│реАрдд рдХрд░рддреЛ.

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

app/server.js рдкреНрд░рддреНрдпреЗрдХ request log рдХрд░рддреЛ (docker logs рд╕рд╛рдареА), рдЖрдкрд▓реЗ version рдЫрд╛рдкрддреЛ (-e рд╕рд╛рдареА), рдЖрдгрд┐ SIGTERM рд╣рд╛рддрд╛рд│рддреЛ (docker stop рд╕рд╛рдареА). рддреЛ рдЕрдЧрджреА рдпрд╛рдЪ рдзрдбреНрдпрд╛рд╕рд╛рдареАрдЪреЗ рдЦреЗрд│рд╛рдЪреЗ рдореИрджрд╛рди рдЖрд╣реЗ.

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

docker build -t hello-school:v1 app/

# background + named + windowed + note-on-the-lid:
docker run -d --name lunch -p 3000:3000 -e APP_VERSION=lunch-time hello-school:v1
curl localhost:3000                       # version: lunch-time
curl localhost:3000                       # visits: 2 тАФ state lives IN the box

docker logs -f lunch                      # the diary (Ctrl+C to stop following)
docker exec -it lunch sh                  # climb in: ls, ps, cat server.js, exit

docker stop lunch                         # watch the diary say "bye ЁЯСЛ" (SIGTERM!)
docker rm lunch                           # throw the box away
docker run --rm -p 3000:3000 hello-school:v1   # visits: 1 again тАФ new box, fresh memory

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

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

"рдирд╡рд╛ рдбрдмрд╛, рддрд╛рдЬреА рд╕реНрдореГрддреА" ре▓рдкреНрд╕рд╕рд╛рдареА рдЫрд╛рди, рдкрдг data рд╕рд╛рдареА рднрдпрдВрдХрд░. рдЖрдгрд┐ рджреЛрди рдбрдмреЗ рдПрдХрдореЗрдХрд╛рдВрд╢реА рдХрд╕реЗ рдмреЛрд▓рддрд╛рдд? Volumes рдЖрдгрд┐ networks.

git checkout lesson-05-volumes-networks

ЁЯН╜я╕П Lesson 04 тАФ Running containers: lunch time

ЁЯУН You are here: Lesson 04 of 12 ┬╖ Previous: lesson-03-dockerfile ┬╖ Next: lesson-05-volumes-networks


ЁЯУж What's in this branch

Lessons 01тАУ03, plus: the daily verbs тАФ run, ps, logs, exec, stop, rm тАФ and the two flags you'll type forever: -p and -e.

ЁЯзТ Explain like I'm 5

Lunch time! ЁЯН╜я╕П Opening boxes has rules:

ЁЯЧ║я╕П Diagram

flowchart LR
    img["ЁЯзК image<br/>hello-school:v1"]
    c["ЁЯПГ container<br/>node server.js as PID 1<br/>own filesystem + network"]
    win["ЁЯкЯ -p 3000:3000<br/>laptop:3000 тЖТ box:3000"]
    tools["ЁЯСА daily verbs<br/>logs ┬╖ exec ┬╖ stop ┬╖ rm"]
    img -->|"1 docker run<br/>-e APP_VERSION=v2"| c
    win -->|"2 the only way in"| c
    tools -.->|"3 watch, enter, end"| c

тЭУ What

ЁЯза The container lifecycle

docker create  тЖТ  created
docker start   тЖТ  running
docker stop    тЖТ  stopped   (process gone, filesystem kept)
docker rm      тЖТ  removed   (container gone)

Three verbs beginners mix up:

docker stop  = stop the process        (container still exists)
docker rm    = remove the container    (its writable layer is gone)
docker rmi   = remove the IMAGE        (the template, from your machine)

docker run = create + start in one go. docker ps -a shows the stopped ones you forgot; docker system df shows what all of it costs on disk.

ЁЯдФ Why

These verbs ARE your debugging toolkit for everything later: a crashing pod in Kubernetes is investigated with the same ideas (kubectl logs, kubectl exec are literal cousins). And the PID-1/SIGTERM story is why our server.js handles SIGTERM тАФ the same handler that makes zero-downtime rollouts graceful in the k8s course.

ЁЯФз How (in this repo)

app/server.js logs every request (for docker logs), prints its version (for -e), and handles SIGTERM (for docker stop). It's a playground for exactly this lesson.

ЁЯзк Try it

docker build -t hello-school:v1 app/

# background + named + windowed + note-on-the-lid:
docker run -d --name lunch -p 3000:3000 -e APP_VERSION=lunch-time hello-school:v1
curl localhost:3000                       # version: lunch-time
curl localhost:3000                       # visits: 2 тАФ state lives IN the box

docker logs -f lunch                      # the diary (Ctrl+C to stop following)
docker exec -it lunch sh                  # climb in: ls, ps, cat server.js, exit

docker stop lunch                         # watch the diary say "bye ЁЯСЛ" (SIGTERM!)
docker rm lunch                           # throw the box away
docker run --rm -p 3000:3000 hello-school:v1   # visits: 1 again тАФ new box, fresh memory

тЪая╕П Common mistakes

тПня╕П Next

"New box, fresh memory" is great for apps, terrible for data. And how do TWO boxes talk to each other? Volumes & networks.

git checkout lesson-05-volumes-networks
тЖР PreviousdockerfileNext тЖТvolumes networks

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