Malangizo a Docker: Chotsani makina anu opanda pake

Malangizo a Docker: Chotsani makina anu opanda pake

Pa Habr! Ndikupereka kwa inu kumasulira kwa nkhaniyi "Malangizo a Docker: Yeretsani Makina Anu Anu" wolemba Luc Juggery.

Lero tikambirana momwe Docker amagwiritsira ntchito malo a disk a makina osungira, ndipo tiwonanso momwe tingatulutsire malowa kuchokera ku zidutswa za zithunzi zosagwiritsidwa ntchito ndi zotengera.


Malangizo a Docker: Chotsani makina anu opanda pake

Kudya kwathunthu

Docker ndi chinthu chabwino, mwina anthu ochepa amakayikira lero. Zaka zingapo zapitazo, mankhwalawa adatipatsa njira yatsopano yopangira, kutumiza ndi kuyendetsa chilengedwe chilichonse, kutilola kuti tipulumutse kwambiri CPU ndi RAM. Kuphatikiza pa izi (ndipo kwa ena ichi chidzakhala chinthu chofunikira kwambiri) Docker watilola ife kufewetsa modabwitsa ndikugwirizanitsa kasamalidwe ka moyo wa malo omwe timapanga.

Komabe, zokondweretsa zonsezi za moyo wamakono zimabwera pamtengo. Tikamayendetsa zotengera, kutsitsa kapena kupanga zithunzi zathu, ndikuyika zachilengedwe zovuta, tiyenera kulipira. Ndipo timalipira, mwa zina, ndi disk space.

Ngati simunaganizepo za kuchuluka kwa malo omwe Docker amatenga pamakina anu, mutha kudabwa ndi kutulutsa kwa lamuloli:

$ docker system df

Malangizo a Docker: Chotsani makina anu opanda pake

Izi zikuwonetsa kugwiritsidwa ntchito kwa disk ya Docker m'malo osiyanasiyana:

  • zithunzi - kukula konse kwa zithunzi zomwe zidatsitsidwa kuchokera kumalo osungirako zithunzi ndikumangidwa pamakina anu;
  • nkhokwe - kuchuluka kwa malo a disk omwe amagwiritsidwa ntchito poyendetsa zotengera (kutanthauza kuchuluka kwa zigawo zowerengera zolembera zonse);
  • ma voliyumu am'deralo - kuchuluka kwa zosungirako zomwe zayikidwa m'mitsuko;
  • pangani cache - mafayilo osakhalitsa opangidwa ndi njira yopangira zithunzi (pogwiritsa ntchito chida cha BuildKit, chopezeka kuyambira ndi Docker version 18.09).

Ndikubetcha kuti mutatha kusamutsa kosavuta uku mukufunitsitsa kuyeretsa disk yanu ya zinyalala ndikubweretsanso ma gigabytes amtengo wapatali (zindikirani: makamaka ngati mumalipira lendi ya gigabytes mwezi uliwonse).

Kugwiritsa ntchito Disk ndi makontena

Nthawi iliyonse mukapanga chidebe pamakina osungira, mafayilo angapo ndi maupangiri amapangidwa mu / var/lib/docker chikwatu, mwa zomwe zotsatirazi ndi zofunika kuzindikila:

  • Directory /var/lib/docker/containers/container_ID - mukamagwiritsa ntchito dalaivala wamba yodula mitengo, apa ndipamene zipika za zochitika zimasungidwa mumtundu wa JSON. Zipika zatsatanetsatane, komanso zipika zomwe palibe amene amawerenga kapena kuzikonza mwanjira ina, nthawi zambiri zimapangitsa kuti ma disks azikhala odzaza.
  • Chikwatu cha /var/lib/docker/overlay2 chili ndi zigawo zowerengera-zolemba (overlay2 ndiye dalaivala yemwe amakonda kwambiri magawo ambiri a Linux). Ngati chidebecho chimasunga deta mu fayilo yake, ndiye kuti ili mu bukhuli lomwe lidzayikidwa.

Tiyerekeze dongosolo lomwe Pristine Docker imayikidwa, yomwe sinayambe yakhudzidwapo pakuyambitsa zida kapena kupanga zithunzi. Lipoti lake la kugwiritsidwa ntchito kwa disk space liwoneka motere:

$ 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

Tiyeni tiyambitse chidebe china, mwachitsanzo, NGINX:

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

Zomwe zimachitika pa disk:

  • zithunzi zimatenga 126 MB, iyi ndi NGINX yomweyo yomwe tidayambitsa mu chidebe;
  • zotengera zimatenga mopusa 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

Mwakuyeruzgiyapu, titenere kuΕ΅anaΕ΅aniya venivi. Popeza ma byte a 2 ndi opanda pake kwathunthu, tiyeni tiyerekeze kuti NGINX yathu mosayembekezereka inalemba penapake 100 Megabytes ya deta ndikupanga fayilo test.img ya ndendende kukula uku mkati mwake.

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

Tiyeni tiwone momwe disk space imagwiritsidwira ntchito pa host host kachiwiri. Tiwona kuti chidebe (zotengera) chimakhala ndi 100 Megabytes pamenepo.

$ 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

Ndikuganiza kuti ubongo wanu wofuna kudziwa ukudabwa kale komwe fayilo yathu ya test.img ili. Tiyeni tifufuze:

$ 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

Popanda kulowa mwatsatanetsatane, titha kuzindikira kuti fayilo ya test.img imapezeka mosavuta pamlingo wowerengera, woyendetsedwa ndi woyendetsa overlay2. Tikayimitsa chidebe chathu, wolandirayo adzatiuza kuti danga ili likhoza kumasulidwa:

# 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

Kodi tingachite bwanji zimenezi? Pochotsa chidebecho, zomwe zidzaphatikize kuchotsa malo oyenerera pamlingo wowerengera.

Ndi lamulo lotsatirali, mutha kuchotsa zotengera zonse zomwe zayikidwa munjira imodzi ndikuchotsa disk yanu pamafayilo onse owerengera omwe adapangidwa nawo:

$ 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

Chifukwa chake, tidamasula 104,9 Megabytes pochotsa chidebecho. Koma popeza sitigwiritsanso ntchito chithunzi chomwe chidatsitsidwa m'mbuyomu, chimakhalanso chofuna kuchotsa ndi kumasula zinthu zathu:

$ 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

Chidziwitso: Malingana ngati chithunzichi chikugwiritsidwa ntchito ndi chidebe chimodzi, simungathe kugwiritsa ntchito chinyengochi.

Prune subcommand yomwe tidagwiritsa ntchito pamwambapa imangokhudza zotengera zoyimitsidwa. Ngati tikufuna kuchotsa osati kungoyimitsa komanso zotengera, tiyenera kugwiritsa ntchito limodzi mwa malamulo awa:

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

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

Zolemba zam'mbali: ngati mugwiritsa ntchito -rm parameter poyambitsa chidebe, ndiye ikayima, malo onse a disk omwe adakhala nawo adzamasulidwa.

Kugwiritsa ntchito zithunzi za disk

Zaka zingapo zapitazo, kukula kwa chithunzi cha ma megabytes mazana angapo kunali koyenera: chithunzi cha Ubuntu chimalemera ma megabytes 600, ndipo chithunzi cha Microsoft .Net chinalemera magigabytes angapo. M'masiku ovutawa, kutsitsa chithunzi chimodzi chokha kumatha kuwononga kwambiri malo anu aulere a disk, ngakhale mutagawana magawo pakati pa zithunzi. Masiku ano - kutamandidwa kwakukulu - zithunzi zimalemera kwambiri, koma ngakhale zili choncho, mutha kudzaza zinthu zomwe zilipo ngati simusamala.

Pali mitundu ingapo ya zithunzi zomwe sizimawonekera mwachindunji kwa wogwiritsa ntchito:

  • zithunzi zapakatikati, pamaziko omwe zithunzi zina zimasonkhanitsidwa - sizingachotsedwe ngati mugwiritsa ntchito zotengera kutengera zithunzi "zina" izi;
  • zithunzi zolendewera ndi zithunzi zapakatikati zomwe sizinatchulidwe ndi zotengera zilizonse - zitha kuchotsedwa.
  • Ndi lamulo ili mutha kuyang'ana zithunzi zolendewera pakompyuta yanu:

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

Mutha kuwachotsa motere:

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

Titha kugwiritsanso ntchito 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

Ngati mwadzidzidzi tikufuna kuchotsa zithunzi zonse palimodzi (osati kungolendewera) ndi lamulo limodzi, ndiye titha kuchita izi:

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

Kugwiritsa ntchito diski ndi voliyumu

Ma voliyumu amagwiritsidwa ntchito kusunga deta kunja kwa fayilo ya chidebecho. Mwachitsanzo, ngati tikufuna kusunga zotsatira za pulogalamu kuti tigwiritse ntchito mwanjira ina. Chitsanzo chofala ndi nkhokwe.

Tiyeni tiyambitse chidebe cha MongoDB, kwezani voliyumu kunja kwa chidebecho, ndikubwezeretsanso zosunga zobwezeretsera kuchokera pamenepo (tili nazo mufayilo ya 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

Detayo ipezeka pamakina olandila mu /var/lib/docker/volumes directory. Koma bwanji osakhala pamlingo wowerengera-wolemba wa chidebecho? Chifukwa mu Dockerfile ya chithunzi cha MongoDB, chikwatu cha / data/db (kumene MongoDB imasunga deta yake mwachisawawa) imatanthauzidwa ngati voliyumu.

Malangizo a Docker: Chotsani makina anu opanda pake

M'mbali: zithunzi zambiri zomwe zimayenera kutulutsa deta zimagwiritsa ntchito ma voliyumu kuti zisungidwe.

Tikasewera mokwanira ndi MongoDB ndikuyimitsa (kapena mwina kuchotsa) chidebecho, voliyumuyo sidzachotsedwa. Idzapitilira kutenga malo athu amtengo wapatali a disk mpaka titawachotsa mwatsatanetsatane ndi lamulo monga ili:

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

Chabwino, kapena titha kugwiritsa ntchito prune subcommand yomwe timaidziwa kale:

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

Gwiritsani ntchito disk kuti mupange cache ya zithunzi

Mu Docker 18.09, njira yopangira zithunzi yasintha chifukwa cha chida cha BuildKit. Chinthu ichi chimawonjezera liwiro la ndondomekoyi ndikuwongolera kusungirako deta ndi kasamalidwe ka chitetezo. Pano sitingaganizire tsatanetsatane wa chida chodabwitsachi; tidzangoyang'ana momwe chimayankhira nkhani za kugwiritsa ntchito malo a disk.

Tiyerekeze kuti tili ndi pulogalamu ya Node.Js yosavuta:

  • index.js imayamba seva yosavuta ya HTTP yomwe imayankha ndi mzere pazopempha zilizonse zomwe zalandiridwa:
  • fayilo ya package.json imatanthawuza zodalira, zomwe Expressjs yokha imagwiritsidwa ntchito kuyendetsa seva ya 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"
      }
    }

Dockerfile yopangira chithunzicho ikuwoneka motere:

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

Tiyeni timange chithunzicho mwachizolowezi, osagwiritsa ntchito BuildKit:

$ docker build -t app:1.0 .

Ngati tiyang'ana kagwiritsidwe ntchito ka disk space, titha kuwona kuti chithunzi choyambira (node: 13-alpine) ndi chithunzi chomwe mukufuna (pulogalamu: 1.0) chikutenga malo:

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

Tiyeni tipange mtundu wachiwiri wa pulogalamu yathu, pogwiritsa ntchito BuildKit. Kuti tichite izi, tikungofunika kukhazikitsa DOCKER_BUILDKIT kusinthasintha kukhala 1:

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

Ngati tiwona momwe disk ikugwiritsidwira ntchito, tiwona kuti cache yomanga (buid-cache) tsopano ikukhudzidwa:

$ 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

Kuti muchotse, gwiritsani ntchito lamulo ili:

$ 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

Chotsani zonse!

Chifukwa chake, tidayang'ana pakuyeretsa malo a disk omwe amakhala ndi zotengera, zithunzi ndi ma voliyumu. Prune subcommand imatithandiza pa izi. Koma itha kugwiritsidwanso ntchito pamlingo wa docker system, ndipo imayeretsa chilichonse chomwe ingathe:

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

Ngati pazifukwa zina mukusunga malo a disk pamakina omwe akuyendetsa Docker, ndiye kuti nthawi ndi nthawi kuyendetsa lamuloli kuyenera kukhala chizolowezi.

Source: www.habr.com

Kuwonjezera ndemanga