Dockeri nipet: Puhastage oma masin prĂŒgist

Dockeri nipet: Puhastage oma masin prĂŒgist

Tere, Habr! Esitan teile artikli tÔlke "Dockeri nipet: Puhastage oma kohalik masin" autori Luc Juggery.

TÀna rÀÀgime sellest, kuidas Docker kasutab hostmasina kettaruumi ning uurime, kuidas vabastada seda ruumi mittevajalikest piltidest ja konteineritest.


Dockeri nipet: Puhastage oma masin prĂŒgist

Kogutarbimine

Docker on Ă€ge asi, kahtlemata pole tĂ€napĂ€eval keegi selles kahtlemas. Veel paar aastat tagasi pakkus see toode meile tĂ€iesti uue viisi iga keskkonna loomisel, tarnimisel ja kĂ€itamisel, vĂ”imaldades oluliselt sÀÀsta protsessori ja mĂ€lu ressursse. Lisaks sellele (ja mĂ”ne jaoks on see isegi kĂ”ige tĂ€htsam) aitas Docker meil uskumatult lihtsustada ja ĂŒhtlustada kasutatavate töökeskkondade elutsĂŒkli haldamist.

Kuid kĂ”igi nende kaasaegsete mugavuste eest tuleb maksta. Kui kĂ€itameme konteinerit, allalaadime vĂ”i loome oma pilte, juurutame keerulisi ökosĂŒsteeme, peame maksma. Ja maksame sealhulgas ketta ruumiga.

Kui te pole kunagi mĂ”elnud, kui palju ruumi teie Docker masinas tegelikult Ă€ra vĂ”tab, vĂ”ite selle kĂ€su vĂ€ljundi tĂ”ttu ebameeldivalt ĂŒllatuda:

$ docker system df

Dockeri nipet: Puhastage oma masin prĂŒgist

Siin on nĂ€idatud Docker’i diskikasutust erinevates aspektides:

  • pildid (images) – allalaaditud ja teie sĂŒsteemis loodud piltide kogumahu suurus;
  • konteinerid (containers) – jooksvaid konteinerite kasutatav ĂŒldine kettaruumi maht (silmas peetakse kĂ”igi konteinerite kirjutamis- ja lugemistasemete kogumahtu);
  • kohalikud mahud (local volumes) – kohalikud salvestusruumid, mis on konteineritega ĂŒhendatud;
  • ehituse vahemĂ€lu (build cache) – ajutised failid, mis on loodud piltide ehitamise protsessi kĂ€igus (kasutades BuildKit tööriista, mis on saadaval alates Docker versioonist 18.09).

VÔin kihla vedada, et juba pÀrast seda lihtsat loetelu tunnete suure soovi puhastada oma ketast prahist ja vabastada kallihinnalised gigabaidid (vÀlja arvatud, kui maksate nende gigabaitide eest igakuiselt rendimaksu).

Konteinerite diskikasutus

Iga kord, kui konteiner luuakse hostimasinas, luuakse kataloogis /var/lib/docker mitu faili ja katalooge, mille hulgas tasub vÀlja tuua jÀrgmised:

  • Kataloog /var/lib/docker/containers/ID_konteineri – standardse logimisjuhendi kasutamisel salvestatakse just siia sĂŒndmuste logid JSON-formaadis. Liigne ĂŒksikasjalikkus logides ning logid, mida keegi ei loe ega muul moel töötle, pĂ”hjustavad sageli kĂ”vakettaruumi ĂŒletĂ€itumise.
  • Kataloog /var/lib/docker/overlay2 – sisaldab konteinerite kirjutamis- ja lugemiskihti (overlay2 – eelistatud draiver enamikus Linuxi jaotustes). Kui konteiner salvestab andmeid oma failisĂŒsteemi, siis just selles kataloogis need asuvad.

Kujutame ette sĂŒsteemi, kuhu on installitud puhas Docker, mis ei ole kunagi osalenud konteinerite kĂ€itamise ega imagede koostamises. Tema kettakasutuse raport nĂ€eb vĂ€lja jĂ€rgmine:

$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         0          0          0B         0B
Containers     0          0          0B         0B
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

KÀivitame konteineri, nÀiteks NGINX:

$ docker container run --name www -d -p 8000:80 nginx:1.16

Mis juhtub diskiga:

  • pildid (images) vĂ”tavad 126 MB, see on see NGINX, mille me konteineris kĂ€ivitasime;
  • konteinerid (containers) vĂ”tavad naljakad 2 baiti.

$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         1          1          126M       0B (0%)
Containers     1          1          2B         0B (0%)
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

Vaatamata vÀljundile ei ole meil veel ruumi, mida vÔiksime vabastada. Kuna 2 baiti on tÀiesti naljakas, kujutame ette, et meie NGINX kirjutas ootamatult kuhugi 100 Megabaidi andmeid ja lÔi endasse faili test.img just sellise suurusega.

$ docker exec -ti www 
  dd if=/dev/zero of=test.img bs=1024 count=0 seek=$[1024*100]

Uurime taas diskiruumi kasutust hostis. NÀeme, et konteiner (containers) vÔtab seal 100 Megabaidi.

$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         1          1          126M       0B (0%)
Containers     1          1          104.9MB    0B (0%)
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

Arvan, et teie uudishimu juba kĂŒsib, kus meie fail test.img asub. Otsime seda:

$ find /var/lib/docker -type f -name test.img
/var/lib/docker/overlay2/83f177...630078/merged/test.img
/var/lib/docker/overlay2/83f177...630078/diff/test.img

Ilma, et fail test.img on mugavalt paigutatud lugemise-kirjutamise tasemele, mida haldab overlay2 juht. Kui me peatame meie konteineri, siis host nÀitab meile, et see koht on pÔhimÔtteliselt vabastatav:

# Stopping the www container
$ docker stop www

# Visualizing the impact on the disk usage
$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         1          1          126M       0B (0%)
Containers     1          0          104.9MB    104.9MB (100%)
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

Kuidas me saame seda teha? Kustutades konteineri, mis toob endaga kaasa vastava ruumi puhastamise lugemise-kirjutamise tasemel.

JĂ€rgmise kĂ€su abil saate ĂŒheskoos eemaldada kĂ”ik installitud konteinerid ja puhastada oma ketta kĂ”igist neile sisse loodud lugemise-kirjutamise failidest:

$ docker container prune
WARNING! See eemaldab kÔik peatatud konteinerid.
Kas olete kindel, et soovite jÀtkata? [y/N] y
Kustutatud konteinerid:
5e7f8e5097ace9ef5518ebf0c6fc2062ff024efb495f11ccc89df21ec9b4dcc2

Kokku vabastatud ruum: 104.9MB

Nii et me vabastasime 104,9 megabaiti konteineri eemaldamisega. Kuid kuna me enam ei kasuta varem allalaaditud pilti, muutub see samuti meie ressursside vabastamise kandidaadiks:

$ docker system df
TÜÜP           KOKKU      AKTIIVNE   SUURUS     TAASKONDITSIONITAV
Pildid        1          0          126M       126M (100%)
Konteinerid   0          0          0B         0B
Kohalikud mahtud 0          0          0B         0B
Kogumise vahemÀlu 0          0          0B         0B

TĂ€htis: seni, kuni pilt on vĂ€hemalt ĂŒhe konteineri poolt kasutusel, ei saa te seda nippi kasutada.

AlamkĂ€sk prune, mida me eespool kasutasime, kehtib ainult peatatud konteinerite kohta. Kui soovime eemaldada mitte ainult peatatud, vaid ka töötavaid konteinerite, tuleks kasutada ĂŒhte jĂ€rgmistest kĂ€skudest:

# Historical command
$ docker rm -f $(docker ps –aq)

# More recent command
$ docker container rm -f $(docker container ls -aq)

MĂ€rkused: kui konteineri kĂ€itamisel kasutada parameetrit —rm, siis selle peatamisel vabastatakse kogu ruum, mida see kasutas.

Piltide poolt kasutatav diskiruumi

MĂ”ned aastad tagasi oli mitme sajandi megabaiti suurune pilt tĂ€iesti normaalne: Ubuntu pilt kaalub 600 megabaiti ja Microsoft .Net pilt mitu gigabaiti. Tol ajal vĂ”is ĂŒhe pildi allalaadimine teie vabale kettaruumi korralikult haiget teha, isegi kui jagasite pilte vastavalt nende vahel. TĂ€na – tĂ€nu suurele – on pildid palju vĂ€iksemad, kuid isegi siis vĂ”ite kiiresti oma ressursid tĂ€is saada, kui te ei vĂ”ta ette teatud ettevaatusabinĂ”usid.

On mitu pilditĂŒĂŒpi, mis pole lĂ”ppkasutajale vahetult nĂ€htavad:

  • intermediate pildid, mille pĂ”hjal on kokku pandud teised pildid – neid ei saa eemaldada, kui kasutate konteynereid, mis pĂ”hinevad just nende "teiste" piltide peal;
  • dangling pildid – need on intermediate pildid, millele ei viita ĂŒkski kĂ€imasolev konteiner – need vĂ”ivad olla eemaldatud.
  • JĂ€rgmise kĂ€suga saate kontrollida, kas teie sĂŒsteemis on dangling pilte:

$ docker image ls -f dangling=true
REPOSITORY  TAG      IMAGE ID         CREATED             SIZE
none      none   21e658fe5351     12 minutes ago      71.3MB

Nende eemaldamine on vÔimalik jÀrgmise kÀsu abil:

$ docker image rm $(docker image ls -f dangling=true -q)

Me saame kasutada ka kÀsku prune:

$ docker image prune
WARNING! See kustutab kÔik nö. rippuvad pildid.
Kas olete kindel, et soovite jÀtkata? [y/N] y
Kustutatud pildid:
kustutatud: sha256:143407a3cb7efa6e95761b8cd6cea25e3f41455be6d5e7cda
kustutatud: sha256:738010bda9dd34896bac9bbc77b2d60addd7738ad1a95e5cc
kustutatud: sha256:fa4f0194a1eb829523ecf3bad04b4a7bdce089c8361e2c347
kustutatud: sha256:c5041938bcb46f78bf2f2a7f0a0df0eea74c4555097cc9197
kustutatud: sha256:5945bb6e12888cf320828e0fd00728947104da82e3eb4452f

Kokku taastatud ruum: 12.9kB

Kui me tahame kustutada kĂ”ik pildid (mitte ainult rippuvad) ĂŒhe kĂ€suga, siis saab seda teha nii:

$ docker image rm $(docker image ls -q)

Ketta kasutamine mahudena

Mahud (volumes) kasutatakse andmete salvestamiseks konteineri failisĂŒsteemist vĂ€ljaspool. NĂ€iteks, kui me soovime salvestada mingi rakenduse töö tulemusi, et neid hiljem kasutada. Sage nĂ€ide on andmebaasid.

KÀivitame MongoDB konteineri, mountime sellele vÀlise mahu ja taastame sellest andmebaasi varukoopia (meil on see saadaval failis bck.json):

# Running a mongo container
$ docker run --name db -v $PWD:/tmp -p 27017:27017 -d mongo:4.0

# Importing an existing backup (from a huge bck.json file)
$ docker exec -ti db mongoimport 
  --db 'test' 
  --collection 'demo' 
  --file /tmp/bck.json 
  --jsonArray

Andmed asuvad hostmasinas kataloogis /var/lib/docker/volumes. Kuid miks mitte konteineri lugemise-kirjutamise tasemel? Sest MongoDB Dockerfile'i pildis on kataloog /data/db (kus MongoDB vaikimisi oma andmeid sÀilitab) mÀÀratletud kui maht (volume).

Dockeri nipet: Puhastage oma masin prĂŒgist

MÀrgistusmÀrkmed: paljud pildid, mille pÔhjal peaksid andmed tekkima, kasutavad nende andmete salvestamiseks mahuteid (volumes).

Kui oleme MongoDB-ga mÀnginud ja konteineri peatame (vÔib-olla isegi kustutame), ei kustutata mahutit. See jÀtkab meie vÀÀrtusliku kettaruumi hÔivamist, kuni me selle selgesÔnaliselt kustutame jÀrgmise kÀsuga:

$ docker volume rm $(docker volume ls -q)

VÔi vÔime kasutada juba tuttavat alakommandot prune:

$ docker volume prune
WARNING! See eemaldab kĂ”ik kohalikud mahutid, mida ei kasutada vĂ€hemalt ĂŒhe konteineri poolt.
Kas olete kindel, et soovite jÀtkata? [y/N] y
Kustutatud mahutid:
d50b6402eb75d09ec17a5f57df4ed7b520c448429f70725fc5707334e5ded4d5
8f7a16e1cf117cdfddb6a38d1f4f02b18d21a485b49037e2670753fa34d115fc
599c3dd48d529b2e105eec38537cd16dac1ae6f899a123e2a62ffac6168b2f5f
...
732e610e435c24f6acae827cd340a60ce4132387cfc512452994bc0728dd66df
9a3f39cc8bd0f9ce54dea3421193f752bda4b8846841b6d36f8ee24358a85bae
045a9b534259ec6c0318cb162b7b4fca75b553d4e86fc93faafd0e7c77c79799
c6283fe9f8d2ca105d30ecaad31868410e809aba0909b3e60d68a26e92a094da

Kokku vabastatud ruum: 25.82GB
luc@saturn:~$

Ketta kasutamine piltide kogumise vahemÀlu jaoks

Docker 18.09-s on piltide loomise protsessis toimusid mĂ”ned muutused BuildKit tööriista tĂ”ttu. Selle abil suurendatakse protsessi kiirus, optimeeritakse andmete salvestamise ja turvamise haldamist. Siin me ei kĂ€sitle kĂ”iki selle suurepĂ€rase tööriista ĂŒksikasju, vaid keskendume sellele, kuidas see puutub kokku kettaruumi kasutamise probleemidega.

Oletame, et meil on tÀiesti lihtne Node.Js rakendus:

  • fail index.js kĂ€ivitab lihtsa HTTP serveri, mis vastab igale saadud pĂ€ringule reaga:
  • fail package.json mÀÀratleb sĂ”ltuvused, millest kasutatakse ainult expressjs HTTP serveri kĂ€ivitamiseks:

$ cat index.js
var express = require('express');
var util    = require('util');
var app = express();
app.get('/', function(req, res) {
  res.setHeader('Content-Type', 'text/plain');
  res.end(util.format("%s - %s", new Date(), 'Got Request'));
});
app.listen(process.env.PORT || 80);

$ cat package.json
    {
      "name": "testnode",
      "version": "0.0.1",
      "main": "index.js",
      "scripts": {
        "start": "node index.js"
      },
      "dependencies": {
        "express": "^4.14.0"
      }
    }

Dockerfile pildi koostamiseks nÀeb vÀlja jÀrgmine:

FROM node:13-alpine
COPY package.json /app/package.json
RUN cd /app && npm install
COPY . /app/
WORKDIR /app
EXPOSE 80
CMD ["npm", "start"]

Kogume pildi tavalisel viisil, ilma BuildKit'i kasutamata:

$ docker build -t app:1.0 .

Kui vaatame kettaruumi kasutust, nÀeme, et ruumi vÔtavad ainult pÔhikujutis (node:13-alpine) ja lÔppkujutis (app:1.0):

TÜÜP          KOKKU      AKTIIVNE  SUURUS      TAASTATAV
Pildid        2           0         109.3MB    109.3MB (100%)
Konteinerid   0           0         0B         0B
Kohalikud mahud 0        0         0B         0B
Build Cache    0          0         0B         0B

Kogume nĂŒĂŒd meie rakenduse teise versiooni, kasutades juba BuildKit'i. Selleks peame vaid seadma muutuja DOCKER_BUILDKIT vÀÀrtuseks 1:

$ DOCKER_BUILDKIT=1 docker build -t app:2.0 .

Kui me nĂŒĂŒd kettaruumi kontrollime, nĂ€eme, et seal osaleb nĂŒĂŒd build cache (buid-cache):

$ docker system df
TÜÜP          KOKKU      AKTIIVNE  SUURUS      TAASTATAV
Pildid        2           0         109.3MB    109.3MB (100%)
Konteinerid   0           0         0B         0B
Kohalikud mahud 0        0         0B         0B
Build Cache    11         0         8.949kB    8.949kB

KÀesoleva puhastamiseks kasutame jÀrgmist kÀsku:

$ docker builder prune
HOIATUS! See eemaldab kÔik rippuvad build cache'i objektid.
Kas soovite tegelikult jÀtkata? [y/N] y
Eemaldatud build cache'i objektid:
rffq7b06h9t09xe584rn4f91e
ztexgsz949ci8mx8p5tzgdzhe
3z9jeoqbbmj3eftltawvkiayi

Kokku taastatud ruum: 8.949kB

Puhastage kÔik!

Nii, oleme kĂ€sitlenud konteinerite, piltide ja mahtude poolt kasutatud kettaruumi puhastamist. Sellega aitab meid prune alammeeskond. Kuid seda saab kasutada ka Docker'i sĂŒsteemitasandil, ja see puhastab kĂ”ik, mis vĂ”imalik:

$ docker system prune
HOIATUS! See eemaldab:
  - kÔik peatatud konteinerid
  - kĂ”ik vĂ”rgud, mida ei kasutata vĂ€hemalt ĂŒhe konteineri poolt
  - kÔik rippuvad pildid
  - kÔik rippuvad koostamisvahemÀlud

Kas olete kindel, et soovite jÀtkata? [y/N]

Kui te mingil pÔhjusel sÀÀstate kettaruumi Docker'i masinas, siis tasub harjumuseks vÔtta selle kÀsu perioodiline kÀivitamine.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster