Soso-kevitra Docker: Esory ny masin'ny junk

Soso-kevitra Docker: Esory ny masin'ny junk

Hey Habr! Atolotro ho anareo ny fandikana ilay lahatsoratra "Torohevitra Docker: Manadio ny milina eo an-toerana" ny mpanoratra Luc Juggery.

Androany isika dia hiresaka momba ny fomba fampiasan'i Docker ny habaka kapila an'ny milina mpampiantrano, ary hojerentsika koa ny fomba hanafahana an'io habaka io amin'ny sombin-tsary sy fitoeran-javatra tsy ampiasaina.


Soso-kevitra Docker: Esory ny masin'ny junk

Fanjifana tanteraka

Docker dia zavatra mahafinaritra, angamba vitsy ny olona misalasala izany ankehitriny. Taona vitsy lasa izay, ity vokatra ity dia nanome antsika fomba vaovao hanorina, hanaterana ary hampandehanana ny tontolo iainana rehetra, ahafahantsika mitahiry betsaka ny loharanon-karena CPU sy RAM. Ho fanampin'izany (ary ho an'ny sasany izany no zava-dehibe indrindra) Docker dia namela antsika hanatsotra sy hampiray ny fitantanana ny tontolon'ny famokarana.

Na izany aza, ireo zavatra mahafinaritra rehetra eo amin'ny fiainana maoderina dia misy vidiny. Rehefa mitantana kaontenera isika, misintona na mamorona ny sarintsika manokana, ary mametraka tontolo iainana sarotra dia tsy maintsy mandoa. Ary mandoa vola izahay, ankoatra ny zavatra hafa, miaraka amin'ny habaka kapila.

Raha mbola tsy nieritreritra ny habetsahan'ny habaka azon'i Docker amin'ny milinanao ianao dia mety ho gaga amin'ny famoahana an'ity baiko ity:

$ docker system df

Soso-kevitra Docker: Esory ny masin'ny junk

Ity dia mampiseho ny fampiasana kapila nataon'i Docker amin'ny toe-javatra samihafa:

  • sary – ny fitambaran'ny haben'ny sary nalaina avy amin'ny fitahirizana sary ary natsangana tamin'ny rafitrao;
  • kaontenera - ny totalin'ny habaka kapila ampiasaina amin'ny fampandehanana kaontenera (midika ny totalin'ireo sosona mamaky-manoratra amin'ny fitoeran-javatra rehetra);
  • boky eo an-toerana - ny habetsaky ny fitehirizana eo an-toerana napetraka amin'ny kaontenera;
  • manangana cache - rakitra vonjimaika novokarin'ny fizotry ny fananganana sary (mampiasa ny fitaovana BuildKit, azo alaina manomboka amin'ny Docker version 18.09).

Manantena aho fa aorian'ity famindrana tsotra ity dia maniry ny hanadio ny kapilanao amin'ny fako ianao ary hamerina ny gigabytes sarobidy (fanamarihana: indrindra raha mandoa hofan'ireo gigabytes ireo isam-bolana ianao).

Fampiasana kapila amin'ny kaontenera

Isaky ny mamorona container amin'ny milina mpampiantrano ianao, dia misy rakitra sy lahatahiry maromaro noforonina ao amin'ny lahatahiry / var / lib / docker, ka anisan'izany ireto manaraka ireto:

  • Directory /var/lib/docker/containers/container_ID - rehefa mampiasa ny mpamily logging mahazatra, dia io no voatahiry ao amin'ny format JSON. Ny logs amin'ny antsipiriany loatra, ary koa ny logs izay tsy misy mamaky na manao zavatra hafa, dia matetika mahatonga ny kapila ho feno.
  • Ny lahatahiry / var / lib / docker / overlay2 dia misy ny sosona mamaky-manoratra container (overlay2 no mpamily tiana indrindra amin'ny ankamaroan'ny fizarana Linux). Raha mitahiry angon-drakitra ao amin'ny rafitra fichier ny container, dia ao anatin'io lahatahiry io no hametrahana azy.

Alao sary an-tsaina ny rafitra iray ametrahana Docker madio, izay tsy mbola nandray anjara tamin'ny fandefasana kaontenera na fananganana sary. Ny tatitra momba ny fampiasana habaka kapila dia ho toy izao:

$ 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

Andao hanomboka fitoeran-javatra sasany, ohatra, NGINX:

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

Inona no mitranga amin'ny kapila:

  • manana 126 MB ny sary, io NGINX io ihany no navoakanay tao anaty kaontenera;
  • kaontenera dia maka 2 bytes mahatsikaiky.

$ 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

Raha jerena amin'ny fehin-kevitra dia tsy mbola manana toerana azo avela isika. Satria ny 2 bytes dia tsy misy dikany tanteraka, andao alaivo sary an-tsaina fa ny NGINX antsika dia nanoratra tsy nampoizina 100 Megabytes ny angona ary namorona fichier test.img amin'io habeny io ao anatiny.

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

Andeha hojerentsika indray ny fampiasana habaka disk amin'ny mpampiantrano. Ho hitantsika fa ny kaontenera (container) dia manana 100 Megabytes ao.

$ 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

Heveriko fa efa manontany tena ny atidohanao tia karokaroka hoe aiza no misy ny fichier test.img antsika. Andeha hojerentsika izany:

$ 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

Raha tsy miditra amin'ny antsipiriany isika dia afaka manamarika fa ny rakitra test.img dia mety amin'ny ambaratonga mamaky-manoratra, fehezin'ny mpamily overlay2. Raha ajanonay ny fitoeranay, dia hilaza aminay ny mpampiantrano fa afaka malalaka io habaka io raha ny tokony ho izy:

# 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

Ahoana no ahafahantsika manao izany? Amin'ny famafana ny kaontenera, izay mitaky ny famafana ny habaka mifanaraka amin'izany amin'ny ambaratonga mamaky-manoratra.

Amin'ny alalan'ity baiko manaraka ity dia azonao atao ny manaisotra ireo kaontenera napetraka rehetra ao anatin'ny indray mipi-maso ary manaisotra ny rakitra vakiana rehetra noforonin'izy ireo:

$ 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

Noho izany, nanafaka 104,9 Megabytes izahay tamin'ny famafana ilay fitoeran-javatra. Saingy satria tsy mampiasa ny sary efa nalaina teo aloha intsony izahay, dia lasa kandidΓ  hamafa sy hanafaka ny loharanonay ihany koa izy:

$ 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

Fanamarihana: Raha mbola ampiasain'ny kaontenera iray farafahakeliny ny sary, dia tsy ho afaka hampiasa an'io fika io ianao.

Ny subcommand prune izay nampiasainay etsy ambony dia tsy misy fiantraikany amin'ny kaontenera mijanona. Raha te-hamafa tsy mijanona fotsiny isika fa mihazakazaka koa, dia tokony hampiasa ny iray amin'ireto baiko ireto:

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

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

Fanamarihana amin'ny sisiny: raha mampiasa ny -rm parameter ianao rehefa manomboka fitoeran-javatra iray, dia rehefa mijanona izany dia ho afaka ny habaka kapila rehetra nipetrahany.

Mampiasa sary kapila

Taona vitsy lasa izay, ny haben'ny sary an-jatony megabytes dia ara-dalΓ na tanteraka: ny sarin'ny Ubuntu dia milanja 600 megabytes, ary ny sarin'ny Microsoft .Net dia milanja gigabytes maromaro. Amin'ireny andro manjavozavo ireny, ny fampidinana sary iray monja dia mety hitera-doza lehibe amin'ny habaka kapila maimaim-poana, na dia mifampizara ambaratonga eo amin'ny sary aza ianao. Androany - deraina ho an'ny lehibe - ny sary dia mavesatra kokoa, saingy na izany aza, dia afaka mameno haingana ny loharano misy ianao raha tsy mitandrina.

Misy karazana sary maromaro tsy hita mivantana amin'ny mpampiasa farany:

  • sary manelanelana, mifototra amin'ny fanangonana sary hafa - tsy azo esorina izy ireo raha mampiasa kaontenera mifototra amin'ireo sary "hafa" ireo ianao;
  • sary mihantona dia sary manelanelana izay tsy resahin'ny kaontenera mihazakazaka - azo esorina izy ireo.
  • Miaraka amin'ity baiko manaraka ity dia azonao atao ny manamarina ny sary mihantona amin'ny rafitrao:

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

Azonao atao ny manala azy ireo amin'ny fomba manaraka:

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

Azontsika atao koa ny mampiasa ny subcommand 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

Raha te-hamafa tampoka ny sary rehetra isika (fa tsy mihantona fotsiny) amin'ny baiko iray, dia afaka manao izao isika:

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

Fampiasana kapila araka ny habeny

Ampiasaina hitehirizana angona ivelan'ny rafitra fichier an'ny fitoeran-javatra ny volumes. Ohatra, raha te-hitahiry ny valin'ny fampiharana iray isika mba hampiasana azy ireo amin'ny fomba hafa. Ny ohatra mahazatra dia ny angon-drakitra.

Andeha isika hanomboka ny kaontenera MongoDB, hametraka boky ivelan'ny kaontenera, ary hamerina ny backup angona avy aminy (misy azy ao amin'ny rakitra 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

Ny angon-drakitra dia ho hita ao amin'ny milina mpampiantrano ao amin'ny lahatahiry /var/lib/docker/volume. Fa maninona no tsy eo amin'ny ambaratonga mamaky-manoratra ny fitoeran-javatra? Satria ao amin'ny Dockerfile amin'ny sary MongoDB, ny / data / db lahatahiry (izay itahirizan'ny MongoDB ny angon-drakitra amin'ny alΓ lan'ny default) dia faritana ho boky.

Soso-kevitra Docker: Esory ny masin'ny junk

Fanamarihana sisiny: sary maro tsy maintsy mamokatra angona no mampiasa volabe hitahirizana izany data izany.

Rehefa milalao ampy amin'ny MongoDB isika ary mijanona (na mety mamafa mihitsy aza) ny fitoeran-javatra, dia tsy ho voafafa ny volume. Hanohy haka ny habaka kapila sarobidy misy antsika izy io mandra-pamafa azy mazava tsara amin'ny baiko toy izao:

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

Eny, na azontsika ampiasaina ny subcommand prune izay efa mahazatra antsika:

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

Mampiasa kapila ho an'ny fananganana sary cache

Ao amin'ny Docker 18.09, ny fizotran'ny famoronana sary dia nandalo fiovana vitsivitsy noho ny fitaovana BuildKit. Ity zavatra ity dia mampitombo ny hafainganam-pandehan'ny dingana ary manatsara ny fitahirizana angon-drakitra sy ny fitantanana ny fiarovana. Eto isika dia tsy handinika ny antsipirian'ity fitaovana mahafinaritra ity; hifantoka amin'ny fomba iatrehana ny olan'ny fampiasana habaka kapila isika.

Andeha atao hoe manana fampiharana Node.Js tsotra tanteraka isika:

  • ny rakitra index.js dia manomboka mpizara HTTP tsotra izay mamaly amin'ny tsipika isaky ny fangatahana voaray:
  • Ny rakitra package.json dia mamaritra ny fiankinan-doha, izay ny expressjs ihany no ampiasaina hampandehanana ny mpizara 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"
      }
    }

Ny Dockerfile amin'ny fananganana ny sary dia toy izao:

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

Andao hanangana ny sary amin'ny fomba mahazatra, tsy mampiasa BuildKit:

$ docker build -t app:1.0 .

Raha jerena ny fampiasana habaka kapila dia hita fa ny sary fototra (node:13-alpine) sy ny sary kendrena (app:1.0) ihany no maka toerana:

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

Andao hanangana ny dikan-teny faharoa amin'ny fampiharana, mampiasa BuildKit. Mba hanaovana izany dia mila mametraka ny fari-piadidiana DOCKER_BUILDKIT ho 1 fotsiny isika:

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

Raha mijery ny fampiasana kapila isika izao dia ho hitantsika fa ny fananganana cache (buid-cache) dia tafiditra ao:

$ 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

Mba hanesorana azy dia ampiasao ity baiko manaraka ity:

$ 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

Fafao daholo!

Noho izany, nijery ny fanadiovana ny habaka kapila misy kaontenera, sary ary boky izahay. Ny subcommand prune dia manampy antsika amin'izany. Saingy azo ampiasaina amin'ny haavon'ny rafitra docker ihany koa izy io, ary hanadio izay rehetra azony atao:

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

Raha toa ka mitahiry habaka kapila amin'ny milina mandeha Docker ianao noho ny antony iray, dia tokony ho lasa fahazarana ny fampandehanana tsindraindray ity baiko ity.

Source: www.habr.com

Add a comment