VPS Docker - kontenery na KVM z NVMe
Compose na KVM, nie shared Docker host u providera. cgroup limity, bo jeden kontener z memory leak zabije cały node. NVMe pod warstwy obrazów.
Docker na własnym VPS vs PaaS
Masz kernel gościa. Instalujesz Docker Engine sam. Brak limitu „tylko 3 kontenery” z taniego hostingu.
Odpowiadasz za aktualizację silnika, za CVE w obrazach, za socket /var/run/docker.sock nigdy nie wystawionego na świat.
KVM daje granicę — sąsiad to inna maszyna, nie ten sam daemon.
Limity pamięci i CPU
deploy.resources.limits w Compose — obowiązkowe na produkcji.
Bez limitu kontener zjadnie RAM hosta i OOM zabije też bazę obok.
cpu_shares vs cpus — zrozum różnicę. Throttling lepszy niż kill całego hosta.
Mount do kontenera = root na hoście. Tylko lokalnie, tylko zaufane obrazy.
Compose w produkcji
Jeden plik compose na środowisko. Sekrety w .env poza git — albo Docker secrets / vault.
healthcheck w serwisach — orchestrator wie, kiedy restartować.
log-driver z rotation — json-file bez max-size zapełni NVMe w tydzień.
Wolumeny i I/O
Named volumes na NVMe Gen4 — szybkie. Bind mount z hosta — uważaj na uprawnienia UID.
Baza w kontenerze — OK na start. Przy wzroście I/O wydziel volume albo osobny VPS pod DB.
Shared storage hosta — variance IOPS. iostat podczas deploy.
Sieć kontenerów
Reverse proxy (Traefik/Caddy) w kontenerze — publikujesz 80/443, reszta w sieci internal.
Transfer VPS w planie. Duży docker pull co deploy — liczy ingress, egress przy registry prywatnym.
AS219481, Anti-DDoS L3/L4 — nie zastępuje firewalla na hoście.
Aktualizacje obrazów
latest tag to antywzor. Pinuj digest albo semver.
Watchtower na produkcji — ostrożnie. Lepiej pipeline z testem.
CVE scan (trivy) w CI — obraz z 2023 to dziura.
Backup kontenerów
Backup wolumenów, nie tylko compose.yml. restic na /var/lib/docker/volumes.
Stan w DB — spójny dump, nie kopiuj plików mysql w trakcie write.
Sieci Docker: bridge, macvlan, overlay
Default bridge — OK na lab. Produkcja: user-defined bridge z nazwą.
Published ports — tylko wymagane. 0.0.0.0:6379 redis = incydent.
IPv6 docker — test przed wdrożeniem; często pomijane.
Registry prywatny i pull secrets
GHCR, GitLab registry — login w cron deploy, nie w compose plain text.
docker pull co deploy — egress liczy się do transferu planu.
Pin digest obrazu — tag latest to ruletka.
Logi i metryki kontenerów
docker logs --tail nie zastępuje centralnego Loki.
cAdvisor + Prometheus — zobacz który kontener zjada CPU.
Healthcheck bez restart policy — bezużyteczny.
Seccomp, cap drop, read-only rootfs
cap_drop: ALL + cap_add minimum — wzór hardeningu.
read_only: true z tmpfs na /tmp gdzie możliwe.
Non-root USER w Dockerfile — nie root w kontenerze na prod.
Od Compose do wielu VPS
Jeden VPS z compose — prosty start. DB rośnie — wydziel na drugi VPS.
Sieć między VPS — WireGuard mesh, nie publiczne porty DB.
IP Transit gdy potrzebujesz własnego ASN obok stacku — osobna usługa.
Compose na produkcji — checklist
restart: unless-stopped, limits, healthcheck, logging driver z max-size.
Secrets nie w git. .env w .gitignore.
Osobny compose override dla prod — nie ten sam plik co dev.
Ship kontenerów bez niespodzianek
Build w CI, pull na VPS — mniej CPU steal na prod. Obraz pin digest.
Limity pamięci w compose — obowiązkowe. Jeden leak zabija host gościa KVM.
NVMe — warstwy obrazów rosną. docker system prune w cron z rozwagą.
Transfer — pull z registry, push logów offsite.
KVM izolacja — docker.sock nigdy publicznie. Anti-DDoS nie filtruje błędnego publish portu 6379.
Ryzen — wystarczy dla typowego stacku web. DB ciężka — osobny VPS.
CI/CD a VPS
GitHub Actions buduje obraz, VPS pull z registry — mniej narzędzi na prod.
Deploy przez ssh docker compose pull && up -d — loguj wersję digest.
Rollback = poprzedni digest w compose — test przed potrzebą.
Host KVM pod Docker
Ryzen + NVMe — sensowny duet. Shared steal przy build na prod — unikaj.
Transfer pull obrazów — pierwszy deploy duży, potem warstwy cache.
Anti-DDoS nie naprawia publish 0.0.0.0:9200 elasticsearch.
Po pierwszym deploy prod
docker ps --format sprawdzone — tylko oczekiwane porty.
Compose hash wersji w git tag.
restic backup wolumenów zakończony sukcesem — alert na fail.
Images pin digest w compose committed.
Steal podczas build na prod — przenieś build do CI.
Produkcja compose — twardy checklist
Osobny użytkownik linux do deploy — nie root.
CI secrets — nie w compose na serwerze.
Network internal default — tylko reverse proxy published.
Healthcheck failing — alert, nie silent restart loop.
Image vulnerability scan w pipeline.
Disaster: compose.yml + env backup offsite.
Kontenery na KVM — finał
Compose z limitami — zawsze.
docker.sock lokalnie — nigdy publicznie.
Ryzen build w CI, nie na prod VPS.
NVMe — obrazy i logi rotowane.
Transfer pull/push w planie VPS.
Anti-DDoS nie zamyka published portów.
AS219481 WAW Tier III — DC nie backup.
Backup wolumenów restic offsite.
KVM izolacja od sąsiada container host.
IP Transit WireGuard per TB — projekt sieciowy osobno.
Jak o tym myśleć
VPS Docker ma sens, gdy chodzi o: compose, workers, pełna kontrola silnika.
To nadal VPS na współdzielonej infrastrukturze: masz root, KVM i transfer w cenie planu, ale CPU steal, IOPS i uplink zależą od realnego obciążenia hosta. Jeśli potrzebujesz stałego heavy loadu 24/7, policz osobną architekturę zamiast zakładać, że większy plan VPS załatwi wszystko.
FAQ
Swarm czy Kubernetes?
Na jednym VPS — zwykle Compose wystarczy. K8s to kolejny poziom ops.
Podman?
Działa na KVM tak samo. Wybór narzędzia po Twojej stronie.
Ile RAM na stack?
Suma limitów kontenerów + 1–2 GB na host. Zostaw margines.
IPv6 dla kontenerów?
Zależy od konfiguracji docker0 i sieci DC. Test przed produkcją.
Rootless Docker?
Możliwe, mniejsze ryzyko. Niektóre porty <1024 wymagają dodatków.
Docker Compose v2?
Tak — plugin compose. Stary docker-compose binary deprecated.
Build on VPS czy CI?
CI buduje, VPS pulluje — mniej CPU steal na prod.
Wolumen na NFS?
Możliwe — latency wyższa. DB na lokalnym NVMe VPS.
SELinux + Docker?
label: disable ostrożnie — lepsze polityki volume.
Ile kontenerów na 2 GB?
Mało — nginx + app + redis może już ciasno. Mierz.
Automatyczny cleanup?
docker system prune w cron — uważaj na dangling volumes.
Secrets w env file?
chmod 600, poza git. Lepsze Docker secrets / vault.
Portainer?
OK na lab — nie wystawiaj publicznie bez VPN.
Rootless Docker?
Mniejsze ryzyko — niektóre porty wymagają sysctl.
Backup bind mount?
Backup host path albo volume — oba wymagają spójności aplikacji.
Czy docker compose wystarczy na prod?
Na jednym VPS często tak — z limitami zasobów, healthcheck, rotacją logów i backupem wolumenów offsite. Kubernetes to kolejny poziom operacyjny; nie komplikuj bez potrzeby. KVM daje izolację od sąsiada lepszą niż shared docker host u taniego providera.
Jak backupować named volumes?
restic na ścieżkę wolumenu z zatrzymaniem kontenera albo spójny hook aplikacji. Kopiowanie plików postgres w trakcie write bez dump — uszkodzona baza po restore.
Publish ports a Anti-DDoS?
Filtr L3/L4 nie zastępuje zamknięcia 0.0.0.0:6379. Sprawdź ss -tlnp na hoście po każdym deploy compose. Transfer planu VPS liczy też docker pull z registry.
Dalej
Linux · KVM · Proxmox lab