Docker RAM -suunnittelija
Suunnittele konttien muistinkäyttö suhteessa käytettävissä olevaan RAM-muistiin.
Lisää kontti
Services
Custom
RAM käytössä yhteensä
0 MB
Jäljellä
3584 MB
Järjestelmälle varattu
512 MB
Fits comfortably
Good headroom for scaling and memory spikes.
Mika on Docker RAM -laskin?
Docker RAM -laskin arvioi Docker-pohjaisten sovellusten kokonaismuistivaatimukset. Jokainen kontti kuluttaa muistia sovellusprosesseihinsa, ajonaikaiseen ympaeristoonsa ja mahdollisiin vaalimuisteihinsa. Tietaen konttien muistikayton kokonaismaaran auttaa sinua valitsemaan oikeankokoiset palvelimet tai pilvinstanssit.
Docker-konttien muistinkaytto koostuu sovellusmuistista (palvelimesi, tietokantasi), ajonaikamuistista (Node.js-keko, JVM-keko, Python-tulkki), kirjastoista ja riippuvuuksista sekae kayttojarjestelman valimuistista kontin sisalla. Todellinen kaytto on usein 20-50 % suurempi kuin itse sovellusprosessi.
Tyokalun kayttohje
Lisaa kukin kontti arvioidun muistinkayton kanssa. Tyokalu laskee kokonais-RAM-vaatimuksen kaikkien konttien, kayttojarjestelman ylaapuoliskulujen ja suositellun turvamarginaalin (20 %) kanssa. Se ehdottaa sopivaa palvelin- tai pilvi-instanssikokoa.
Muistirajoitukset vs. muistivaraukset
Docker antaa sinulle kaksi erillistä säädintä kontin RAM-käytön hallintaan: muistirajoitukset ja muistivaraukset. Ne sekoitetaan usein toisiinsa, mutta niillä on hyvin erilaiset tarkoitukset.
Muistirajoitus (asetettu --memory- tai mem_limit-parametrilla Compose-tiedostossa) on kova katto. Docker valvoo sitä Linuxin ohjausryhmien (cgroups) alijärjestelmän kautta. Kontti ei koskaan pysty varaamaan enempää kuin tämän määrän — jos se yrittää, Linuxin ytimen OOM-tappaja puuttuu asiaan.
- --memory / mem_limit: kova yläraja. Kontti ei pysty ylittämään tätä. Käytetään isäntäkoneen suojaamiseen hallitsemattomilta prosesseilta.
- --memory-reservation / mem_reservation: pehmeä vihje ajoitukseen. Dockerin swarm-ajoitin käyttää tätä päättäessään, mihin sijoittaa palvelut. Se EI estä konttia käyttämästä enemmän — se on yksinkertaisesti minimitakuu, jota Docker pyrkii noudattamaan.
- Yleinen paras käytäntö: aseta varaus odotetulle tyhjäkäyntijalanjäljelle ja rajoitus suurimpaan sallittuun. Esimerkiksi kontti, joka on 200 MB:n tyhjäkäynnillä mutta saattaa piikittää 600 MB:iin, voitaisiin asettaa reservation=200m ja limit=600m.
Jos jätät molemmat liput pois, kontilla ei ole rajaa ja se voi kuluttaa kaiken käytettävissä olevan isäntä-RAM:n. Yksikäyttöisellä palvelimella tämä saattaa olla hyväksyttävää, mutta monta palvelua ajavan homelabissa se on merkittävä riski.
Mitä tapahtuu, kun kontti saavuttaa muistirajoituksensa
Kun kontin muistinkäyttö saavuttaa --memory-parametrin arvon, Linuxin ytimen OOM-tappaja (Out of Memory) lopettaa muistihungrimman prosessin kontin sisällä. Docker kirjaa tämän poistumiskoodina 137 — standardi POSIX-signaali 9 (SIGKILL) -lopetus. Näet tämän komennolla docker ps --all tai kontin lokeissa merkintänä "Exited (137)".
Poistumiskoodi 137 ei tarkoita, että sovelluksesi kaatui virheen takia — se tarkoittaa, että ydin pakkotappoi sen, koska kontti osui määrittämääsi RAM-kattoon. Jos näet toistuvia 137-poistumisia vakaassa sovelluksessa, muistirajoituksesi on liian pieni tai työmäärä on kasvanut alkuperäisen arvion yli. Suurenna rajoitusta ja seuraa uudelleen komennolla docker stats.
Suoritusaikaympäristöjen muistihuomiot
Eri kieliajurit ja tietokantamoottorit hallitsevat muistia hyvin eri tavoin. Kontin muistirajoituksen asettaminen ottamatta huomioon ajoympäristön käyttäytymistä on yksi yleisimmistä odottamattomien OOM-tappojen syistä.
- JVM (Java, Kotlin, Scala): JVM varaa keon etukäteen. Ilman eksplisiittisiä lippuja se saattaa varata suuren osan käytettävissä olevasta järjestelmä-RAM:sta käynnistyksessä. Aseta aina -Xmx (maksimikeko) Docker-muistirajoitusta pienemmäksi — yleinen ohje on jättää vähintään 25% puskuria -Xmx:n yläpuolelle off-heap-muistille, roskienkeruuylikuormalle ja natiivikirjastoille.
- Node.js: V8:lla on oletusarvoinen keon raja (noin 1,5 GB 64-bittisillä järjestelmillä vanhemmissa versioissa). Jos Docker-rajoituksesi on pienempi, prosessi voidaan OOM-tappaa ennen kuin V8 edes käynnistää roskienkeruun. Käytä --max-old-space-size-parametria (MB:ssa) V8:n vanhan sukupolven keon rajoittamiseen ja aseta se alle Docker-muistirajoituksen.
- Tietokannat (PostgreSQL, MariaDB, MySQL): tietokannat käyttävät muistia aggressiivisesti suunnitelmallisesti — ne välimuistitavat kuumat sivut jaettuun puskuripooliin. PostgreSQL:n shared_buffers on oletuksena 128 MB, mutta se viritetään tyypillisesti 25%:iin käytettävissä olevasta RAM:sta omistettuja palvelimia varten. Kontin sisällä virittele shared_buffers muistirajoituksen sisään, tai tietokanta tapetaan odottamatta kuormituksessa.
- Mediapalvelimet (Jellyfin, Plex): transkooding on erittäin muisti-intensiivistä. Yksittäinen 4K-transkooding voi vaatia 1–3 GB tyhjäkäyntijalanjäljen päälle. Jos otat käyttöön laitteistokiihdytetyn transkoodauksen, muistikuva muuttuu merkittävästi. Tarkista palvelimesi todellinen käyttö todellisessa kuormituksessa ennen rajoitusten viimeistelyä.
Yleisiaae konttien muistivaatimuksia
Alla olevat luvut ovat karkeita suunnittelun lähtöalueita — todellinen käyttö vaihtelee huomattavasti konfiguraation, datajoukon koon, käyttäjämäärän ja käytössä olevien ominaisuuksien mukaan. Mittaa aina komennolla docker stats todellisen työmäärän ajamisen jälkeen.
- PostgreSQL: 256 MB - 1 GB+ riippuen tietokannan koosta ja kyselyiden monimutkaisuudesta.
- Nginx/Caddy: 50-128 MB tyypilliseen kaeanteisvalityspalvelimen kayttoon.
- Grafana + Prometheus: 256 MB + 512 MB - 2 GB seurantapinoille.
- Home Assistant: 256-512 MB kodin automaatioon.
- Plex/Jellyfin: 1-4 GB riippuen transkoodauksesta ja kirjaston koosta.
- Kevyet käänteisproksipalvelimet (Traefik, Caddy, Nginx): yleensä 30–150 MB tyhjäkäynnillä; nämä ovat muistitehokkaimpien palvelujen joukossa.
- Valvontakokonaisuudet (Prometheus + Grafana): Prometheus skaalautuu hakemiensa ja säilyttämiensä aikasarjojen määrän mukaan, muutamasta sadasta megasta useisiin gigatavuihin suurissa ympäristöissä. Grafana itsessään on suhteellisen kevyt, noin 100–300 MB.
Käytännön mitoitusesimerkki: tyypillinen homelabi Raspberry Pi 4 (8 GB)
Nähdäksesi, miten RAM-varaus karttuu, harkitse Raspberry Pi 4:ää, jossa on 8 GB ja joka ajaa pientä itseisännöityä kokonaisuutta:
- Isäntä-OS (Raspberry Pi OS Lite): ~300–500 MB varattuna ytimelle, järjestelmäprosesseille ja Docker-moottorille
- Pi-hole (DNS-mainossulkija): rajoitus 128 MB — kevyt palvelu, pieni ylikuorma
- Vaultwarden (Bitwarden-yhteensopiva salasananvälittäjä): rajoitus 128 MB — erittäin kevyt Rust-binääri
- Home Assistant: rajoitus 512 MB — Python-pohjainen, kasvaa automaatioiden ja integraatioiden myötä
- Jellyfin (mediapalvelin, ohjelmistotranskooding pois käytöstä): rajoitus 1024 MB — skaalautuu kirjaston koon mukaan
- Portainer (konttien hallintakäyttöliittymä): rajoitus 256 MB
Näiden rajoitusten summa: 500 (isäntä) + 128 + 128 + 512 + 1024 + 256 = noin 2,5 GB varattu. 8 GB:n laitteessa jää noin 5,5 GB puskuria — mukava tila välimuistille, piikkeille ja tuleville konteille. 2 GB:n Pi 4:ssä sama kokonaisuus olisi ylikuormitettu jo ennen piikkejä. Yllä oleva laskuri tekee täsmälleen tällaisen laskutoimituksen mille tahansa valitsemallesi palvelujen yhdistelmälle.
Miksi RAM:n ylikapasiteetti on riskialtista
Ylikuormitus tarkoittaa pinon suunnittelua niin, että konttien yhdistetyt muistirajoitukset ylittävät isäntä-OS:n käytettävissä olevan fyysisen RAM:n. Docker itsessään ei estä tätä — se hyväksyy mielellään Compose-tiedoston, joka varaa 10 GB konteille 4 GB:n koneella. Riski realisoituu suoritusaikana: kun kaikkien konttien todellinen käyttö lähestyy fyysistä RAM:ia, ydin alkaa vaihtaa aggressiivisesti. Vaihto SD-korteilla ja USB-asemilla (yleiset homelabi-tallennusratkaisut) on suuruusluokkia hitaampaa kuin RAM ja voi aiheuttaa koko järjestelmän jäätymisiä.
Isäntä-OS tarvitsee myös omaa hengitystilaa konttien käyttämän lisäksi. Linuxin sivuvälimuisti, ytimen puskurit ja järjestelmädaemonit kilpailevat kaikki RAM:sta. Nyrkkisääntönä: älä koskaan suunnittele pinoa, joka jättää vähemmän kuin 10–15% koko RAM:sta vapaaksi isännälle konttirajoitusten summaamisen jälkeen. 4 GB:n laitteessa se tarkoittaa vähintään 400–600 MB varaamatta jättämistä.
Docker-muistin optimointivinkkeja
Aseta muistirajat kaikille konteille (docker run --memory=512m) estamaan yksittaista konttia kuluttamasta kaikkea kaytettavissa olevaa RAM-muistia. Kayta Alpine-pohjaisia kuvia muistinkulutuksen minimoimiseksi.
Yleisiä virheitä Docker RAM:n mitoittamisessa
- Rajoitusten asettamatta jättäminen: ilman --memory-rajoituksia mikä tahansa kontti voi kuluttaa kaiken isäntä-RAM:n, kaataa jokaisen muun koneen palvelun.
- Varauksen sekoittaminen rajoitukseen: suuren mem_reservation-arvon asettaminen ei rajoita käyttöä — kontti, jolla on suuri varaus eikä rajoitusta, voi silti tyhjentää isäntä-RAM:n.
- Isäntä-OS:n ylikuorman sivuuttaminen: 100% fyysisen RAM:n varaaminen konteille ei jätä mitään ytimelle, Docker-moottorille ja taustaprosesseille.
- Mitoittaminen kuvan dokumentaation eikä todellisen käytön mukaan: viralliset kuvadokumentit mainitsevat usein minimivaatimukset. Todellinen RSS todellisessa työmäärässäsi voi olla 2–5 kertaa suurempi. Tarkista aina komennolla docker stats.
- Ajoympäristön keon asetusten unohtaminen: konteilla JVM- tai Node-sovelluksille, joissa ei ole keon rajaa, yritetään käyttää niin paljon muistia kuin kontin rajoitus sallii — tai ylittää se ja laukaista OOM-tappo.
Usein kysytyt kysymykset
Miten seuraan Docker-konttien muistinkayttoa?
Kaynnissa olevien konttien kokonaismuistinkaytto: docker stats --no-stream --format 'table .Name .MemUsage'. Tarkempaan seurantaan kayta cAdvisoria, Prometheusia + Grafanaa tai Docker Desktopin sisaanrakennettua resurssiseurantaa. Linux-jarjestelmissa jokaisen kontin muistiraja ja kaytto nakyy hakemistossa /sys/fs/cgroup/.
Jakavatko Docker-kontit muistia?
Docker-kuvat ja -kontit jakavat kerroksittaisen tiedostojarjestelman — identtiset peruskuvat ja kerrokset tallennetaan vain kerran. Viisi konttia, jotka perustuvat samaan Node.js-kuvaan, tallentavat peruskuvan vain kerran levylle. Muistissa kukin kontti saa kuitenkin oman muistialueensa — jaetut kirjastot voidaan valimuistittaa kayttojarjestelman tasolla, mutta jokaisella prosessilla on oma muistiallokaationsa.
Tulisiko minun konfiguroida vaihto Docker-konteille?
Docker antaa sinun asettaa vaihtorajoituksen erikseen parametrilla --memory-swap. Jos asetat --memory=512m ja --memory-swap=1g, kontti saa 512 MB RAM:ia plus 512 MB vaihtoa. Vaihto tarjoaa turvaverkon, joka estää välittömät OOM-tapot, mutta normaaliin toimintaan turvautuminen vaihtoon heikentää suorituskykyä merkittävästi — erityisesti flash-tallennuksessa. Käytä vaihtoa viimeisenä puskurina, älä riittävän RAM:n korvikkeena. Järjestelmissä ilman eksplisiittistä --memory-swap-lippua Docker käyttää oletusarvoisesti kaksinkertaista muistirajoitusta vaihdossa.
Kuinka selvitän, kuinka paljon RAM:ia käynnissä olevat kontit todella käyttävät?
Suorita docker stats nähdäksesi reaaliaikaisen näkymän CPU:sta, muistinkäytöstä ja muistirajoituksista kaikille käynnissä oleville konteille. MEM USAGE -sarake näyttää kontin nykyisen RSS:n (resident set size). Vertaa tätä asettamiisi rajoituksiin nähdäksesi, kuinka paljon puskuria jokaisella kontilla on. Kertakuvausta varten käytä docker stats --no-stream. Voit myös tarkastaa yksittäisen kontin komennolla docker inspect <nimi> ja etsiä MemoryStats-kenttää.