Mga Tip sa Docker: Kuhaa ang imong makina sa basura

Mga Tip sa Docker: Kuhaa ang imong makina sa basura

Hoy Habr! Gipresentar ko sa imong pagtagad ang hubad sa artikulo "Mga Tip sa Docker: Hugasi ang Imong Lokal nga Makina" tagsulat Luc Juggery.

Karon atong hisgutan kung giunsa paggamit ni Docker ang disk space sa host machine, ug mahibal-an usab naton kung giunsa nga mapahigawas kini nga wanang gikan sa mga scrap sa wala magamit nga mga imahe ug mga sudlanan.


Mga Tip sa Docker: Kuhaa ang imong makina sa basura

Kinatibuk-ang konsumo

Ang Docker usa ka cool nga butang, tingali pipila ka mga tawo ang nagduhaduha niini karon. Pipila lang ka tuig ang milabay, kini nga produkto naghatag kanamo usa ka hingpit nga bag-ong paagi sa pagtukod, paghatud ug pagpadagan sa bisan unsang palibot, nga gitugotan kami nga makatipig sa mga kapanguhaan sa CPU ug RAM. Dugang pa niini (ug alang sa uban kini ang labing hinungdanon nga butang) Gitugotan kami ni Docker nga labi ka mapasimple ug mahiusa ang pagdumala sa siklo sa kinabuhi sa among mga palibot sa produksiyon.

Bisan pa, kining tanan nga mga kalipayan sa modernong kinabuhi adunay usa ka bili. Kung nagpadagan kami og mga sudlanan, nag-download o naghimo sa among kaugalingon nga mga imahe, ug nag-deploy sa mga komplikado nga ekosistema, kinahanglan namon nga magbayad. Ug nagbayad kami, taliwala sa ubang mga butang, nga adunay espasyo sa disk.

Kung wala pa nimo mahunahuna kung unsa kadaghan ang espasyo nga gigamit sa Docker sa imong makina, tingali dili ka matingala sa output niini nga mando:

$ docker system df

Mga Tip sa Docker: Kuhaa ang imong makina sa basura

Gipakita niini ang paggamit sa disk ni Docker sa lainlaing mga konteksto:

  • mga imahe - ang kinatibuk-ang gidak-on sa mga imahe nga gi-download gikan sa mga repository sa imahe ug gitukod sa imong sistema;
  • mga sudlanan – ang kinatibuk-ang gidaghanon sa disk space nga gigamit sa nagdagan nga mga sudlanan (nagpasabot ang kinatibuk-ang gidaghanon sa read-write layers sa tanang sudlanan);
  • lokal nga mga volume - ang gidaghanon sa lokal nga pagtipig nga gitaod sa mga sudlanan;
  • pagtukod og cache - temporaryo nga mga file nga gihimo sa proseso sa pagtukod sa imahe (gamit ang tool sa BuildKit, magamit sugod sa bersyon sa Docker 18.09).

Pusta ko nga pagkahuman niining yano nga pagbalhin matinguhaon ka nga limpyohan ang imong disk sa basura ug ibalik ang kinabuhi sa mga mahal nga gigabytes (pahinumdom: labi na kung nagbayad ka sa abang alang niini nga mga gigabyte matag bulan).

Paggamit sa disk pinaagi sa mga sudlanan

Matag higayon nga maghimo ka usa ka sudlanan sa host machine, daghang mga file ug direktoryo ang gihimo sa / var / lib / docker nga direktoryo, diin ang mga musunud angay nga matikdan:

  • Direktoryo /var/lib/docker/containers/container_ID – kung gamiton ang standard logging driver, dinhi gi-save ang mga event log sa JSON format. Ang sobra ka detalyado nga mga troso, ingon man ang mga troso nga walay usa nga nagbasa o nagproseso, kasagaran hinungdan nga ang mga disk mapuno.
  • Ang /var/lib/docker/overlay2 nga direktoryo naglangkob sa sudlanan nga read-write nga mga layer (ang overlay2 mao ang gusto nga drayber sa kadaghanan sa mga distribusyon sa Linux). Kung ang sudlanan nagtipig sa datos sa sistema sa file niini, nan kini nga direktoryo nga kini ibutang.

Atong mahanduraw ang usa ka sistema diin ang usa ka putli nga Docker na-install, nga wala pa maapil sa paglansad sa mga sudlanan o paghimo og mga imahe. Ang taho sa paggamit sa espasyo sa disk niini ingon niini:

$ 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

Atong ilunsad ang pipila ka sudlanan, pananglitan, NGINX:

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

Unsa ang mahitabo sa disk:

  • ang mga imahe nag-okupar sa 126 MB, kini ang parehas nga NGINX nga among gilunsad sa sudlanan;
  • Ang mga sudlanan adunay usa ka kataw-anan nga 2 bytes.

$ 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

Sa paghukom sa konklusyon, wala pa kita'y bisan unsang luna nga mahimo natong buhian. Tungod kay ang 2 bytes bug-os nga walay hinungdan, atong hunahunaon nga ang atong NGINX wala damha misulat sa usa ka dapit nga 100 Megabytes sa datos ug naghimo sa usa ka file test.img sa tukma niini nga gidak-on sa sulod mismo.

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

Atong susihon pag-usab ang disk space sa paggamit sa host. Atong makita nga ang sudlanan (mga sudlanan) nag-okupar sa 100 Megabytes didto.

$ 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

Sa akong hunahuna ang imong mausisaon nga utok naghunahuna na kung asa nahimutang ang among test.img file. Pangitaon nato kini:

$ 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

Sa walay pag-adto sa mga detalye, atong matikdan nga ang test.img file kay haom nga nahimutang sa read-write level, nga kontrolado sa overlay2 driver. Kon atong hunongon ang atong sudlanan, ang tagbalay mosulti kanato nga kini nga luna mahimo, sa prinsipyo, mapagawas:

# 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

Unsaon nato pagbuhat niini? Pinaagi sa pagtangtang sa sudlanan, nga maglakip sa paghawan sa katugbang nga wanang sa lebel sa pagbasa-sulat.

Uban sa mosunud nga mando, mahimo nimong tangtangon ang tanan nga na-install nga mga sudlanan sa usa ka nahulog ug limpyohan ang imong disk sa tanan nga read-write nga mga file nga gihimo nila:

$ 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

Busa, gibuhian namo ang 104,9 Megabytes pinaagi sa pagtangtang sa sudlanan. Apan tungod kay wala na namo gigamit ang na-download na nga imahe, nahimo usab kini nga kandidato alang sa pagtangtang ug pagpahigawas sa among mga kapanguhaan:

$ 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

Pahinumdom: Hangtud nga ang imahe gigamit sa labing menos usa ka sudlanan, dili nimo magamit kini nga lansis.

Ang prune subcommand nga among gigamit sa ibabaw adunay epekto lamang sa nahunong nga mga sudlanan. Kung gusto namong papason dili lang mihunong apan nagdagan usab nga mga sudlanan, kinahanglan namong gamiton ang usa niini nga mga sugo:

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

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

Mga nota sa kilid: kung gamiton nimo ang -rm parameter sa pagsugod sa usa ka sudlanan, unya kung kini mohunong, ang tanan nga wanang sa disk nga giokupar niini mapagawas.

Paggamit sa mga imahe sa disk

Pipila ka tuig na ang milabay, ang gidak-on sa imahe nga pila ka gatos ka megabytes hingpit nga normal: ang imahe sa Ubuntu mitimbang og 600 megabytes, ug ang imahe sa Microsoft .Net adunay gibug-aton nga daghang gigabytes. Nianang mga adlaw nga balhibo, ang pag-download sa usa lang ka imahe mahimo’g magkinahanglan usa ka dako nga kadaot sa imong libre nga wanang sa disk, bisan kung nag-ambit ka sa lebel sa taliwala sa mga imahe. Karong adlawa - pagdayeg sa mga bantugan - ang mga hulagway mas ubos ang gibug-aton, apan bisan pa niana, mahimo nimo nga dali nga pun-on ang anaa nga mga kapanguhaan kung dili ka mag-amping.

Adunay ubay-ubay nga matang sa mga hulagway nga dili direktang makita sa end user:

  • intermediate nga mga imahe, base sa kung diin ang ubang mga imahe nakolekta - dili kini mapapas kung mogamit ka mga sudlanan nga gibase sa kini nga "ubang" mga imahe;
  • Ang nagbitay nga mga imahe kay mga intermediate nga mga imahe nga wala gi-refer sa bisan unsang nagdagan nga mga sudlanan - mahimo silang mapapas.
  • Uban sa mosunod nga sugo mahimo nimong susihon ang nagbitay nga mga imahe sa imong sistema:

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

Mahimo nimong tangtangon sila sa mosunod nga paagi:

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

Mahimo usab natong gamiton ang prune subcommand:

$ 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

Kung kalit namong gusto nga tangtangon ang tanan nga mga imahe (ug dili lang nagbitay) sa usa ka mando, mahimo naton kini:

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

Paggamit sa disk pinaagi sa mga volume

Ang mga volume gigamit sa pagtipig sa datos sa gawas sa file system sa sudlanan. Pananglitan, kung gusto natong i-save ang mga resulta sa usa ka aplikasyon aron magamit kini sa laing paagi. Usa ka komon nga pananglitan mao ang mga database.

Atong ilunsad ang usa ka sudlanan sa MongoDB, i-mount ang usa ka volume sa gawas sa sudlanan, ug ibalik ang usa ka backup sa database gikan niini (naa kini magamit sa bck.json file):

# 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

Ang datos mahimutang sa host machine sa /var/lib/docker/volume directory. Apan nganong dili sa read-write level sa sudlanan? Tungod kay sa Dockerfile sa MongoDB nga imahe, ang / data / db nga direktoryo (diin ang MongoDB nagtipig sa datos niini pinaagi sa default) gihubit ingon usa ka volume.

Mga Tip sa Docker: Kuhaa ang imong makina sa basura

Side note: daghang mga hulagway nga kinahanglang maghimo ug data naggamit ug mga volume aron tipigan ang maong datos.

Kung igo na ang among pagdula sa MongoDB ug hunongon (o tingali tangtangon pa) ang sulud, ang volume dili matangtang. Magpadayon kini sa pagkuha sa among bililhon nga disk space hangtod nga klaro namon nga mapapas kini gamit ang usa ka mando nga sama niini:

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

Aw, o mahimo natong gamiton ang prune subcommand nga pamilyar na kanato:

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

Paggamit sa disk alang sa paghimo sa imahe nga cache

Sa Docker 18.09, ang proseso sa paghimo sa imahe nakaagi sa pipila ka mga pagbag-o salamat sa tool sa BuildKit. Kini nga butang nagdugang sa katulin sa proseso ug nag-optimize sa pagtipig sa datos ug pagdumala sa seguridad. Dinhi dili nato tagdon ang tanang mga detalye niining talagsaon nga himan; atong ipunting lamang kung giunsa kini pagsulbad sa mga isyu sa paggamit sa disk space.

Ingnon ta nga kami adunay usa ka hingpit nga yano nga aplikasyon sa Node.Js:

  • ang index.js file nagsugod sa usa ka yano nga HTTP server nga motubag sa usa ka linya sa matag hangyo nga nadawat:
  • ang package.json file naghubit sa mga dependency, diin ang expressjs lang ang gigamit sa pagpadagan sa HTTP server:

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

Ang Dockerfile alang sa pagtukod sa imahe ingon niini:

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

Atong tukuron ang imahe sa naandan nga paagi, nga wala gigamit ang BuildKit:

$ docker build -t app:1.0 .

Kung atong susihon ang paggamit sa espasyo sa disk, atong makita nga ang base lamang nga imahe (node:13-alpine) ug ang target nga imahe (app:1.0) ang nagkuhag wanang:

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

Atong tukuron ang ikaduhang bersyon sa atong aplikasyon, gamit ang BuildKit. Aron mahimo kini, kinahanglan lang namon nga ibutang ang DOCKER_BUILDKIT variable sa 1:

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

Kung atong susihon karon ang paggamit sa disk, atong makita nga ang build cache (buid-cache) naapil na didto:

$ 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

Aron malimpyohan kini, gamita ang mosunod nga sugo:

$ 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

Klaro tanan!

Busa, among gitan-aw ang paglimpyo sa disk space nga giokupar sa mga sudlanan, mga hulagway ug mga volume. Ang prune subcommand makatabang kanato niini. Apan mahimo usab kini gamiton sa lebel sa docker system, ug limpyohan niini ang tanan nga mahimo niini:

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

Kung sa usa ka hinungdan nga nagtipig ka sa wanang sa disk sa usa ka makina nga nagdagan sa Docker, unya ang pagpadagan sa kini nga mando kinahanglan nga mahimong usa ka batasan.

Source: www.habr.com

Idugang sa usa ka comment