Vidokezo vya Docker: Safisha mashine yako ya takataka

Vidokezo vya Docker: Safisha mashine yako ya takataka

Habari Habr! Ninawasilisha kwa mawazo yako tafsiri ya makala "Vidokezo vya Docker: Safisha Mashine Yako ya Karibu" mwandishi Luc Juggery.

Leo tutazungumza juu ya jinsi Docker hutumia nafasi ya diski ya mashine ya mwenyeji, na pia tutagundua jinsi ya kufungia nafasi hii kutoka kwa mabaki ya picha na vyombo visivyotumiwa.


Vidokezo vya Docker: Safisha mashine yako ya takataka

Jumla ya matumizi

Docker ni jambo zuri, labda watu wachache wanatilia shaka leo. Miaka michache tu iliyopita, bidhaa hii ilitupa njia mpya kabisa ya kujenga, kutoa na kuendesha mazingira yoyote, kuturuhusu kuokoa kwa kiasi kikubwa rasilimali za CPU na RAM. Kwa kuongezea hii (na kwa wengine hili litakuwa jambo muhimu zaidi) Docker imeturuhusu kurahisisha sana na kuunganisha usimamizi wa mzunguko wa maisha wa mazingira yetu ya uzalishaji.

Walakini, furaha hizi zote za maisha ya kisasa huja kwa bei. Tunapoendesha vyombo, kupakua au kuunda picha zetu wenyewe, na kupeleka mifumo changamano ya ikolojia, tunapaswa kulipa. Na tunalipa, kati ya mambo mengine, na nafasi ya disk.

Ikiwa haujawahi kufikiria ni nafasi ngapi Docker inachukua kwenye mashine yako, unaweza kushangazwa na matokeo ya amri hii:

$ docker system df

Vidokezo vya Docker: Safisha mashine yako ya takataka

Hii inaonyesha utumiaji wa diski ya Docker katika muktadha tofauti:

  • picha - saizi ya jumla ya picha ambazo zilipakuliwa kutoka kwa hazina za picha na kujengwa kwenye mfumo wako;
  • vyombo - jumla ya nafasi ya diski inayotumiwa na vyombo vinavyoendesha (maana ya jumla ya safu za kusoma-kuandika za vyombo vyote);
  • kiasi cha ndani - kiasi cha hifadhi ya ndani iliyowekwa kwenye vyombo;
  • jenga cache - faili za muda zinazozalishwa na mchakato wa kujenga picha (kwa kutumia zana ya BuildKit, inayopatikana kuanzia na toleo la Docker 18.09).

Ninaweka dau kwamba baada ya uhamishaji huu rahisi una hamu ya kusafisha diski yako ya takataka na kurudisha gigabytes za thamani kwenye maisha (kumbuka: haswa ikiwa unalipa kodi kwa gigabytes hizi kila mwezi).

Matumizi ya diski na vyombo

Kila wakati unapounda kontena kwenye mashine ya mwenyeji, faili na saraka kadhaa huundwa kwenye saraka ya /var/lib/docker, kati ya ambayo yafuatayo yanafaa kuzingatiwa:

  • Saraka /var/lib/docker/containers/container_ID - unapotumia kiendeshi cha kawaida cha ukataji miti, hapa ndipo kumbukumbu za matukio huhifadhiwa katika umbizo la JSON. Kumbukumbu za kina zaidi, pamoja na kumbukumbu ambazo hakuna mtu anayesoma au vinginevyo mchakato, mara nyingi husababisha disks kujaa.
  • Saraka ya /var/lib/docker/overlay2 ina tabaka za kusoma-kuandika za kontena (uwekeleaji2 ndio kiendeshi kinachopendekezwa katika usambazaji mwingi wa Linux). Ikiwa chombo huhifadhi data katika mfumo wake wa faili, basi ni katika saraka hii ambayo itawekwa.

Wacha tufikirie mfumo ambao Docker ya zamani imewekwa, ambayo haijawahi kuhusika katika kuzindua vyombo au picha za ujenzi. Ripoti yake ya utumiaji wa nafasi ya diski itaonekana kama hii:

$ 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

Wacha tuzindue chombo, kwa mfano, NGINX:

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

Nini kinatokea kwa diski:

  • picha zinachukua 126 MB, hii ni NGINX sawa ambayo tulizindua kwenye chombo;
  • vyombo huchukua baiti 2 za ujinga.

$ 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

Kwa kuzingatia hitimisho, bado hatuna nafasi ambayo tunaweza kuweka huru. Kwa kuwa baiti 2 ni frivolous kabisa, hebu fikiria kwamba NGINX yetu bila kutarajia iliandika mahali fulani Megabytes 100 za data na kuunda faili ya test.img ya ukubwa huu ndani yenyewe.

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

Wacha tuchunguze utumiaji wa nafasi ya diski kwenye mwenyeji tena. Tutaona kwamba chombo (vyombo) kinachukua Megabytes 100 huko.

$ 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

Nadhani ubongo wako mdadisi tayari unashangaa faili yetu ya test.img iko wapi. Hebu tutafute:

$ 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

Bila kuingia katika maelezo, tunaweza kutambua kwamba faili ya test.img iko kwa urahisi katika kiwango cha kusoma-kuandika, kudhibitiwa na kiendeshaji cha overlay2. Ikiwa tutasimamisha chombo chetu, mwenyeji atatuambia kuwa nafasi hii, kimsingi, inaweza kutolewa:

# 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

Tunawezaje kufanya hivyo? Kwa kufuta chombo, ambacho kitajumuisha kusafisha nafasi inayolingana katika kiwango cha kusoma-kuandika.

Kwa amri ifuatayo, unaweza kuondoa vyombo vyote vilivyosakinishwa kwa mkupuo mmoja na kufuta diski yako ya faili zote za kusoma-kuandika zilizoundwa nao:

$ 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

Kwa hivyo, tulifungua Megabytes 104,9 kwa kufuta kontena. Lakini kwa kuwa hatutumii tena picha iliyopakuliwa hapo awali, pia inakuwa mgombea wa kufuta na kufungia rasilimali zetu:

$ 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

Kumbuka: Alimradi picha inatumiwa na angalau chombo kimoja, hutaweza kutumia hila hii.

Amri ndogo ya kupogoa tuliyotumia hapo juu ina athari kwenye vyombo vilivyosimamishwa pekee. Ikiwa tunataka kufuta sio tu kusimamishwa lakini pia kuendesha vyombo, tunapaswa kutumia moja ya amri hizi:

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

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

Vidokezo vya upande: ikiwa unatumia -rm parameter wakati wa kuanzisha chombo, basi inapoacha, nafasi yote ya disk ambayo ilichukua itaachiliwa.

Kwa kutumia picha za diski

Miaka michache iliyopita, saizi ya picha ya megabytes mia kadhaa ilikuwa ya kawaida kabisa: picha ya Ubuntu ilikuwa na uzito wa megabytes 600, na picha ya Microsoft .Net ilipima gigabytes kadhaa. Katika siku hizo mbaya, kupakua picha moja tu kunaweza kuchukua nafasi kubwa kwenye diski yako, hata kama ulikuwa unashiriki viwango kati ya picha. Leo - sifa ziwe kwa mkuu - picha zina uzito mdogo, lakini hata hivyo, unaweza kujaza rasilimali zinazopatikana haraka ikiwa hautachukua tahadhari.

Kuna aina kadhaa za picha ambazo hazionekani moja kwa moja kwa mtumiaji wa mwisho:

  • picha za kati, kwa msingi ambao picha zingine hukusanywa - haziwezi kufutwa ikiwa unatumia vyombo kulingana na picha hizi "nyingine";
  • picha zinazoning'inia ni picha za kati ambazo hazijarejelewa na chombo chochote kinachoendesha - zinaweza kufutwa.
  • Kwa amri ifuatayo unaweza kuangalia picha zinazoning'inia kwenye mfumo wako:

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

Unaweza kuwaondoa kwa njia ifuatayo:

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

Tunaweza pia kutumia amri ndogo ya 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

Ikiwa tunataka ghafla kufuta picha zote kabisa (na sio tu kuning'inia) kwa amri moja, basi tunaweza kufanya hivi:

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

Matumizi ya diski kwa wingi

Kiasi hutumika kuhifadhi data nje ya mfumo wa faili wa chombo. Kwa mfano, ikiwa tunataka kuhifadhi matokeo ya programu ili kuyatumia kwa njia nyingine. Mfano wa kawaida ni hifadhidata.

Wacha tuzindue kontena ya MongoDB, weka sauti nje kwenye kontena, na urejeshe hifadhidata kutoka kwayo (tunayo inapatikana katika faili 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

Data itapatikana kwenye mashine mwenyeji kwenye saraka ya /var/lib/docker/volumes. Lakini kwa nini sio katika kiwango cha kusoma-kuandika cha chombo? Kwa sababu katika Dockerfile ya picha ya MongoDB, saraka /data/db (ambapo MongoDB huhifadhi data yake kwa chaguo-msingi) inafafanuliwa kama kiasi.

Vidokezo vya Docker: Safisha mashine yako ya takataka

Dokezo la kando: picha nyingi ambazo lazima zitoe data hutumia kiasi kuhifadhi data hiyo.

Tunapocheza vya kutosha na MongoDB na kuacha (au labda hata kufuta) chombo, kiasi hakitafutwa. Itaendelea kuchukua nafasi yetu ya thamani ya diski hadi tuifute waziwazi kwa amri kama hii:

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

Kweli, au tunaweza kutumia amri ndogo ya prune ambayo tayari inajulikana kwetu:

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

Kutumia diski kwa kache ya kujenga picha

Katika Docker 18.09, mchakato wa kuunda picha umepitia mabadiliko kadhaa kwa zana ya BuildKit. Jambo hili huongeza kasi ya mchakato na kuboresha uhifadhi wa data na usimamizi wa usalama. Hapa hatutazingatia maelezo yote ya chombo hiki cha ajabu, tutazingatia tu jinsi inavyoshughulikia masuala ya matumizi ya nafasi ya diski.

Wacha tuseme tunayo programu rahisi kabisa ya Node.Js:

  • faili ya index.js huanza seva rahisi ya HTTP inayojibu kwa mstari kwa kila ombi lililopokelewa:
  • package.json faili inafafanua utegemezi, ambao expressjs pekee hutumika kuendesha 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 ya kujenga picha inaonekana kama hii:

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

Wacha tujenge picha kwa njia ya kawaida, bila kutumia BuildKit:

$ docker build -t app:1.0 .

Tukiangalia matumizi ya nafasi ya diski, tunaweza kuona kwamba ni picha ya msingi pekee (nodi:13-alpine) na picha lengwa (programu:1.0) zinazochukua nafasi:

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

Wacha tujenge toleo la pili la programu yetu, kwa kutumia BuildKit. Ili kufanya hivyo, tunahitaji tu kuweka tofauti ya DOCKER_BUILDKIT hadi 1:

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

Ikiwa sasa tutaangalia utumiaji wa diski, tutaona kwamba kache ya ujenzi (buid-cache) sasa inahusika hapo:

$ 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

Ili kuifuta, tumia amri ifuatayo:

$ 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

Futa zote!

Kwa hiyo, tuliangalia kusafisha nafasi ya disk iliyochukuliwa na vyombo, picha na kiasi. Amri ndogo ya prune inatusaidia kwa hili. Lakini pia inaweza kutumika katika kiwango cha mfumo wa kizimbani, na itasafisha kila kitu kinachoweza:

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

Ikiwa kwa sababu fulani unahifadhi nafasi ya diski kwenye mashine inayoendesha Docker, basi mara kwa mara kutekeleza amri hii inapaswa kuwa tabia.

Chanzo: mapenzi.com

Kuongeza maoni