Tips Docker: Mbusak mesin sampeyan saka sampah

Tips Docker: Mbusak mesin sampeyan saka sampah

Hey Habr! Aku menehi perhatian marang terjemahan artikel kasebut "Tips Docker: Ngresiki Mesin Lokal Sampeyan" pengarang Luc Juggery.

Dina iki kita bakal pirembagan bab carane Docker nggunakake papan disk saka mesin inang, lan kita uga bakal ngerti carane mbebasake spasi iki saka kethokan gambar lan wadhah sing ora digunakake.


Tips Docker: Mbusak mesin sampeyan saka sampah

Total konsumsi

Docker minangka perkara sing keren, bisa uga sawetara wong sing ragu-ragu saiki. Mung sawetara taun kepungkur, produk iki menehi cara sing anyar kanggo mbangun, ngirim lan mbukak lingkungan apa wae, saΓ©ngga bisa nyimpen sumber daya CPU lan RAM kanthi signifikan. Saliyane iki (lan kanggo sawetara, iki bakal dadi sing paling penting) Docker wis ngidini kita nyederhanakake lan nggabungake manajemen siklus urip lingkungan produksi kita.

Nanging, kabeh iki ditresnani urip modern teka ing rega. Nalika kita mbukak wadhah, ngundhuh utawa nggawe gambar kita dhewe, lan masang ekosistem Komplek, kita kudu mbayar. Lan kita mbayar, antarane liyane, karo papan disk.

Yen sampeyan ora nate mikir babagan pira papan sing ditindakake Docker ing mesin sampeyan, sampeyan bisa uga kaget karo output perintah iki:

$ docker system df

Tips Docker: Mbusak mesin sampeyan saka sampah

Iki nuduhake panggunaan disk Docker ing macem-macem konteks:

  • gambar - ukuran total gambar sing diundhuh saka repositori gambar lan dibangun ing sistem sampeyan;
  • kontaner - jumlah total ruang disk sing digunakake kanggo mbukak wadhah (tegese volume total lapisan maca-tulis kabeh wadhah);
  • volume lokal - volume panyimpenan lokal sing dipasang ing wadhah;
  • mbangun cache - file sauntara sing digawe dening proses bangunan gambar (nggunakake alat BuildKit, kasedhiya diwiwiti karo versi Docker 18.09).

Aku nang sing sawise transfer prasaja iki sampeyan semangat kanggo ngresiki disk saka uwuh lan urip maneh gigabyte larang regane (cathetan: utamanΓ© yen sampeyan mbayar sewa kanggo gigabyte iki saben sasi).

Panggunaan disk dening wadhah

Saben sampeyan nggawe wadhah ing mesin host, sawetara file lan direktori digawe ing direktori /var/lib/docker, ing antarane sing kudu digatekake:

  • Direktori /var/lib/docker/containers/container_ID - nalika nggunakake driver logging standar, iki ngendi log acara disimpen ing format JSON. Log sing rinci banget, uga log sing ora diwaca utawa diproses, asring nyebabake disk dadi kebak.
  • Direktori /var/lib/docker/overlay2 ngemot lapisan waca-tulis wadhah (overlay2 minangka pembalap sing disenengi ing umume distribusi Linux). Yen wadhah nyimpen data ing sistem file, banjur ing direktori iki bakal diselehake.

Ayo mbayangno sistem sing dipasang Docker murni, sing durung nate melu ngluncurake kontainer utawa nggawe gambar. Laporan panggunaan ruang disk bakal katon kaya iki:

$ 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

Ayo mbukak sawetara wadhah, contone, NGINX:

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

Apa sing kedadeyan ing disk:

  • gambar manggoni 126 MB, iki NGINX padha sing dibukak ing wadhah;
  • kontaner njupuk munggah ridiculous 2 bait.

$ 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

Miturut kesimpulan, kita durung duwe ruang sing bisa dibebasake. Wiwit 2 bita rampung sembrono, ayo kang mbayangno sing NGINX kita ndadak nulis nang endi wae 100 Megabyte data lan nggawe test file.img persis ukuran iki nang dhewe.

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

Ayo ditliti maneh panggunaan ruang disk ing host. Kita bakal weruh yen wadhah (wadhah) manggoni 100 Megabyte ing kana.

$ 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

Aku mikir otak sing kepengin weruh wis mikir ing ngendi file test.img kita dumunung. Ayo goleki:

$ 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

Tanpa nerangake rincian, kita bisa nyathet yen file test.img dumunung ing tingkat maca-tulis, dikontrol dening driver overlay2. Yen kita mungkasi wadhah kita, tuan rumah bakal ngandhani yen papan iki, ing prinsip, bisa dibebasake:

# 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

Kepiye carane bisa nindakake iki? Kanthi mbusak wadhah, sing bakal mbutuhake ngresiki spasi sing cocog ing tingkat maca-tulis.

Kanthi printah ing ngisor iki, sampeyan bisa mbusak kabeh kontaner sing wis diinstal ing siji swoop lan mbusak disk kabeh file maca-tulis sing digawe dening wong-wong mau:

$ 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

Dadi, kita mbebasake 104,9 Megabyte kanthi mbusak wadhah kasebut. Nanging amarga kita ora nggunakake maneh gambar sing wis diundhuh sadurunge, iku uga dadi calon kanggo mbusak lan mbebasake sumber daya kita:

$ 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

Cathetan: Anggere gambar digunakake paling ora siji wadhah, sampeyan ora bakal bisa nggunakake trik iki.

Subcommand prune sing kita gunakake ing ndhuwur mung duwe pengaruh ing wadhah sing mandheg. Yen kita pengin mbusak ora mung mandheg nanging uga mbukak kontaner, kita kudu nggunakake salah siji saka printah iki:

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

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

Cathetan sisih: yen sampeyan nggunakake parameter -rm nalika miwiti wadhah, banjur nalika mandheg, kabeh ruang disk sing dikuwasani bakal dibebasake.

Nggunakake gambar disk

Sawetara taun kepungkur, ukuran gambar sawetara atus megabyte rampung normal: gambar Ubuntu bobote 600 megabyte, lan gambar Microsoft .Net bobote sawetara gigabyte. Ing dina-dina shaggy iku, ngundhuh mung siji gambar bisa njupuk tol gedhe ing papan free disk, sanajan sampeyan nuduhake tingkat antarane gambar. Dina iki - muji sing gedhe - gambar bobote luwih murah, nanging sanajan mangkono, sampeyan bisa kanthi cepet ngisi sumber daya sing kasedhiya yen sampeyan ora nindakake sawetara pancegahan.

Ana sawetara jinis gambar sing ora langsung katon kanggo pangguna pungkasan:

  • gambar penengah, adhedhasar gambar liyane sing diklumpukake - ora bisa dibusak yen sampeyan nggunakake wadhah adhedhasar gambar "liyane" iki;
  • gambar dangling punika gambar penengah sing ora referensi dening samubarang kontaner mlaku - padha bisa dibusak.
  • Kanthi printah ing ngisor iki sampeyan bisa mriksa gambar sing dangling ing sistem sampeyan:

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

Sampeyan bisa mbusak kanthi cara ing ngisor iki:

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

Kita uga bisa nggunakake 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

Yen dumadakan kita pengin mbusak kabeh gambar kabeh (lan ora mung dangling) karo siji printah, banjur kita bisa nindakake iki:

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

Panggunaan disk miturut volume

Volume digunakake kanggo nyimpen data ing njaba sistem file wadhah. Contone, yen kita pengin nyimpen asil saka aplikasi supaya bisa digunakake ing sawetara cara liyane. Conto umum yaiku database.

Ayo miwiti wadhah MongoDB, pasang volume eksternal menyang wadhah kasebut, lan mulihake serep database saka iku (kita kasedhiya ing file 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 kasebut bakal ana ing mesin host ing direktori /var/lib/docker/volume. Nanging kok ora ing tingkat maca-nulis saka wadhah? Amarga ing Dockerfile gambar MongoDB, direktori / data / db (ing ngendi MongoDB nyimpen data kanthi standar) ditetepake minangka volume.

Tips Docker: Mbusak mesin sampeyan saka sampah

Cathetan sisih: akeh gambar sing kudu ngasilake data nggunakake volume kanggo nyimpen data kasebut.

Nalika kita cukup muter MongoDB lan mungkasi (utawa malah mbusak) wadhah, volume ora bakal dibusak. Bakal terus njupuk ruang disk sing larang regane nganti kita mbusak kanthi jelas kanthi prentah kaya iki:

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

Ya, utawa kita bisa nggunakake subcommand prune sing wis akrab karo kita:

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

Nggunakake disk kanggo cache mbangun gambar

Ing Docker 18.09, proses nggawe gambar wis ngalami owah-owahan amarga alat BuildKit. Bab iki nambah kacepetan proses lan ngoptimalake panyimpenan data lan manajemen keamanan. Ing kene kita ora bakal nimbang kabeh rincian alat sing apik iki; kita mung bakal fokus babagan cara ngatasi masalah panggunaan ruang disk.

Ayo kita duwe aplikasi Node.Js sing prasaja:

  • file index.js miwiti server HTTP prasaja sing nanggapi karo baris kanggo saben panjalukan ditampa:
  • file package.json nemtokake dependensi, sing mung expressjs digunakake kanggo mbukak server 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 kanggo mbangun gambar katon kaya iki:

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

Ayo nggawe gambar kanthi cara biasa, tanpa nggunakake BuildKit:

$ docker build -t app:1.0 .

Yen mriksa panggunaan ruang disk, kita bisa ndeleng manawa mung gambar dhasar (simpul: 13-alpine) lan gambar tujuan (app:1.0) sing njupuk ruang:

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

Ayo mbangun versi kapindho aplikasi kita, nggunakake BuildKit. Kanggo nindakake iki, kita mung kudu nyetel variabel DOCKER_BUILDKIT dadi 1:

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

Yen saiki mriksa panggunaan disk, kita bakal weruh manawa cache mbangun (buid-cache) saiki melu ana:

$ 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

Kanggo mbusak, gunakake printah ing ngisor iki:

$ 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

Busek kabeh!

Dadi, kita ndeleng ngresiki ruang disk sing dikuwasani wadhah, gambar lan volume. Subcommand prune mbantu kita nindakake iki. Nanging uga bisa digunakake ing tingkat sistem docker, lan bakal ngresiki kabeh sing bisa:

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

Yen sakperangan alesan sampeyan ngirit ruang disk ing mesin sing mbukak Docker, mula kanthi periodik nglakokake printah iki kudu dadi pakulinan.

Source: www.habr.com

Add a comment