Docker Tips: Rensa din maskin frÄn skrÀp

Docker Tips: Rensa din maskin frÄn skrÀp

Hej, Habr! Jag presenterar översÀttningen av artikeln "Docker Tips: Rensa upp din lokala maskin" författare Luc Juggery.

Idag ska vi prata om hur Docker anvÀnder diskutrymmet pÄ vÀrdmaskinen och ocksÄ gÄ igenom hur man kan frigöra detta utrymme frÄn skrÀp som onödiga bilder och containrar.


Docker Tips: Rensa din maskin frÄn skrÀp

Total anvÀndning

Docker Àr en fantastisk grej, idag Àr det nog fÄ som tvivlar pÄ detta. För bara nÄgra Är sedan gav denna produkt oss ett helt nytt sÀtt att bygga, leverera och köra vilken miljö som helst, vilket gör att vi kan spara betydligt pÄ processor- och minnesresurser. Utöver detta (och för vissa Àr det kanske det viktigaste) har Docker lÄtit oss förenkla och standardisera hanteringen av livscykeln för de arbetsmiljöer vi anvÀnder.

Men för allt detta moderna liv mÄste man betala. NÀr vi kör containrar, laddar ner eller skapar egna bilder, rullar ut komplexa ekosystem, sÄ betalar vi. Och vi betalar ocksÄ med diskutrymme.

Om du aldrig har funderat pÄ hur mycket plats som faktiskt Àr upptagen pÄ din Docker-maskin kan du bli obehagligt överraskad av resultatet frÄn detta kommando:

$ docker system df

Docker Tips: Rensa din maskin frÄn skrÀp

HÀr visas Docker-anvÀndningen av disk i olika aspekter:

  • bilder (images) – den totala storleken av bilder som har laddats ner frĂ„n bildförrĂ„d och skapats i ditt system;
  • containrar (containers) – den totala mĂ€ngden diskytan som anvĂ€nds av aktiva containrar (det handlar om den totala mĂ€ngden lĂ€s- och skrivlager av alla containrar);
  • lokala volymer (local volumes) – mĂ€ngden lokala lagringsutrymmen som Ă€r monterade pĂ„ containrar;
  • byggcache (build cache) – tillfĂ€lliga filer som genereras av processen att bygga bilder (vid anvĂ€ndning av verktyget BuildKit, tillgĂ€ngligt frĂ„n och med Docker version 18.09).

Jag kan slÄ vad om att efter denna enkla upprÀkning brinner du av lÀngtan att rensa disken frÄn skrÀp och ÄterfÄ dina vÀrdefulla gigabyte (anm. övers.: sÀrskilt om du betalar hyra för dessa gigabyte varje mÄnad).

DiskanvÀndning av containrar

Varje gÄng en container skapas pÄ vÀrdmaskinen skapas flera filer och kataloger i katalogen /var/lib/docker, bland vilka följande Àr vÀrda att notera:

  • Katalogen /var/lib/docker/containers/ID_kontainer – nĂ€r standard logg-drivrutinen anvĂ€nds, sparas loggarna i JSON-format hĂ€r. Alltför detaljerade loggar, samt loggar som ingen lĂ€ser eller behandlar pĂ„ andra sĂ€tt, blir ofta en orsak till att diskarna fylls.
  • Katalogen /var/lib/docker/overlay2 – innehĂ„ller skriv- och lĂ€slager för containrar (overlay2 – den föredragna drivrutinen i de flesta Linux-distributioner). Om containern sparar data i sitt filsystem kommer de att placeras i denna katalog.

LÄt oss förestÀlla oss ett system dÀr Docker Àr helt nyinstallerad, utan att ha deltagit i att köra containrar eller bygga bilder. Dess rapport om diskusage skulle se ut sÄ hÀr:

$ 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

LÄt oss köra en container, till exempel NGINX:

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

Vad hÀnder med disken:

  • bilder (images) tar upp 126 MB, det Ă€r just den NGINX vi har startat i containern;
  • containrar (containers) tar upp löjliga 2 byte.

$ 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

Enligt utskriften har vi fortfarande inget utrymme som vi kan frigöra. Eftersom 2 byte Àr helt oseriöst, lÄt oss förestÀlla oss att vÄr NGINX ovÀntat har skrivit 100 Megabyte data nÄgonstans och skapat en fil test.img av just den storleken.

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

Vi undersöker igen anvÀndningen av diskutrymme pÄ vÀrden. Vi kommer att se att containern (containers) tar upp 100 Megabyte dÀr.

$ 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

Jag tror att din nyfikna hjÀrna redan undrar var vÄr fil test.img finns. LÄt oss leta efter den:

$ 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

Utan att gÄ in pÄ detaljer kan vi konstatera att filen test.img Àr bekvÀmt placerad pÄ lÀs- och skrivnivÄer som hanteras av overlay2-drivern. Om vi stoppar vÄr container kommer vÀrden att meddela oss att detta utrymme i princip kan frisÀttas:

# 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

Hur kan vi Ästadkomma detta? Genom att ta bort containern, vilket kommer att rensa det motsvarande utrymmet pÄ lÀs- och skrivnivÄ.

Med följande kommando kan du ta bort alla installerade containrar pÄ en gÄng och rensa din disk frÄn alla filer som de skapat pÄ lÀs- och skrivnivÄ:

$ docker container prune
WARNING! Detta kommer att ta bort alla stoppade containrar.
Är du sĂ€ker pĂ„ att du vill fortsĂ€tta? [y/N] y
Borttagna containrar:
5e7f8e5097ace9ef5518ebf0c6fc2062ff024efb495f11ccc89df21ec9b4dcc2

Totalt Ätervunnen plats: 104.9MB

SÄ, vi har frigjort 104,9 megabyte genom att ta bort containern. Men eftersom vi inte lÀngre anvÀnder den nedladdade bilden, blir Àven den kandidat för borttagning och frigör vÄra resurser:

$ 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

Observera: sÄ lÀnge som bilden anvÀnds av minst en container kan du inte anvÀnda detta trick.

Undersubkommandot prune, som vi anvÀnde ovan, ger effekt endast pÄ stoppade containrar. Om vi vill ta bort inte bara stoppade utan Àven körande containrar, bör vi anvÀnda nÄgot av dessa kommandon:

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

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

Noter pÄ sidlinjen: om du anvÀnder parametern --rm vid start av containern, kommer allt diskutrymme som den anvÀnde att frigöras vid nedstÀngning.

DiskanvÀndning av bilder

För nĂ„gra Ă„r sedan var storleken pĂ„ en bild pĂ„ flera hundra megabyte helt normal: Ubuntu-bilden vĂ€gde 600 megabyte och Microsoft .Net-bilden flera gigabyte. PĂ„ den tiden kunde nedladdningen av bara en bild orsaka stor skada pĂ„ ditt fria utrymme pĂ„ disken, Ă€ven om du delade nivĂ„er mellan bilder. Idag – tack och lov – vĂ€ger bilderna mycket mindre, men Ă€ven i detta fall kan du snabbt fylla upp befintliga resurser om du inte vidtar vissa försiktighetsĂ„tgĂ€rder.

Det finns flera typer av bilder som inte syns direkt för slutanvÀndaren:

  • intermediĂ€ra bilder, som andra bilder Ă€r baserade pĂ„ – de kan inte tas bort om du anvĂ€nder containrar baserade pĂ„ dessa "andra" bilder;
  • hĂ€ngande bilder – dessa Ă€r sĂ„dana intermediĂ€ra bilder som ingen av de körande containrarna refererar till – de kan tas bort.
  • Med följande kommando kan du kontrollera om det finns hĂ€ngande bilder i ditt system:

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

De kan tas bort pÄ följande sÀtt:

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

Vi kan ocksÄ anvÀnda subkommandot prune:

$ docker image prune
WARNING! Detta kommer att ta bort alla hÀngande bilder.
Är du sĂ€ker pĂ„ att du vill fortsĂ€tta? [y/N] y
Raderade bilder:
raderad: sha256:143407a3cb7efa6e95761b8cd6cea25e3f41455be6d5e7cda
raderad: sha256:738010bda9dd34896bac9bbc77b2d60addd7738ad1a95e5cc
raderad: sha256:fa4f0194a1eb829523ecf3bad04b4a7bdce089c8361e2c347
raderad: sha256:c5041938bcb46f78bf2f2a7f0a0df0eea74c4555097cc9197
raderad: sha256:5945bb6e12888cf320828e0fd00728947104da82e3eb4452f

Totalt Ätervunnen plats: 12.9kB

Om vi plötsligt vill ta bort alla bilder (inte bara hÀngande) med ett kommando kan vi göra sÄ hÀr:

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

AnvÀndning av disk med volymer

Volymer anvÀnds för att lagra data utanför containerns filsystem. Till exempel, om vi vill spara resultaten frÄn ett program för att anvÀnda dem pÄ nÄgot annat sÀtt. Ett vanligt exempel Àr databaser.

LÄt oss starta en MongoDB-container, montera en extern volym till den, och ÄterstÀlla en databasbackup frÄn en fil (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

Data kommer att befinna sig pÄ vÀrdmaskinen i katalogen /var/lib/docker/volumes. Men varför inte pÄ nivÄ med lÀs- och skrivÄtkomst hos containern? För att i Dockerfile för MongoDB-bilden definieras katalogen /data/db (dÀr MongoDB vanligtvis lagrar sina data) som en volym.

Docker Tips: Rensa din maskin frÄn skrÀp

Noter i marginalen: mÄnga bilder, vars resultat ska skapa data, anvÀnder volymer för att spara dessa data.

NÀr vi Àr klara med MongoDB och stoppar (eller kanske till och med raderar) containern, kommer volymen inte att tas bort. Den kommer att fortsÀtta ta upp vÄrt vÀrdefulla diskutrymme tills vi uttryckligen tar bort den med följande kommando:

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

Eller sÄ kan vi anvÀnda det redan bekanta subkommandot prune:

$ docker volume prune
VARNING! Detta kommer att ta bort alla lokala volymer som inte anvÀnds av Ätminstone en behÄllare.
Är du sĂ€ker pĂ„ att du vill fortsĂ€tta? [y/N] y
Borttagna volymer:
d50b6402eb75d09ec17a5f57df4ed7b520c448429f70725fc5707334e5ded4d5
8f7a16e1cf117cdfddb6a38d1f4f02b18d21a485b49037e2670753fa34d115fc
599c3dd48d529b2e105eec38537cd16dac1ae6f899a123e2a62ffac6168b2f5f
...
732e610e435c24f6acae827cd340a60ce4132387cfc512452994bc0728dd66df
9a3f39cc8bd0f9ce54dea3421193f752bda4b8846841b6d36f8ee24358a85bae
045a9b534259ec6c0318cb162b7b4fca75b553d4e86fc93faafd0e7c77c79799
c6283fe9f8d2ca105d30ecaad31868410e809aba0909b3e60d68a26e92a094da

Totalt Ätervunnen utrymme: 25.82GB
luc@saturn:~$

AnvÀndning av disk för cache av bildbyggen

I Docker 18.09 har processen för skapande av bilder genomgÄtt vissa förÀndringar tack vare verktyget BuildKit. Med hjÀlp av detta ökar hastigheten pÄ processen, och hantering av datalagring och sÀkerhet optimeras. HÀr kommer vi inte att gÄ in pÄ alla detaljer om detta fantastiska verktyg, utan fokuserar istÀllet pÄ hur det berör anvÀndningen av diskutrymme.

Anta att vi har en helt enkel Node.Js-applikation:

  • filen index.js startar en enkel HTTP-server som svarar med en strĂ€ng pĂ„ varje mottagen begĂ€ran:
  • filen package.json definierar beroenden, dĂ€r endast expressjs anvĂ€nds för att köra HTTP-servern:

$ 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 för att bygga bilden ser ut sÄ hÀr:

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

LÄt oss bygga bilden pÄ det vanliga sÀttet, utan att anvÀnda BuildKit:

$ docker build -t app:1.0 .

Om vi kontrollerar anvÀndningen av diskutrymme kommer vi att se att platsen endast tas av basbilden (node:13-alpine) och den slutgiltiga bilden (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

LÄt oss bygga den andra versionen av vÄr applikation, nu med anvÀndning av BuildKit. För detta behöver vi bara stÀlla in variabeln DOCKER_BUILDKIT till vÀrdet 1:

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

Om vi nu kontrollerar diskutrymmet kommer vi att se att byggcache (build-cache) nu ocksÄ deltar:

$ 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

För att rensa det, anvÀnd följande kommando:

$ docker builder prune
WARNING! Detta kommer att ta bort all överflödig byggcache.
Är du sĂ€ker pĂ„ att du vill fortsĂ€tta? [y/N] y
Raderade byggcache-objekt:
rffq7b06h9t09xe584rn4f91e
ztexgsz949ci8mx8p5tzgdzhe
3z9jeoqbbmj3eftltawvkiayi

Totalt Ätervunnen plats: 8.949kB

Rensa allt!

SÄ vi har sett pÄ att rensa diskhantering utlÄnat av containrar, bilder och volymer. Detta görs med hjÀlp av subkommandot prune. Men det kan ocksÄ anvÀndas pÄ systemnivÄ av Docker, och det kommer att rensa allt som det kan:

$ docker system prune
WARNING! Detta kommer att ta bort:
  - alla stoppade containrar
  - alla nÀtverk som inte anvÀnds av minst en container
  - alla överflödiga bilder
  - all överflödig byggcache

Är du sĂ€ker pĂ„ att du vill fortsĂ€tta? [y/N]

Om du av nÄgon anledning sparar diskutrymme pÄ en maskin med Docker, Àr det vÀrt att göra det till en vana att köra detta kommando regelbundet.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster