{ "$schema": "../../../../tools/card-layouts/schemas/card-source.schema.json", "schema": "esc-card-source.v1", "card": { "id": "mpabi-inf-console-bash-08-docker", "series": "console-bash", "series_title": "Bash · Console Tools", "number": "08", "count": "08", "slug": "docker", "title": "L08 · Docker Fundamentals — image, container and storage", "topic": "Obraz, cykl życia kontenera, volume i bind mount", "project": "Warsztat terminalowy", "subject": "Informatyka", "level": "Rok 1 · Console", "revision_date": "2026-07-21T00:00:00+02:00", "status": "Gotowa do wykonania", "version": "v00.01", "uuid": "b6d3b00d-6912-502d-95d7-3ee47c60f1db", "author": "M. Pabiszczak", "year": "2026" }, "generated": {"tex": "doc/generated/main.tex", "html": "web/index.html", "html_css": "web/style.css", "react_app": true, "html_tree_inspector": false}, "template": "templates/karta-klasyczna.json", "title_block": { "category": "KARTA PRACY · INFORMATYKA · CONSOLE", "standard": "ISO 7200", "prepared_by": "M. Pabiszczak", "prepared_on": "21.07.2026", "checked_by": "testy automatyczne", "approved_by": "—", "url": "http://localhost:8080", "repository_url": "https://gitea.local/edu-inf/lab-console-docker", "revision": "1", "issued_on": "21.07.2026", "series": "CONSOLE-BASH-08", "document_type": "karta pracy", "tool": "card-layouts", "sheet": "1 / 1", "show_qr": false, "show_repository_qr": false, "height_cm": 3, "repeat_on_every_page": true, "replace_front_matter": true }, "front_page_scope": { "title": "Cel karty", "content_tex": "Uczeń rozróżnia image od container, przeprowadza cykl życia oraz wyjaśnia trwałość volume i bind mount. Test automatyczny działa jako jawny model offline i nie oznacza uruchomienia prawdziwego silnika.", "scope_title": "Zakres tasków", "scope_table": { "headers": ["Krok", "Numer tasku", "Najważniejsza idea", "Priorytet", "Status", "Version"], "rows": [ {"chapter": "8", "task": "Task01", "idea_tex": "Dockerfile, build, tag i digest", "priority": "obowiązkowe", "status": "ready", "version": "v00.01"}, {"chapter": "8", "task": "Task02", "idea_tex": "running, exited, removed", "priority": "obowiązkowe", "status": "ready", "version": "v00.01"}, {"chapter": "8", "task": "Task03", "idea_tex": "volume i bind mount", "priority": "obowiązkowe", "status": "ready", "version": "v00.01"} ] } }, "learning_effects": { "CB08.EN01": {"text": "Uczeń analizuje relację Dockerfile, image, tagu i digestu.", "label": "Image specification", "bloom_level": "Analiza", "assessment_criteria": ["CB08.KW01"]}, "CB08.EK01": {"text": "Uczeń przeprowadza cykl życia kontenera i rozróżnia mechanizmy trwałych danych.", "label": "Lifecycle and storage", "bloom_level": "Zastosowanie", "assessment_criteria": ["CB08.KW01"]} }, "assessment_criteria": { "CB08.KW01": {"text": "Poprawna specyfikacja image, przejścia running–exited–removed oraz trwałość volume i bind są potwierdzone; tryb offline i brak socketu są jawne.", "learning_effects": ["CB08.EN01", "CB08.EK01"]} }, "educational_requirements": { "CB08.WE01": { "text": "Bezpieczny model podstaw konteneryzacji.", "label": "Image, container i storage", "learning_effects": ["CB08.EN01", "CB08.EK01"], "learning_tree": { "schema": "we-learning-tree.v1", "policy": "Profil ucznia nie otrzymuje socketu engine. Automatyczny PASS pochodzi z audytowalnego modelu offline i nie jest przedstawiany jako rzeczywiste wykonanie Docker/Podman.", "ogolne": [{"tree_id": "CB08.WE01.OG.IP.01", "effect_ref": "CB08.EN01", "display": "EN IP CB08.01", "text": "Uczeń analizuje niezmienną specyfikację image.", "kw": [{"criterion_ref": "CB08.KW01", "display": "KW IP CB08.01", "text": "Wyjaśnia różnicę między tagiem i digestem."}]}], "zawodowe": [{"tree_id": "CB08.WE01.TECH.I4.01", "effect_ref": "CB08.EK01", "display": "EK INF04 CB08.01", "text": "Uczeń modeluje cykl życia i storage.", "kw": [{"criterion_ref": "CB08.KW01", "display": "KW INF04 CB08.01", "text": "Potwierdza stany i niezależność danych."}]}] } } }, "sections": [ { "title": "Task01 · Zbuduj specyfikację image", "content_kind": "prose", "content_tex": "Przygotuj minimalny Dockerfile, sprawdź cztery instrukcje i wylicz stabilny digest kontekstu. Tag jest nazwą, digest identyfikatorem treści.", "educational_requirement_refs": ["CB08.WE01"], "learning_effect_refs": ["CB08.EN01", "CB08.EK01"], "assessment_criterion_refs": ["CB08.KW01"], "area_tree_refs": ["CB08.WE01.OG.IP.01", "CB08.WE01.TECH.I4.01"], "steps": [{"id": "T01-IMAGE", "title": "Potwierdź składnię, 4 instrukcje, digest i offline-model.", "tree_refs": ["CB08.WE01.OG.IP.01"]}], "assets": [{"path": "assets/docker-model.png", "html_path": "assets/docker-model.svg", "caption": "Image jest specyfikacją; kontener ma własny cykl życia, a dane mogą żyć niezależnie.", "label": "fig:docker-model", "alt": "Diagram Dockerfile, image, container, volume i bind mount.", "kind": "diagram", "width": 0.72}] }, { "title": "Task02 · Cykl życia kontenera", "content_kind": "prose", "content_tex": "Uruchom instancję image, odczytaj stan running, zatrzymaj ją do exited, a następnie usuń. Stop nie jest tym samym co rm.", "educational_requirement_refs": ["CB08.WE01"], "learning_effect_refs": ["CB08.EN01", "CB08.EK01"], "assessment_criterion_refs": ["CB08.KW01"], "area_tree_refs": ["CB08.WE01.OG.IP.01", "CB08.WE01.TECH.I4.01"], "steps": [{"id": "T02-LIFECYCLE", "title": "Zmierz running, exited i removed.", "tree_refs": ["CB08.WE01.TECH.I4.01"]}] }, { "title": "Task03 · Volume i bind mount", "content_kind": "prose", "content_tex": "Zapisz dane w nazwanym volume i ścieżce bind. Po usunięciu kontenera oba zasoby pozostają; volume usuwa się osobno, a bind pozostaje własnością hosta.", "educational_requirement_refs": ["CB08.WE01"], "learning_effect_refs": ["CB08.EN01", "CB08.EK01"], "assessment_criterion_refs": ["CB08.KW01"], "area_tree_refs": ["CB08.WE01.OG.IP.01", "CB08.WE01.TECH.I4.01"], "steps": [{"id": "T03-STORAGE", "title": "Potwierdź trwałość i jawne usunięcie volume; zapisz trace.log.", "tree_refs": ["CB08.WE01.TECH.I4.01"]}] } ], "tasks": { "task01": {"prompt_tex": "Zbuduj specyfikację image z Dockerfile.", "criterion": "syntax=valid instructions=4 digest=sha256:* engine=offline-model socket_exposed=0", "assessment_criterion_ref": "CB08.KW01"}, "task02": {"prompt_tex": "Przeprowadź cykl życia kontenera.", "criterion": "running=1 inspected=running stopped=exited removed=1 engine=offline-model", "assessment_criterion_ref": "CB08.KW01"}, "task03": {"prompt_tex": "Porównaj trwałość volume i bind mount.", "criterion": "volume_persists_after_container_rm=1 bind_persists=1 volume_removed_explicitly=1", "assessment_criterion_ref": "CB08.KW01"} }, "tasks_order": ["task01", "task02", "task03"], "mission": "Zrozumieć image, container i storage bez udostępniania uczniowi uprzywilejowanego socketu.", "objectives": ["Wyjaśnisz tag i digest.", "Przeprowadzisz cykl życia kontenera.", "Rozróżnisz volume i bind mount."], "agenda": [{"time": "0--20 min", "work": "Dockerfile i image."}, {"time": "20--40 min", "work": "Cykl życia."}, {"time": "40--65 min", "work": "Storage, granica bezpieczeństwa i trace."}], "tech_stack": {"software": [{"name": "container_lab.py", "use": "jawny model stanów offline"}, {"name": "POSIX shell", "use": "izolowane scenariusze"}, {"name": "stemctl", "use": "profil native-amd64"}], "hardware": [{"name": "Brak socketu engine", "use": "celowa granica profilu ucznia"}]}, "container_test": { "title": "Test native-amd64", "commands": ["stemctl test native-amd64 console-bash L08 1", "stemctl test native-amd64 console-bash L08 2", "stemctl debug native-amd64 console-bash L08 3"], "pass_condition": "Trzy komunikaty PASS z engine=offline-model, socket_exposed=0 oraz trace.log; nie oznacza uruchomienia prawdziwego silnika." }, "safety_rules": [ {"title": "Bez socketu silnika", "body": "Nie montuj /var/run/docker.sock ani socketu Podman do profilu ucznia."}, {"title": "Uczciwy dowód", "body": "PASS modelu offline nie jest dowodem rzeczywistego wykonania Docker/Podman."}, {"title": "Izolacja", "body": "Stan modelu i dane powstają wyłącznie w katalogu mktemp."} ], "hardware_procedure": [{"step": "1", "action": "Zbuduj specyfikację.", "condition": "4 instrukcje i stabilny digest."}, {"step": "2", "action": "Przeprowadź lifecycle.", "condition": "running, exited, removed."}, {"step": "3", "action": "Sprawdź storage.", "condition": "Dane przetrwały rm kontenera."}], "references": [] }