Konteneryzacja Docker i Kubernetes
Twój obraz waży 1,2 GB, Trivy zgłasza 40 CVE w warstwie bazowej, a pod właśnie dostał OOMKilled z kodem wyjścia 137 na stagingu. Możesz spędzić popołudnie na czytaniu blogów o najlepszych praktykach dla Dockerfile i analizowaniu wyjścia kubectl describe — albo wpiąć agenta AI w pętlę z faktycznymi plikami i pozwolić mu wygenerować, przeskanować i wyjaśnić poprawkę, podczas gdy ty ją recenzujesz.
Ten artykuł pokazuje, jak prowadzić pracę z Dockerem i Kubernetesem za pomocą Cursora, Claude Code i Codeksa: generowanie wieloetapowych plików Dockerfile, hartowanie manifestów, debugowanie pętli awarii i podłączanie prawdziwych serwerów MCP Docker i Kubernetes, żeby agent czytał żywy stan klastra zamiast zgadywać.
Co z tego wyniesiesz
Dział zatytułowany „Co z tego wyniesiesz”- Powtarzalny prompt, który zamienia opasły, jednoetapowy Dockerfile w zahartowany, distroless’owy build wieloetapowy poniżej 80 MB
- Workflow debugowania OOMKilli z
exit 137, który koreluje limity,kubectl describei ostatnie zmiany w kodzie - Poprawną, niezhalucynowaną konfigurację bramy MCP Docker i
kubernetes-mcp-server(z flagami, które naprawdę istnieją) - Jasną zasadę: kiedy Agent Skill bije trwały serwer MCP w pracy z kontenerami
- Trzy prompty do skopiowania i wklejenia, które możesz uruchomić jeszcze dziś na własnym repozytorium
Workflow: generowanie zahartowanego Dockerfile
Dział zatytułowany „Workflow: generowanie zahartowanego Dockerfile”Ruchem o największej dźwigni jest podanie agentowi twojego aktualnego Dockerfile wraz z realnymi ograniczeniami (runtime, port, narzędzie buildujące) i poproszenie o przepisanie na wieloetapowy. Konfiguracja różni się dla każdego narzędzia, ale prompt jest niemal identyczny.
W Cursorze dołącz plik jako kontekst przez @Dockerfile i uruchom to w trybie Agent (nie wpisuj prefiksu @agent — wybór trybu Agent wystarczy; @ jest zarezerwowane na odwołania do kontekstu, takie jak @Dockerfile czy @package.json):
@Dockerfile @package.json Rewrite this as a multi-stage build for our Node 20service. Builder stage installs dev deps and runs the build; final stage isgcr.io/distroless/nodejs20-debian12, runs as UID 65534, copies only dist/ andproduction node_modules. Add a HEALTHCHECK hitting /health on 3000. Keep thefinal image under 80MB and explain each layer you cut.Trwała reguła utrzymuje spójność każdego przyszłego Dockerfile. Dodaj .cursor/rules/containers.md:
---description: Container build standardsglobs: ["**/Dockerfile", "**/*.dockerfile"]---- Always use multi-stage builds; never ship build tooling in the final image.- Final stage: distroless or alpine, non-root USER, no shell unless required.- Pin base images by tag, never `latest`. Add a HEALTHCHECK.Z katalogu głównego repozytorium Claude Code czyta plik z dysku — bez kroku z załączaniem:
claude "Rewrite ./Dockerfile as a multi-stage build for our Node 20 service.Builder stage installs dev deps and runs the build; final stage isgcr.io/distroless/nodejs20-debian12, runs as UID 65534, copies only dist/ andproduction node_modules. Add a HEALTHCHECK on /health:3000, keep it under 80MB,and tell me which layers you removed and why."Zapisz standard w CLAUDE.md w katalogu głównym repozytorium, żeby obowiązywał w każdej sesji:
## Containers- Multi-stage builds only; distroless/alpine final stage, non-root USER.- Pin base images by tag. Add HEALTHCHECK. Never COPY secrets into a layer.Codex (na GPT-5.5) działa tak samo z terminala. Trzymaj go w piaskownicy z odczytem-i-zapisem, żeby mógł edytować Dockerfile, ale nie dotknął poświadczeń do twojego rejestru:
codex --sandbox workspace-write --ask-for-approval on-request \ "Rewrite ./Dockerfile as a multi-stage build for our Node 20 service. Final stage gcr.io/distroless/nodejs20-debian12, UID 65534, dist/ + prod node_modules only, HEALTHCHECK on /health:3000, under 80MB. List the layers you cut and why."Dla bezproblemowej lokalnej pętli --full-auto jest skrótem na --sandbox workspace-write --ask-for-approval on-request.
Wynik powinien wyglądać mniej więcej tak — nie chodzi o sam YAML, ale o to, że każda linia jest uzasadniona i że ją zrecenzowałeś:
FROM node:20-alpine AS buildWORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .RUN npm run build && npm prune --omit=dev
FROM gcr.io/distroless/nodejs20-debian12 AS productionWORKDIR /appCOPY --from=build /app/node_modules ./node_modulesCOPY --from=build /app/dist ./distUSER 65534:65534EXPOSE 3000HEALTHCHECK --interval=30s --timeout=5s --retries=3 CMD ["node", "dist/healthcheck.js"]CMD ["dist/server.js"]Generowanie to dopiero połowa pętli. Styl, który odróżnia recenzenta od kopiuj-wklejacza, to przebieg krytyki — zmuś agenta, żeby zaatakował własny wynik, zanim mu zaufasz.
Hartowanie manifestów Kubernetes
Dział zatytułowany „Hartowanie manifestów Kubernetes”Ta sama pętla generuj-potem-krytykuj dotyczy manifestów, ale tryb awarii jest inny: agenty uwielbiają wypluwać 200-liniowy Deployment z ustawionym każdym polem, a nie zrecenzujesz tego, czego nie da się przeczytać. Trzymaj prompt zawężony do jednego zasobu i jednej kwestii naraz.
Skoncentrowany prompt na kontekst bezpieczeństwa, który działa we wszystkich trzech narzędziach (żądanie jest identyczne — różni się tylko sposób wywołania):
Poproszenie o diff zamiast pełnego przepisania to kluczowa sztuczka: widzisz dokładnie te pięć linii, które się zmieniły, zamiast ponownie recenzować ścianę YAML-a odtworzonego przez agenta z pamięci (i być może subtelnie zmienionego).
Debugowanie poda OOMKilled
Dział zatytułowany „Debugowanie poda OOMKilled”To tutaj asysta AI sama się spłaca. Kod wyjścia 137 oznacza, że jądro zabiło proces przez OOM — ale dlaczego wymaga skorelowania limitu, faktycznego zużycia i tego, co się zmieniło. Podaj agentowi dowody, zamiast prosić go o spekulacje.
-
Zbierz dowody w jednym miejscu.
Okno terminala kubectl describe pod -l app=api > /tmp/pod.txtkubectl top pod -l app=api >> /tmp/pod.txtgit log --oneline -10 >> /tmp/pod.txt -
Podaj agentowi cały pakiet i poproś o uszeregowane hipotezy. W Claude Code:
claude "Read /tmp/pod.txt ..."; w Cursorze dołącz plik przez@pod.txt; w Codeksie podaj ścieżkę w prompcie. Prośba jest identyczna we wszystkich narzędziach. -
Zastosuj najmniejszą poprawkę i zweryfikuj. Zwykle jest to podniesienie limitu albo wyciek pamięci w ostatnim wdrożeniu. Po rolloucie uruchom ponownie
kubectl topi potwierdź, że zbiór roboczy mieści się pod nowym limitem z zapasem.
Podłączanie serwerów MCP Docker i Kubernetes
Dział zatytułowany „Podłączanie serwerów MCP Docker i Kubernetes”Prompty z wklejonymi plikami są w porządku, ale prawdziwy skok jakościowy to umożliwienie agentowi odpytywania żywego stanu przez MCP. Liczą się tu dwa serwery i oba bywają nagminnie halucynowane w generowanych przez AI poradnikach — oto konfiguracja, która naprawdę działa.
Docker MCP (model bramy)
Dział zatytułowany „Docker MCP (model bramy)”Nie ma obrazu mcp/docker-toolkit ani endpointu HTTP localhost:8080, na który można wskazać klienta. Docker MCP Toolkit to funkcja Docker Desktop napędzana wtyczką CLI docker mcp (MCP Gateway). Włączasz MCP Toolkit w Docker Desktop, włączasz pożądane serwery z katalogu, a następnie podłączasz klienta przez stdio do procesu bramy:
Dodaj bramę do .cursor/mcp.json:
{ "mcpServers": { "docker": { "command": "docker", "args": ["mcp", "gateway", "run"] } }}claude mcp add docker -- docker mcp gateway runDodaj to do ~/.codex/config.toml:
[mcp_servers.docker]command = "docker"args = ["mcp", "gateway", "run"]Najpierw włącz serwery z katalogu przez docker mcp server enable <name>; brama udostępnia ich narzędzia każdemu podłączonemu klientowi. Zobacz dokumentację Docker MCP Toolkit oraz docker/mcp-gateway.
Kubernetes MCP (tylko prawdziwe flagi)
Dział zatytułowany „Kubernetes MCP (tylko prawdziwe flagi)”Pakiet kubernetes-mcp-server (z containers/kubernetes-mcp-server) jest prawdziwy, ale jego flagi są często zmyślane. Nie ma flag --audit-log, --rbac-mode, --namespace-filter ani --context. Flagi, które istnieją, to --kubeconfig, --read-only, --toolsets, --port, --disable-multi-cluster i --config. RBAC jest egzekwowane przez ServiceAccount powiązane z kubeconfigiem, na który go wskazujesz — nie przez przełącznik CLI.
Zacznij w trybie tylko-do-odczytu, jedynym rozsądnym domyślnym ustawieniu dla narzędzia prowadzonego przez LLM:
.cursor/mcp.json:
{ "mcpServers": { "kubernetes": { "command": "npx", "args": ["-y", "kubernetes-mcp-server@latest", "--read-only"], "env": { "KUBECONFIG": "/path/to/restricted-kubeconfig" } } }}# Safe default: read-only, scoped to a restricted kubeconfigclaude mcp add kubernetes \ --env KUBECONFIG=/path/to/restricted-kubeconfig \ -- npx -y kubernetes-mcp-server@latest --read-only
# Scope which tools are exposed instead of all of themclaude mcp add kubernetes -- npx -y kubernetes-mcp-server@latest \ --read-only --toolsets core,helm~/.codex/config.toml:
[mcp_servers.kubernetes]command = "npx"args = ["-y", "kubernetes-mcp-server@latest", "--read-only"]env = { KUBECONFIG = "/path/to/restricted-kubeconfig" }Z podłączonym serwerem pytania o klaster stają się konwersacyjne — i osadzone w realnym stanie:
Audit the production cluster: list pods that are not Running, any with noresource limits set, and any running as root. Group by namespace and flag thethree highest-risk findings.Serwer MCP czy Agent Skill?
Dział zatytułowany „Serwer MCP czy Agent Skill?”Nie każde zadanie potrzebuje trwałego połączenia. Agent Skills — instalowane uniwersalnym CLI, npx skills add <owner/repo> (z vercel-labs/skills), działające w Claude Code, Cursorze i Codeksie — to lżejsza opcja dla jednozadaniowego, bezstanowego wzbogacenia: skill do lintowania Dockerfile, generator wartości Helm, skill z checklistą wdrożeniową. Sięgnij po skill, gdy chcesz powtarzalnej wiedzy albo jednorazowej transformacji; sięgnij po serwer MCP, gdy agent musi odczytać żywy stan lub na nim działać (twój działający klaster, demon Dockera). Skill do hartowania Dockerfile plus kubernetes-mcp-server do odczytów na żywo to częste, komplementarne połączenie.
Kiedy to się sypie
Dział zatytułowany „Kiedy to się sypie”-
Agent wypluwa usunięte API. Jak wyżej,
PodSecurityPolicy,extensions/v1beta1iautoscaling/v2beta2wciąż wyskakują z nieświeżych danych treningowych. Przypnij to: podaj agentowi wersję klastra i każ mu zweryfikować przezkubectl api-resources. -
docker mcp gateway runnatychmiast kończy działanie. Funkcja MCP Toolkit musi być najpierw włączona w Docker Desktop i musisz przezdocker mcp server enable <name>włączyć co najmniej jeden serwer z katalogu. Brama bez niczego włączonego nie ma narzędzi do udostępnienia. -
Serwer MCP Kubernetes widzi klaster, ale każdy zapis kończy się błędem. To
--read-onlyi zawężone ServiceAccount robią swoją robotę. Jeśli naprawdę potrzebujesz mutacji, zdejmij--read-onlyświadomie na tę sesję — nie dawaj mu admina. -
Krok skanowania w CI używa wycofanej akcji. Stara
github/codeql-action/upload-sarif@v2została wycofana w 2025; użyj@v3(albo@v4). Każ agentowi przeszukać twoje workflowy pod kątem przypiętych wersji akcji i podbić tylko krok wgrywania SARIF:- name: Upload Trivy resultsuses: github/codeql-action/upload-sarif@v3if: always()with:sarif_file: 'trivy-results.sarif' -
„Bezpieczny” devcontainer po cichu wyłącza pytania o uprawnienia. Jeśli tworzysz szablon devcontainera dla Claude Code, ustawieniem VS Code jest
claudeCode.allowDangerouslySkipPermissions(aclaudeCode.initialPermissionModedla trybu domyślnego) — a nie kluczclaude-code.dangerouslySkipPermissions, który nic nie robi. I zastanów się dwa razy, zanim włączysz pomijanie uprawnień w kontenerze, który nazwałeś „bezpiecznym”: to przeczy samej idei. Wybierz domyślny tryb z pytaniami i odizolowany, ograniczony sieciowo devcontainer.
Co dalej
Dział zatytułowany „Co dalej”- Pipeline’y CI/CD — wepnij te obrazy w pipeline build-skan-podpis-wdrożenie
- Infrastruktura jako kod — generuj i recenzuj Terraform/Helm wokół tych obciążeń
- Monitoring i obserwowalność — domknij pętlę metrykami, które wyłapią następny OOMKill, zanim zrobi to staging
- Reagowanie na incydenty — playbook debugowania na żywo, gdy jeden z tych podów wybudzi cię alertem o 3 nad ranem