Dockeri nĂ€punĂ€ited: Puhastage oma masin prĂŒgist

Dockeri nĂ€punĂ€ited: Puhastage oma masin prĂŒgist

Tere, Habr! Esitlen teile tÔlget artiklist "Dockeri nÔuanded: puhastage oma kohalik masin" autor Luc Juggery.

TÀna rÀÀgime sellest, kuidas Docker kasutab hostmasina kettaruumi, ning vaatame, kuidas vabastada seda ruumi kasutamata image'ite ja konteinerite jÀÀkidest.


Dockeri nĂ€punĂ€ited: Puhastage oma masin prĂŒgist

Kogutarbimine

Docker on suurepĂ€rane tööriist ja ilmselt kahtlevad selles tĂ€napĂ€eval vĂ€hesed. Vaid mĂ”ni aasta tagasi tĂ”i see toode meieni tĂ€iesti uue viisi mis tahes keskkonna loomiseks, juurutamiseks ja kĂ€ivitamiseks, aidates mĂ€rgatavalt sÀÀsta protsessori- ja RAM-ressursse. Lisaks sellele — ja mĂ”ne jaoks on see isegi kĂ”ige olulisem — muutis Docker kasutatavate töökeskkondade elutsĂŒkli halduse uskumatult lihtsaks ja ĂŒhtseks.

Kuid kĂ”igi nende tĂ€napĂ€evaste mugavuste eest tuleb maksta. Kui kĂ€ivitame konteinereid, laadime alla vĂ”i loome oma image'eid vĂ”i juurutame keerukaid ökosĂŒsteeme, maksame selle eest muu hulgas kettaruumiga.

Kui te pole kunagi mĂ”elnud, kui palju ruumi Docker teie masinas tegelikult hĂ”ivab, siis vĂ”ib selle kĂ€su vĂ€ljund teid ebameeldivalt ĂŒllatada:

$ docker system df

Dockeri nĂ€punĂ€ited: Puhastage oma masin prĂŒgist

Siin on nÀidatud Dockeri kettakasutus eri lÔigetes:

  • image'id (images) – image'ite kogumaht, mis on image-hoidlatest alla laaditud vĂ”i teie sĂŒsteemis loodud;
  • konteinerid (containers) – töötavate konteinerite kasutatav kettaruumi kogumaht (st kĂ”igi konteinerite lugemis-kirjutamiskihi kogumaht);
  • kohalikud köited (local volumes) – konteineritesse ĂŒhendatud kohalike andmemahtude maht;
  • build cache – image'ite loomise protsessi kĂ€igus genereeritud ajutised failid (BuildKit tööriista kasutamisel, mis on saadaval alates Dockeri versioonist 18.09).

VĂ”in kihla vedada, et juba pĂ€rast seda lihtsat loetelu tahate ketta prĂŒgist puhastada ja vÀÀrtuslikud gigabaidid tagasi saada.

Konteinerite kettakasutus

Iga kord, kui konteiner luuakse, tekitatakse hostmasinas kataloogi /var/lib/docker mitu faili ja kataloogi, millest tasub esile tÔsta jÀrgmisi:

  • Kataloog /var/lib/docker/containers/ID_ĐșĐŸĐœŃ‚Đ”ĐčĐœĐ”Ń€Đ° – standardse logidraiveri kasutamisel salvestatakse sĂŒndmuste logid JSON-vormingus just siia. Liiga detailsed logid, samuti logid, mida keegi ei loe ega töötle muul viisil, pĂ”hjustavad sageli ketaste tĂ€itumist.
  • Kataloog /var/lib/docker/overlay2 – sisaldab konteinerite kirjutatavaid kihte (overlay2 on enamikus Linuxi distributsioonides eelistatud draiver). Kui konteiner salvestab andmeid oma failisĂŒsteemi, paigutatakse need just sellesse kataloogi.

Kujutame ette sĂŒsteemi, kuhu on paigaldatud tĂ€iesti puhas Docker, mida pole kordagi kasutatud konteinerite kĂ€ivitamiseks ega image'ite ehitamiseks. Selle kettakasutuse aruanne nĂ€eb vĂ€lja selline:

$ 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 mÔne konteineri, nÀiteks NGINX-i:

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

Mis kettaga toimub:

  • Image'id (images) vĂ”tavad enda alla 126 MB – see on seesama NGINX, mille konteineris kĂ€ivitasime;
  • Konteinerid (containers) vĂ”tavad enda alla naeruvÀÀrsed 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

VĂ€ljundi jĂ€rgi otsustades pole meil veel ruumi, mida saaks vabastada. Kuna 2 baiti pole ĂŒldse tĂ”siseltvĂ”etav, kujutame ette, et meie NGINX kirjutas tĂ€iesti ootamatult kuhugi 100 megabaiti andmeid ja lĂ”i enda sisse tĂ€pselt sellise suurusega faili test.img.

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

Uurime uuesti kettakasutust hostis. NÀeme, et konteiner (containers) vÔtab seal enda alla 100 megabaiti.

$ 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 uudishimulik mĂ”istus kĂŒsib juba, kus meie fail test.img asub. Otsime selle ĂŒles:

$ 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

Üksikasjadesse laskumata vĂ”ib mĂ€rkida, et fail test.img paikneb mugavalt overlay2 draiveri hallataval lugemis-kirjutamiskihil. Kui aga konteineri peatame, annab host meile mĂ€rku, et selle ruumi saab pĂ”himĂ”tteliselt vabastada:

# 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 seda teha? Kustutades konteineri, mille tulemusel puhastatakse vastav ruum lugemis-kirjutamiskihil.

JĂ€rgmise kĂ€suga saate kĂ”ik installitud konteinerid ĂŒhe korraga eemaldada ja puhastada ketta kĂ”igist nende loodud lugemis-kirjutamiskihi failidest:

$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
5e7f8e5097ace9ef5518ebf0c6fc2062ff024efb495f11ccc89df21ec9b4dcc2

Total reclaimed space: 104.9MB

Niisiis vabastasime konteineri kustutamisega 104,9 megabaiti. Kuid kuna me varem allalaaditud image’it enam ei kasuta, on ka see nĂŒĂŒd eemaldamise ja ressursside vabastamise kandidaat:

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

TĂ€helepanu: seni kuni image on kasutusel vĂ€hemalt ĂŒhe konteineri poolt, ei saa te seda vĂ”tet kasutada.

AlamkĂ€sk prune, mida eespool kasutasime, toimib ainult peatatud konteinerite puhul. Kui soovime eemaldada mitte ainult peatatud, vaid ka töötavad konteinerid, tuleks kasutada ĂŒht neist kĂ€skudest:

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

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

MĂ€rkus: kui kasutada konteineri kĂ€ivitamisel parameetrit —rm, vabastatakse selle peatamisel kogu kettaruum, mida see hĂ”ivas.

Image’ite kettakasutus

MĂ”ni aasta tagasi oli mitmesaja megabaidine image tĂ€iesti tavapĂ€rane: Ubuntu image kaalus 600 megabaiti ja Microsoft .Neti image mitu gigabaiti. Neil vanadel aegadel vĂ”is juba ainuĂŒksi ĂŒhe image’i allalaadimine teie vaba kettaruumi tĂ”siselt vĂ€hendada, isegi kui jagasite kihte image’ite vahel. TĂ€napĂ€eval, Ă”nneks, on image’id palju vĂ€iksemad, kuid ka sel juhul vĂ”ib olemasolevad ressursid kiiresti tĂ€is kulutada, kui mitte rakendada mĂ”ningaid ettevaatusabinĂ”usid.

On olemas mitut tĂŒĂŒpi image’eid, mis lĂ”ppkasutajale otseselt nĂ€htavad ei ole:

  • intermediate image'id, mille pĂ”hjal on koostatud teised image'id — neid ei saa eemaldada, kui kasutate konteinereid, mis pĂ”hinevad neil samadel „teistel” image'idel;
  • dangling image'id on intermediate image'id, millele ei viita ĂŒkski töötav konteiner — need saab eemaldada.
  • JĂ€rgmise kĂ€suga saate kontrollida, kas teie sĂŒsteemis leidub dangling image'e:

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

Neid saab eemaldada jÀrgmiselt:

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

VÔime kasutada ka alamkÀsku prune:

$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:143407a3cb7efa6e95761b8cd6cea25e3f41455be6d5e7cda
deleted: sha256:738010bda9dd34896bac9bbc77b2d60addd7738ad1a95e5cc
deleted: sha256:fa4f0194a1eb829523ecf3bad04b4a7bdce089c8361e2c347
deleted: sha256:c5041938bcb46f78bf2f2a7f0a0df0eea74c4555097cc9197
deleted: sha256:5945bb6e12888cf320828e0fd00728947104da82e3eb4452f

Total reclaimed space: 12.9kB

Kui soovime ĂŒhe kĂ€suga eemaldada ĂŒldse kĂ”ik image'id (mitte ainult dangling image'id), siis saab seda teha nii:

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

Kettaruumi kasutamine volume'ite poolt

Volume'e kasutatakse andmete salvestamiseks vĂ€ljaspool konteineri failisĂŒsteemi. NĂ€iteks siis, kui soovime mĂ”ne rakenduse töö tulemused alles hoida, et neid hiljem muul viisil kasutada. TĂŒĂŒpiline nĂ€ide on andmebaasid.

KÀivitame MongoDB konteineri, mount'ime sellele konteinerivÀlise volume'i 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. Aga miks mitte konteineri lugemis-kirjutamiskihi tasemel? Sest MongoDB image'i Dockerfile'is on kataloog /data/db (kus MongoDB vaikimisi oma andmeid hoiab) mÀÀratletud volume'ina.

Dockeri nĂ€punĂ€ited: Puhastage oma masin prĂŒgist

MÀrkus: paljud image'id, mille töö tulemusena andmeid luuakse, kasutavad nende andmete sÀilitamiseks volume'e.

Kui oleme MongoDB-ga lÔpetanud ning peatame (vÔi isegi eemaldame) konteineri, siis volume'it ei kustutata. See jÀtkab meie vÀÀrtusliku kettaruumi hÔivamist seni, kuni eemaldame selle kÀsitsi jÀrgmise kÀsuga:

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

VÔi saame kasutada juba tuttavat alamkÀsku prune:

$ docker volume prune
WARNING! See eemaldab kĂ”ik kohalikud köited, mida ei kasuta vĂ€hemalt ĂŒks konteiner.
Kas soovite kindlasti jÀtkata? [y/N] y
Deleted Volumes:
d50b6402eb75d09ec17a5f57df4ed7b520c448429f70725fc5707334e5ded4d5
8f7a16e1cf117cdfddb6a38d1f4f02b18d21a485b49037e2670753fa34d115fc
599c3dd48d529b2e105eec38537cd16dac1ae6f899a123e2a62ffac6168b2f5f
...
732e610e435c24f6acae827cd340a60ce4132387cfc512452994bc0728dd66df
9a3f39cc8bd0f9ce54dea3421193f752bda4b8846841b6d36f8ee24358a85bae
045a9b534259ec6c0318cb162b7b4fca75b553d4e86fc93faafd0e7c77c79799
c6283fe9f8d2ca105d30ecaad31868410e809aba0909b3e60d68a26e92a094da

Total reclaimed space: 25.82GB
luc@saturn:~$

Kettakasutus image'i build-cache'i jaoks

Docker 18.09-s tehti image'ite loomise protsessis mĂ”ningaid muudatusi tĂ€nu BuildKitile. Selle tööriista abil suureneb koostamise kiirus ning paraneb andmesalvestuse ja turvalisuse haldus. Siin ei kĂ€sitle me selle suurepĂ€rase tööriista kĂ”iki ĂŒksikasju, vaid vaatame ainult seda, kuidas see mĂ”jutab kettaruumi kasutust.

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

  • Fail index.js kĂ€ivitab lihtsa HTTP serveri, mis vastab igale saabunud pĂ€ringule tekstireaga:
  • Fail package.json mÀÀrab sĂ”ltuvused, millest HTTP serveri kĂ€ivitamiseks kasutatakse ainult expressjs-i:

$ 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 image'i koostamiseks nÀeb vÀlja selline:

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

Koostame image'i tavalisel viisil, ilma BuildKiti kasutamata:

$ docker build -t app:1.0 .

Kui kontrollime kettaruumi kasutust, nÀeme, et ruumi vÔtavad ainult baasimage (node:13-alpine) ja lÔppimage (app:1.0):

TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         2          0          109.3MB    109.3MB (100%)
Containers     0          0          0B         0B
Local Volumes  0          0          0B         0B
Build Cache    0          0          0B         0B

Koostame nĂŒĂŒd meie rakenduse teise versiooni, kasutades juba BuildKiti. Selleks tuleb vaid mÀÀrata muutuja DOCKER_BUILDKIT vÀÀrtuseks 1:

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

Kui kontrollime nĂŒĂŒd kettakasutust, nĂ€eme, et nĂŒĂŒd osaleb selles ka build-cache:

$ docker system df
TYPE           TOTAL      ACTIVE     SIZE       RECLAIMABLE
Images         2          0          109.3MB    109.3MB (100%)
Containers     0          0          0B         0B
Local Volumes  0          0          0B         0B
Build Cache    11         0          8.949kB    8.949kB

Selle puhastamiseks kasutame jÀrgmist kÀsku:

$ docker builder prune
WARNING! This will remove all dangling build cache.
Are you sure you want to continue? [y/N] y
Deleted build cache objects:
rffq7b06h9t09xe584rn4f91e
ztexgsz949ci8mx8p5tzgdzhe
3z9jeoqbbmj3eftltawvkiayi

Total reclaimed space: 8.949kB

Puhasta kÔik!

Vaatasime nĂŒĂŒd, kuidas puhastada konteinerite, image'ite ja volume'ite kasutatavat kettaruumi. Selleks aitab subkĂ€sk prune. Kuid seda saab kasutada ka Dockeri sĂŒsteemitasemel ning siis puhastab see kĂ”ik, mida vĂ€hegi saab:

$ docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - all dangling build cache

Are you sure you want to continue? [y/N]

Kui sÀÀstate mingil pÔhjusel Dockeriga masinas kettaruumi, tasub selle kÀsu perioodiline kÀivitamine harjumuseks muuta.

Allikas: habr.com

Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster