Docker Tips: Neħħi l-magna tiegħek mill-junk

Docker Tips: Neħħi l-magna tiegħek mill-junk

Ħej Habr! Nippreżenta għall-attenzjoni tiegħek it-traduzzjoni tal-artiklu "Għajnuniet dwar id-Docker: Naddaf il-Magni Lokali Tiegħek" l-awtur Luc Juggery.

Illum se nitkellmu dwar kif Docker juża l-ispazju tad-diska tal-magna ospitanti, u se nifhmu wkoll kif neħilsu dan l-ispazju mir-ruttam ta 'immaġini u kontenituri mhux użati.


Docker Tips: Neħħi l-magna tiegħek mill-junk

Konsum totali

Docker hija ħaġa sabiħa, probabbilment ftit nies jiddubitawha llum. Ftit snin ilu biss, dan il-prodott tana mod kompletament ġdid biex nibnu, inwasslu u nħaddmu kwalunkwe ambjent, li jippermettilna niffrankaw b'mod sinifikanti r-riżorsi tas-CPU u RAM. Minbarra dan (u għal xi wħud din se tkun l-iktar ħaġa importanti) Docker ippermettilna nissimplifikaw u ngħaqqdu b'mod oerhört il-ġestjoni taċ-ċiklu tal-ħajja tal-ambjenti tal-produzzjoni tagħna.

Madankollu, dawn il-pjaċiri kollha tal-ħajja moderna għandhom prezz. Meta nħaddmu kontenituri, iniżżlu jew noħolqu immaġini tagħna stess, u niskjeraw ekosistemi kumplessi, irridu nħallsu. U aħna nħallsu, fost affarijiet oħra, bi spazju fuq disk.

Jekk qatt ma ħsibt dwar kemm Docker fil-fatt jieħu spazju fuq il-magna tiegħek, tista' tkun sorpriż b'mod spjaċevoli bl-output ta' dan il-kmand:

$ docker system df

Docker Tips: Neħħi l-magna tiegħek mill-junk

Dan juri l-użu tad-disk ta 'Docker f'kuntesti differenti:

  • immaġini – id-daqs totali tal-immaġini li ġew imniżżla minn repożitorji tal-immaġni u mibnija fuq is-sistema tiegħek;
  • kontenituri - l-ammont totali ta 'spazju tad-diska użat billi jitmexxew il-kontenituri (jiġifieri l-volum totali ta' saffi ta' read-write tal-kontenituri kollha);
  • volumi lokali – il-volum tal-ħażna lokali mmuntati fuq kontenituri;
  • build cache - fajls temporanji ġġenerati mill-proċess tal-bini tal-immaġni (bl-użu tal-għodda BuildKit, disponibbli li tibda bil-verżjoni Docker 18.09).

Ħatrat li wara dan it-trasferiment sempliċi tkun ħerqan li tnaddaf id-diska tiegħek miż-żibel u terġa’ tagħti l-ħajja lill-gigabytes prezzjużi (nota: speċjalment jekk tħallas il-kera għal dawn il-gigabytes kull xahar).

Użu tad-disk mill-kontenituri

Kull darba li toħloq kontenitur fuq il-magna ospitanti, jinħolqu diversi fajls u direttorji fid-direttorju /var/lib/docker, fosthom dawn li ġejjin ta 'min jinnota:

  • Direttorju /var/lib/docker/containers/container_ID – meta tuża s-sewwieq tal-logging standard, dan huwa fejn ir-reġistri tal-avvenimenti jiġu ssejvjati fil-format JSON. Zkuk dettaljati wisq, kif ukoll zkuk li ħadd ma jaqra jew jipproċessa b'xi mod ieħor, ħafna drabi jikkawżaw li d-diski jimtlew.
  • Id-direttorju /var/lib/docker/overlay2 fih is-saffi tal-qari u l-kitba tal-kontenitur (overlay2 huwa s-sewwieq preferut fil-biċċa l-kbira tad-distribuzzjonijiet tal-Linux). Jekk il-kontenitur jaħżen id-dejta fis-sistema tal-fajls tiegħu, allura huwa f'dan id-direttorju li titqiegħed.

Ejja nimmaġinaw sistema li fuqha huwa installat Docker verġni, li qatt ma kien involut fit-tnedija ta 'kontenituri jew bini ta' immaġini. Ir-rapport tal-użu tal-ispazju tad-disk tiegħu se jidher bħal dan:

$ 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

Ejja nniedu xi kontenitur, pereżempju, NGINX:

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

X'jiġri mid-diska:

  • immaġini jokkupaw 126 MB, dan huwa l-istess NGINX li nedejna fil-kontenitur;
  • kontenituri jieħdu 2 bytes redikoli.

$ 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

Meta niġġudikaw mill-konklużjoni, għad m'għandna l-ebda spazju li nistgħu neħilsu. Peress li 2 bytes huma kompletament frivoli, ejja nimmaġinaw li NGINX tagħna b'mod mhux mistenni kiteb x'imkien 100 Megabytes ta 'dejta u ħoloq fajl test.img ta' eżattament dan id-daqs ġewwa fih innifsu.

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

Ejja neżaminaw l-użu tal-ispazju tad-disk fuq il-host mill-ġdid. Se naraw li l-kontenitur (kontenituri) jokkupa 100 Megabytes hemmhekk.

$ 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

Naħseb li l-moħħ kurżiv tiegħek diġà qed jistaqsi fejn jinsab il-fajl test.img tagħna. Ejja nfittxuha:

$ 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

Mingħajr ma nidħlu fid-dettalji, nistgħu ninnotaw li l-fajl test.img jinsab b'mod konvenjenti fil-livell tal-qari-kitba, ikkontrollat ​​mis-sewwieq overlay2. Jekk nieqfu l-kontenitur tagħna, l-ospitant jgħidilna li dan l-ispazju jista’, fil-prinċipju, jiġi meħlus:

# 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

Kif nistgħu nagħmlu dan? Billi tħassar il-kontenitur, li se jinvolvi l-ikklerjar tal-ispazju korrispondenti fil-livell tal-qari-kitba.

Bil-kmand li ġej, tista 'tneħħi l-kontenituri installati kollha f'daqqa waħda u tneħħi d-disk tiegħek mill-fajls kollha ta' read-write maħluqa minnhom:

$ 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

Għalhekk, aħna neħlesna 104,9 Megabytes billi ħassarna l-kontenitur. Iżda peress li m'għadniex nużaw l-immaġni li tniżżel qabel, din issir ukoll kandidat għat-tħassir u l-ħelsien tar-riżorsi tagħna:

$ 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

Nota: Sakemm l-immaġni tkun qed tintuża minn mill-inqas kontenitur wieħed, ma tkunx tista' tuża dan it-trick.

Is-sottokmand tal-pruna li użajna hawn fuq għandu effett biss fuq kontenituri mwaqqfa. Jekk irridu nħassru mhux biss kontenituri waqfien iżda wkoll li qed jaħdmu, għandna nużaw wieħed minn dawn il-kmandi:

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

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

Noti tal-ġenb: jekk tuża l-parametru -rm meta tibda kontenitur, allura meta jieqaf, l-ispazju kollu tad-diska li okkupa se jinħeles.

Bl-użu ta 'stampi tad-disk

Ftit snin ilu, daqs ta' immaġini ta' diversi mijiet ta' megabytes kien kompletament normali: immaġni Ubuntu kienet tiżen 600 megabytes, u immaġni Microsoft .Net kienet tiżen diversi gigabytes. F'dawk il-ġranet shaggy, it-tniżżil ta 'immaġni waħda biss jista' jieħu piż kbir fuq l-ispazju tad-disk liberu tiegħek, anke jekk kont qed taqsam il-livelli bejn l-immaġini. Illum - tifħir lill-kbar - immaġini jiżnu ħafna inqas, iżda anke hekk, tista 'malajr timla r-riżorsi disponibbli jekk ma tieħux xi prekawzjonijiet.

Hemm diversi tipi ta' immaġini li mhumiex viżibbli direttament għall-utent aħħari:

  • stampi intermedji, li fuq il-bażi tagħhom jinġabru immaġini oħra - ma jistgħux jitħassru jekk tuża kontenituri bbażati fuq dawn l-immaġini "oħra";
  • immaġini dangling huma immaġini intermedji li mhumiex referenzjati mill-ebda wieħed mill-kontenituri running - jistgħu jitħassru.
  • Bil-kmand li ġej tista 'tiċċekkja għal immaġini dangling fis-sistema tiegħek:

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

Tista' tneħħihom bil-mod li ġej:

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

Nistgħu wkoll nużaw is-sottokmand 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

Jekk f'daqqa waħda rridu nħassru l-immaġini kollha għal kollox (u mhux biss dangling) bi kmand wieħed, allura nistgħu nagħmlu dan:

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

Użu tad-disk bil-volumi

Il-volumi jintużaw biex jaħżnu d-dejta barra s-sistema tal-fajls tal-kontenitur. Pereżempju, jekk irridu nsalvaw ir-riżultati ta 'applikazzjoni sabiex nużawhom b'xi mod ieħor. Eżempju komuni huwa databases.

Ejja nniedu kontenitur MongoDB, immuntaw volum estern għall-kontenitur, u nirrestawraw backup tad-database minnu (għandna disponibbli fil-fajl 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

Id-dejta tkun tinsab fuq il-magna ospitanti fid-direttorju /var/lib/docker/volumes. Imma għaliex mhux fil-livell tal-qari-kitba tal-kontenitur? Minħabba li fid-Dockerfile tal-immaġni MongoDB, id-direttorju / data/db (fejn MongoDB jaħżen id-dejta tiegħu b'mod awtomatiku) huwa definit bħala volum.

Docker Tips: Neħħi l-magna tiegħek mill-junk

Nota tal-ġenb: ħafna stampi li għandhom jipproduċu dejta jużaw volumi biex jaħżnu dik id-dejta.

Meta nilagħbu biżżejjed ma 'MongoDB u nwaqqfu (jew forsi anke nħassru) il-kontenitur, il-volum mhux se jitħassar. Se tkompli tieħu l-ispazju prezzjuż tad-diska tagħna sakemm inħassruh b'mod espliċitu bi kmand bħal dan:

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

Ukoll, jew nistgħu nużaw is-sottokmand tal-pruna li diġà huwa familjari għalina:

$ docker volume prune
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
d50b6402eb75d09ec17a5f57df4ed7b520c448429f70725fc5707334e5ded4d5
8f7a16e1cf117cdfddb6a38d1f4f02b18d21a485b49037e2670753fa34d115fc
599c3dd48d529b2e105eec38537cd16dac1ae6f899a123e2a62ffac6168b2f5f
...
732e610e435c24f6acae827cd340a60ce4132387cfc512452994bc0728dd66df
9a3f39cc8bd0f9ce54dea3421193f752bda4b8846841b6d36f8ee24358a85bae
045a9b534259ec6c0318cb162b7b4fca75b553d4e86fc93faafd0e7c77c79799
c6283fe9f8d2ca105d30ecaad31868410e809aba0909b3e60d68a26e92a094da

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

L-użu tad-disk għall-cache tal-bini tal-immaġni

F'Docker 18.09, il-proċess tal-ħolqien tal-immaġni għadda minn xi bidliet grazzi għall-għodda BuildKit. Din il-ħaġa żżid il-veloċità tal-proċess u tottimizza l-ħażna tad-data u l-ġestjoni tas-sigurtà. Hawnhekk mhux se nikkunsidraw id-dettalji kollha ta 'din l-għodda mill-isbaħ; se niffukaw biss fuq kif tindirizza kwistjonijiet ta' użu tal-ispazju tad-disk.

Ejja ngħidu li għandna applikazzjoni Node.Js kompletament sempliċi:

  • il-fajl index.js jibda server HTTP sempliċi li jirrispondi b'linja għal kull talba riċevuta:
  • il-fajl package.json jiddefinixxi d-dipendenzi, li expressjs minnhom biss jintuża biex iħaddem is-server HTTP:

$ 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"
      }
    }

Id-Dockerfile għall-bini tal-immaġni jidher bħal dan:

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

Ejja nibnu l-immaġni bil-mod tas-soltu, mingħajr ma nużaw BuildKit:

$ docker build -t app:1.0 .

Jekk niċċekkjaw l-użu tal-ispazju tad-disk, nistgħu naraw li l-immaġni bażi (node:13-alpine) u l-immaġni tad-destinazzjoni (app:1.0) biss qed jieħdu spazju:

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

Ejja nibnu t-tieni verżjoni tal-applikazzjoni tagħna, billi tuża BuildKit. Biex nagħmlu dan, irridu biss nissettjaw il-varjabbli DOCKER_BUILDKIT għal 1:

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

Jekk issa niċċekkjaw l-użu tad-disk, se naraw li l-build cache (buid-cache) issa hija involuta hemmhekk:

$ 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

Biex tneħħiha, uża l-kmand li ġej:

$ 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

Żbarazza kollox!

Allura, ħares lejn it-tindif tal-ispazju tad-disk okkupat minn kontenituri, stampi u volumi. Is-sottokmand tal-pruna jgħinna f'dan. Iżda tista 'tintuża wkoll fil-livell tas-sistema docker, u se tnaddaf dak kollu li tista':

$ 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]

Jekk għal xi raġuni qed tiffranka spazju fuq id-diska fuq il-magna Docker tiegħek, allura t-tħaddim perjodiku ta 'dan il-kmand għandu jsir drawwa.

Sors: www.habr.com

Żid kumment