feat(L08): add Docker fundamentals card

This commit is contained in:
user
2026-07-21 18:20:10 +02:00
commit 2ed1b7954a
39 changed files with 7419 additions and 0 deletions
+125
View File
@@ -0,0 +1,125 @@
{
"$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 runningexitedremoved 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": []
}