Ábendingar um bryggjumann: Hreinsaðu rusl úr vélinni þinni

Ábendingar um bryggjumann: Hreinsaðu rusl úr vélinni þinni

Hæ Habr! Ég kynni þér þýðingu greinarinnar „Docker ráð: Hreinsaðu upp staðbundna vélina þína“ höfundurinn Luc Juggery.

Í dag munum við tala um hvernig Docker notar diskpláss hýsingarvélarinnar og við munum einnig finna út hvernig á að losa þetta pláss frá ónotuðum myndum og ílátum.


Ábendingar um bryggjumann: Hreinsaðu rusl úr vélinni þinni

Heildarneysla

Docker er flottur hlutur, líklega efast fáir um það í dag. Fyrir örfáum árum gaf þessi vara okkur algjörlega nýja leið til að byggja, afhenda og keyra hvaða umhverfi sem er, sem gerir okkur kleift að spara örgjörva og vinnsluminni verulega. Fyrir utan þetta (og fyrir suma mun þetta vera það mikilvægasta) hefur Docker gert okkur kleift að einfalda og sameina lífsferilsstjórnun framleiðsluumhverfis okkar ótrúlega.

Hins vegar kostar öll þessi unun nútímalífs. Þegar við keyrum gáma, halum niður eða búum til okkar eigin myndir og setjum upp flókin vistkerfi, verðum við að borga. Og við borgum meðal annars með diskaplássi.

Ef þú hefur aldrei hugsað um hversu mikið pláss Docker tekur í raun og veru á vélinni þinni gætirðu verið óþægilega hissa á þessari skipun:

$ docker system df

Ábendingar um bryggjumann: Hreinsaðu rusl úr vélinni þinni

Þetta sýnir diskanotkun Docker í mismunandi samhengi:

  • myndir – heildarstærð mynda sem var hlaðið niður af myndageymslum og byggðar á kerfinu þínu;
  • gámar – heildarmagn plásssins sem notað er við að keyra gáma (sem þýðir heildarmagn les- og skrifalaga allra gáma);
  • staðbundið rúmmál – rúmmál staðbundinnar geymslu sem festur er á gáma;
  • byggja skyndiminni – tímabundnar skrár sem myndast af myndbyggingarferlinu (þegar BuildKit tólið er notað, fáanlegt frá Docker útgáfu 18.09).

Ég veðja á að eftir þessa einföldu flutning ertu fús til að hreinsa diskinn þinn af rusli og koma dýrmætum gígabætum aftur til lífsins (athugið: sérstaklega ef þú borgar leigu fyrir þessi gígabæt í hverjum mánuði).

Diskanotkun íláta

Í hvert skipti sem þú býrð til gám á hýsingarvélinni, eru nokkrar skrár og möppur búnar til í /var/lib/docker möppunni, þar á meðal eftirfarandi sem vert er að taka eftir:

  • Skrá /var/lib/docker/containers/container_ID – þegar þú notar staðlaða skógarhöggsrekla er þetta þar sem atburðaskrár eru vistaðar á JSON sniði. Of ítarlegir annálar, sem og skrár sem enginn les eða vinnur á annan hátt, valda því oft að diskar verða fullir.
  • /var/lib/docker/overlay2 möppan inniheldur les- og skrifalögin í gámnum (overlay2 er ákjósanlegur rekill í flestum Linux dreifingum). Ef gámurinn geymir gögn í skráarkerfi sínu, þá er það í þessari möppu sem það verður sett.

Við skulum ímynda okkur kerfi þar sem óspilltur Docker er settur upp, sem hefur aldrei tekið þátt í að ræsa gáma eða byggja myndir. Skýrsla um notkun diskpláss mun líta svona út:

$ 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

Við skulum ræsa ílát, til dæmis NGINX:

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

Hvað verður um diskinn:

  • myndir taka 126 MB, þetta er sama NGINX og við settum af stað í ílátinu;
  • gámar taka fáránlega 2 bæti.

$ 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

Af niðurstöðunni að dæma höfum við ekki ennþá neitt pláss sem við gætum losað. Þar sem 2 bæti er algjörlega léttvægt, við skulum ímynda okkur að NGINX okkar hafi óvænt skrifað einhvers staðar 100 megabæti af gögnum og búið til skrá test.img af nákvæmlega þessari stærð innra með sér.

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

Við skulum kanna plássnotkun á vélinni aftur. Við munum sjá að gámurinn (ílátin) tekur 100 megabæti þar.

$ 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

Ég held að forvitnilegur heili þinn sé þegar að velta fyrir sér hvar test.img skráin okkar er staðsett. Við skulum leita að því:

$ 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

Án þess að fara nánar út í smáatriði, getum við tekið eftir því að test.img skráin er þægilega staðsett á lestur-skrifa stigi, stjórnað af overlay2 reklum. Ef við stöðvum gáminn okkar mun gestgjafinn segja okkur að í grundvallaratriðum sé hægt að losa þetta pláss:

# 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

Hvernig getum við gert þetta? Með því að eyða ílátinu, sem mun fela í sér að hreinsa samsvarandi pláss á lesa-skrifa stigi.

Með eftirfarandi skipun geturðu fjarlægt öll uppsett ílát í einu vetfangi og hreinsað diskinn þinn af öllum les- og skrifa skrám sem þeir hafa búið til:

$ 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

Þannig að við losuðum um 104,9 megabæti með því að eyða ílátinu. En þar sem við notum ekki lengur myndina sem áður var hlaðið niður, verður hún einnig umsækjandi til að eyða og losa um auðlindir okkar:

$ 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

Athugið: Svo lengi sem myndin er í notkun af að minnsta kosti einum íláti muntu ekki geta notað þetta bragð.

Prune undirskipunin sem við notuðum hér að ofan hefur aðeins áhrif á stöðvuð ílát. Ef við viljum eyða ekki aðeins stöðvuðum heldur einnig keyrandi gámum ættum við að nota eina af þessum skipunum:

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

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

Auka athugasemdir: ef þú notar færibreytuna -rm þegar gámur er ræstur, þá losnar allt plássið sem það tók upp þegar það hættir.

Notkun diskamynda

Fyrir nokkrum árum var myndstærð nokkur hundruð megabæti fullkomlega eðlileg: Ubuntu mynd vó 600 megabæti og Microsoft .Net mynd nokkur gígabæti. Á þessum hrikalegu dögum gæti niðurhal á einni mynd tekið mikinn toll af lausu plássinu þínu, jafnvel þótt þú værir að deila stigum á milli mynda. Í dag - lof sé þeim frábæru - vega myndir miklu minna, en þrátt fyrir það geturðu fljótt fyllt upp tiltækt efni ef þú gerir ekki nokkrar varúðarráðstafanir.

Það eru nokkrar gerðir af myndum sem eru ekki beint sýnilegar endanlegum notanda:

  • millimyndir, á þeim grundvelli sem öðrum myndum er safnað - ekki er hægt að eyða þeim ef þú notar ílát sem byggjast á þessum „öðrum“ myndum;
  • dangling myndir eru millimyndir sem ekki er vísað til í neinum af hlaupandi gámunum - þeim er hægt að eyða.
  • Með eftirfarandi skipun geturðu athugað hvort myndir hanga á kerfinu þínu:

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

Þú getur fjarlægt þau á eftirfarandi hátt:

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

Við getum líka notað prune undirskipunina:

$ 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

Ef við viljum allt í einu eyða öllum myndum (en ekki bara dinglandi) með einni skipun, þá getum við gert þetta:

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

Diskanotkun eftir magni

Magn eru notuð til að geyma gögn utan skráakerfis gámsins. Til dæmis ef við viljum vista niðurstöður forrits til að nota þær á annan hátt. Algengt dæmi eru gagnagrunnar.

Við skulum ræsa MongoDB gám, setja upp bindi utan ílátsins og endurheimta öryggisafrit af gagnagrunni úr því (við höfum það tiltækt í bck.json skránni):

# 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

Gögnin verða staðsett á hýsingarvélinni í /var/lib/docker/volumes möppunni. En hvers vegna ekki á lesa-skrifa stigi ílátsins? Vegna þess að í Dockerfile á MongoDB myndinni er /data/db skráin (þar sem MongoDB geymir gögnin sjálf sjálfgefið) skilgreind sem bindi.

Ábendingar um bryggjumann: Hreinsaðu rusl úr vélinni þinni

Aukaathugasemd: margar myndir sem verða að framleiða gögn nota magn til að geyma þessi gögn.

Þegar við spilum nóg með MongoDB og hættum (eða jafnvel eyðum) ílátinu verður hljóðstyrknum ekki eytt. Það mun halda áfram að taka upp okkar dýrmæta diskpláss þar til við eyðum því beinlínis með skipun eins og þessari:

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

Jæja, eða við getum notað prune undirskipunina sem er nú þegar kunnugleg okkur:

$ 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:~$

Notar diskur fyrir myndasmíði skyndiminni

Í Docker 18.09 hefur myndsköpunarferlið tekið nokkrum breytingum þökk sé BuildKit tólinu. Þetta eykur hraða ferlisins og hámarkar gagnageymslu og öryggisstjórnun. Hér munum við ekki íhuga allar upplýsingar um þetta frábæra tól; við munum aðeins einbeita okkur að því hvernig það tekur á vandamálum varðandi notkun pláss.

Segjum að við höfum algjörlega einfalt Node.Js forrit:

  • index.js skráin byrjar einfaldan HTTP netþjón sem svarar með línu við hverri beiðni sem berst:
  • package.json skráin skilgreinir ósjálfstæðin, þar sem aðeins expressjs er notað til að keyra HTTP þjóninn:

$ 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 til að byggja myndina lítur svona út:

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

Við skulum byggja myndina á venjulegan hátt, án þess að nota BuildKit:

$ docker build -t app:1.0 .

Ef við athugum plássnotkunina getum við séð að aðeins grunnmyndin (hnút:13-alpína) og markmyndin (app:1.0) taka upp pláss:

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

Við skulum byggja aðra útgáfuna af forritinu okkar með því að nota BuildKit. Til að gera þetta þurfum við bara að stilla DOCKER_BUILDKIT breytuna á 1:

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

Ef við athugum nú diskanotkunina, munum við sjá að smíða skyndiminni (buid-skyndiminni) er nú með þar:

$ 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

Til að hreinsa það skaltu nota eftirfarandi skipun:

$ 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

Hreinsa allt!

Svo skoðuðum við að hreinsa upp diskpláss sem er upptekið af gámum, myndum og bindum. Undirskipunin prune hjálpar okkur við þetta. En það er líka hægt að nota það á hafnarkerfisstigi og það mun hreinsa upp allt sem það getur:

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

Ef þú af einhverjum ástæðum er að spara pláss á Docker vélinni þinni, þá ætti það að verða venja að keyra þessa skipun reglulega.

Heimild: www.habr.com

Bæta við athugasemd