Docker Nasveti: Očistite svoj stroj od odpadkov

Docker Nasveti: Očistite svoj stroj od odpadkov

Pozdrav, Habr! Predstavljam vam prevod članka "Docker Nasveti: Očistite Svoj Lokalni Računalo" avtorja Luc Juggery.

Danes bomo govorili o tem, kako Docker uporablja diskovni prostor vašega gostiteljskega računalnika ter razjasnili, kako sprostiti ta prostor od ostankov neuporabljenih slik in kontejnerjev.


Docker Nasveti: Očistite svoj stroj od odpadkov

Skupna poraba

Docker je zelo kul stvar, verjetno danes malo kdo o tem dvomi. Pred samo nekaj leti je ta izdelek ponudil popolnoma nov način izdelave, dostave in zagona kateregakoli okolja, kar omogoča znatno varčevanje s procesorsko močjo in osnovnim pomnilnikom. Poleg tega (in za nekoga bo to morda najpomembnejše) je Docker omogočil neverjetno poenostavitev in unifikacijo upravljanja življenjskega cikla uporabljenih delovnih okolij.

Vendar pa za vse te prednosti sodobnega življenja je treba plačati. Ko zagnamo kontejnerje, prenašamo ali ustvarjamo lastne slike, postavljamo zapletene ekosisteme, je treba plačati. In plačujemo tudi z diskovnim prostorom.

Če nikoli niste razmišljali o tem, koliko prostora dejansko zaseda vaš Docker, lahko boste neprijetno presenečeni nad izidom te ukaze:

$ docker system df

Docker Nasveti: Očistite svoj stroj od odpadkov

Tukaj je prikazana uporaba diska Dockerja v različnih kategorijah:

  • slike (images) – skupna velikost slik, ki so bile prenesene iz skladiščnikov slik in zgrajene v vašem sistemu;
  • kontejnerji (containers) – skupen volumen diskovnega prostora, ki ga zasedajo zagnani kontejnerji (misli se na skupni volumen plasti za branje-in-pisanje vseh kontejnerjev);
  • lokalni volumni (local volumes) – volumen lokalnih skladišč, priključenih na kontejnerje;
  • predpomnilnik gradnje (build cache) – začasne datoteke, ki jih ustvari postopek gradnje slik (ob uporabi orodja BuildKit, ki je na voljo od različice Docker 18.09).

Veselim se, da ste po tem preprostem naštevanju pripravljeni očistiti disk od smeti in vrniti dragocene gigabajte (op. prev.: zlasti, če za te gigabajte vsak mesec plačujete najemnino).

Uporaba diska s kontejnerji

Vsakič, ko ustvarite kontejner na gostiteljskem računalniku, se v imeniku /var/lib/docker ustvari več datotek in imenikov, med katerimi je treba izpostaviti naslednje:

  • Katalog /var/lib/docker/containers/ID_kontejnerja – pri uporabi standardnega drajverja za beleženje se tukaj shranjujejo dnevniški zapisi dogodkov v JSON formatu. Preveč podrobni dnevniki, kot tudi dnevniki, ki jih nihče ne bere in ne obdeluje na druge načine, pogosto povzročajo prenapolnitev diskov.
  • Katalog /var/lib/docker/overlay2 – vsebuje sloje za branje in pisanje kontejnerjev (overlay2 – preferiran drajver v večini distribucij Linuxa). Če kontejner shranjuje podatke v svoj datotečni sistem, bodo ti podatki natančno tukaj shranjeni.

Predstavljajmo si sistem, na katerem je nameščen popolnoma nov Docker, ki še nikoli ni bil uporabljen za zagon kontejnerjev ali gradnjo slik. Njegovo poročilo o uporabi diskovnega prostora bo videti takole:

$ docker system df
TIP            SKUPAJ    AKTIVNI    VELIKOST    OBNOVLJIVO
Slike          0         0          0B         0B
Kontejnerji    0         0          0B         0B
Lokalni Volumi 0         0          0B         0B
Predpomnilnik  0         0          0B         0B

Zagnali bomo nek kontejner, na primer NGINX:

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

Kaj se zgodi z diskom:

  • slike (images) zasedajo 126 MB, in to je tisti NGINX, ki smo ga zagnali v kontejnerju;
  • kontejnerji (containers) zasedajo smešnih 2 bajta.

$ docker system df
TIP            SKUPAJ    AKTIVNI    VELIKOST    OBNOVLJIVO
Slike          1         1          126M       0B (0%)
Kontejnerji    1         1          2B         0B (0%)
Lokalni Volumi 0         0          0B         0B
Predpomnilnik  0         0          0B         0B

Sodeč po izhodu, še nimamo prostora, ki bi ga lahko osvobodili. Ker so 2 bajta povsem nepomembni, si predstavljajmo, da je naš NGINX nenadoma zapisal 100 Megabajtov podatkov in ustvaril znotraj sebe datoteko test.img prav te velikosti.

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

Spet raziskujemo uporabo diskovnega prostora na gostitelju. Videli bomo, da kontejner (containers) tam zaseda 100 Megabajtov.

$ docker system df
TIP            SKUPAJ    AKTIVNI    VELIKOST    OBNOVLJIVO
Slike          1         1          126M       0B (0%)
Kontejnerji    1         1          104.9MB    0B (0%)
Lokalni Volumi 0         0          0B         0B
Predpomnilnik  0         0          0B         0B

Mislim, da se vaše radovedne misli že sprašujejo, kje je naša datoteka test.img. Poiščimo jo:

$ 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

Brez podrobnosti lahko ugotovimo, da se je datoteka test.img udobno namestila na nivoju branja-in-obračanja, ki ga upravlja gonilnik overlay2. Če pa ustavimo naš vsebnik, nam gostitelj sporoči, da se to mesto lahko oslabi.

# 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

Kako lahko to storimo? Z brisanjem vsebnika, kar bo povzročilo čiščenje ustreznega prostora na nivoju branja-in-obračanja.

S pomočjo naslednjega ukaza lahko v enem koraku izbrišete vse nameščene vsebnike in očistite svoj disk vseh datotek, ki so jih ustvarili na nivoju branja-in-obračanja:

$ docker container prune
POZOR! To bo odstranilo vse ustavljene vsebnike.
Ali ste prepričani, da želite nadaljevati? [y/N] y
Izbrisani vsebniki:
5e7f8e5097ace9ef5518ebf0c6fc2062ff024efb495f11ccc89df21ec9b4dcc2

Skupaj pridobljeni prostor: 104,9MB

Torej, osvobodili smo 104,9 Megabajta z brisanjem vsebnika. Toda ker že ne uporabljamo prej prenesene slike, postane tudi ta kandidat za brisanje in osvoboditev naših virov:

$ docker system df
TIP           SKUPAJ      AKTIVNA     VELIKOST       OBNOVLJIVO
Slike         1          0          126M       126M (100%)
Vsebniki      0          0          0B         0B
Lokalni volumni  0          0          0B         0B
Predpomnilnik načrtovanja 0          0          0B         0B

Pozor: dokler se slika uporablja vsaj z enim vsebnikom, ne morete uporabiti tega trika.

Podukaz prune, ki smo ga uporabili zgoraj, je učinkovit le na ustavljenih vsebnikih. Če želimo odstraniti ne le zaustavljene, temveč tudi delujoče vsebnike, je treba uporabiti eno od teh ukazov:

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

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

Opombe na obrobju: če med zagonom vsebnika uporabite parameter —rm, bo ob zaustavitvi osvobojena vsa diska prostor, ki ga je zasedal.

Uporaba diska z slikami

Pred nekaj leti je bila velikost slike več sto megabajtov povsem normalna: slika Ubuntu je imela 600 Megabajtov, slika Microsoft .Net pa več gigabajtov. V tistih večnih časih je samo prenos slike lahko povzročil veliko škodo vašemu prostemu prostoru na disku, celo če ste delili nivoje med slikami. Danes – hvala velikim – slike tehtajo precej manj, a kljub temu se lahko hitro zapolnijo obstoječi viri, če ne sprejmete nekaterih previdnostnih ukrepov.

Obstaja več tipov slik, ki končnemu uporabniku niso neposredno vidne:

  • intermediate slike, na osnovi kojih su drugi zapisi sastavljeni – ne mogu se obrisati ako koristite kontejnere temeljene na tim "drugim" slikama;
  • dangling slike – to su intermediate slike na koje se ne poziva nijedan od pokrenutih kontejnera – mogu se obrisati.
  • Sledećom komandom možete proveriti da li u vašem sistemu postoji dangling slike:

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

Možete ih obrisati na sledeći način:

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

Takođe možemo koristiti subkomandu prune:

$ docker image prune
WARNING! Ovo će ukloniti sve dangling slike.
Da li ste sigurni da želite da nastavite? [y/N] y
Obrisane slike:
obrisa: sha256:143407a3cb7efa6e95761b8cd6cea25e3f41455be6d5e7cda
obrisa: sha256:738010bda9dd34896bac9bbc77b2d60addd7738ad1a95e5cc
obrisa: sha256:fa4f0194a1eb829523ecf3bad04b4a7bdce089c8361e2c347
obrisa: sha256:c5041938bcb46f78bf2f2a7f0a0df0eea74c4555097cc9197
obrisa: sha256:5945bb6e12888cf320828e0fd00728947104da82e3eb4452f

Ukupno vraćen prostor: 12.9kB

Ako bismo iznenada želeli da obrišemo sve slike (a ne samo dangling) jednom komandom, možemo to učiniti ovako:

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

Korišćenje diska pomoću volumena

Volumeni se koriste za skladištenje podataka izvan datotečnog sistema kontejnera. Na primer, ako želimo da sačuvamo rezultate rada nekog programa, kako bismo ih mogli koristiti na neki drugi način. Čest primer su baze podataka.

Hajde da pokrenemo MongoDB kontejner, montiramo mu spoljašnji volumen i obnovimo iz njega backup baze podataka (dostupan nam je u fajlu 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

Podaci će se nalaziti na domaćem računaru u direktorijumu /var/lib/docker/volumes. Ali zašto ne u režimu čitanja i pisanja kontejnera? Zato što je u Dockerfile-u MongoDB slike direktorijum /data/db (gde MongoDB po defaultu čuva svoje podatke) definisan kao volumen.

Docker Nasveti: Očistite svoj stroj od odpadkov

Napomene: mnoge slike koje u procesu rada treba da kreiraju podatke koriste volumene za čuvanje tih podataka.

Kada se zasitimo MongoDB-a i zaustavimo (ili čak obrišemo) kontejner, volumen neće biti obrisan. Nastaviće da zauzima naš dragoceni prostor na disku sve dok ga izričito ne obrišemo ovom komandom:

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

Ili možemo koristiti već poznatu subkomandu prune:

$ docker volume prune
WARNING! To bo odstranilo vse lokalne volumne, ki jih ne uporablja vsaj ena zanka.
Ali ste prepričani, da želite nadaljevati? [y/N] y
Izbrisani volumni:
d50b6402eb75d09ec17a5f57df4ed7b520c448429f70725fc5707334e5ded4d5
8f7a16e1cf117cdfddb6a38d1f4f02b18d21a485b49037e2670753fa34d115fc
599c3dd48d529b2e105eec38537cd16dac1ae6f899a123e2a62ffac6168b2f5f
...
732e610e435c24f6acae827cd340a60ce4132387cfc512452994bc0728dd66df
9a3f39cc8bd0f9ce54dea3421193f752bda4b8846841b6d36f8ee24358a85bae
045a9b534259ec6c0318cb162b7b4fca75b553d4e86fc93faafd0e7c77c79799
c6283fe9f8d2ca105d30ecaad31868410e809aba0909b3e60d68a26e92a094da

Skupno pridobljen prostor: 25.82GB
luc@saturn:~$

Uporaba diska za predpomnilnik pri gradnji slik

V Docker 18.09 je postopek ustvarjanja slik doživel nekatere spremembe zahvaljujoč orodju BuildKit. Ta pripomoček povečuje hitrost postopka, optimizira upravljanje shranjevanja podatkov in varnosti. Tu ne bomo obravnavali vseh podrobnosti tega neverjetnega orodja, osredotočili se bomo le na to, kako vpliva na uporabo disčnega prostora.

Predpostavimo, da imamo popolnoma preprosto aplikacijo Node.Js:

  • datoteka index.js zažene preprost HTTP strežnik, ki odgovarja z nizom na vsak prejet zahtevek:
  • datoteka package.json določa odvisnosti, od katerih se uporablja le expressjs za zagon HTTP strežnika:

$ 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 za gradnjo slike izgleda takole:

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

Zdaj zgradimo sliko na običajen način, brez uporabe BuildKit:

$ docker build -t app:1.0 .

Če preverimo uporabo disčnega prostora, bomo videli, da zasedata prostor le osnovna slika (node:13-alpine) in končna slika (app:1.0):

TIP           SKUPAJ      AKTIVNO     VELIKOST       OBNOVLJIVO
Slikice      2          0          109.3MB    109.3MB (100%)
Zanke        0          0          0B         0B
Lokalni volumn    0          0          0B         0B
Predpomnilnik       0          0          0B         0B

Zdaj zgradimo drugo različico naše aplikacije, tokrat z uporabo BuildKit. Za to je potrebno le nastaviti spremenljivko DOCKER_BUILDKIT na vrednost 1:

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

Če zdaj preverimo uporabo diska, bomo videli, da zdaj sodeluje predpomnilnik gradnje (build-cache):

$ docker system df
TIP           SKUPNO      AKTIVNO     VELIKOST     ODBRANJIVO
Slike         2          0          109.3MB    109.3MB (100%)
Kontejneri    0          0          0B         0B
Lokalni volumeni  0          0          0B         0B
Cache za izgradnju 11         0          8.949kB    8.949kB

Za njegovo čišćenje koristićemo sledeću komandu:

$ docker builder prune
UPUTSTVO! Ovo će ukloniti sve viseće izgrađene keševe.
Da li ste sigurni da želite da nastavite? [y/N] y
Izbrisani objekti za izgradnju:
rffq7b06h9t09xe584rn4f91e
ztexgsz949ci8mx8p5tzgdzhe
3z9jeoqbbmj3eftltawvkiayi

Ukupno vraćeni prostor: 8.949kB

Očisti sve!

Dakle, razmotrili smo čišćenje slobodnog prostora zauzetog kontejnerima, slikama i volumenima. U tome nam pomaže podkomanda prune. Ali se može koristiti i na sistemskom nivou docker, i očistiće sve što može:

$ docker system prune
UPUTSTVO! Ovo će ukloniti:
  - sve zaustavljene kontejnere
  - sve mreže koje nisu korišćene od strane bar jednog kontejnera
  - sve viseće slike
  - sve viseće keševe za izgradnju

Da li ste sigurni da želite da nastavite? [y/N]

Ako iz bilo kog razloga štedite slobodan prostor na mašini sa Docker-om, povremeno pokretanje ove komande bi trebalo postati vaša navika.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster