Tips Docker: Hapus mesin anjeun tina sampah

Tips Docker: Hapus mesin anjeun tina sampah

Héy Habr! Kuring nampilkeun ka perhatian anjeun tarjamahan artikel "Tips Docker: Ngabersihan Mesin Lokal anjeun" pangarang Luc Juggery.

Dinten ieu kami bakal ngobrol ngeunaan kumaha Docker nganggo rohangan disk tina mesin host, sareng urang ogé bakal terang kumaha cara ngosongkeun rohangan ieu tina potongan gambar sareng wadah anu henteu dianggo.


Tips Docker: Hapus mesin anjeun tina sampah

Total konsumsi

Docker mangrupikeun hal anu saé, sigana sakedik jalma anu cangcaya ayeuna. Ngan sababaraha taun ka pengker, produk ieu masihan urang cara lengkep anyar pikeun ngawangun, nganteurkeun tur ngajalankeun lingkungan mana wae, sahingga urang ngahemat sumberdaya CPU jeung RAM nyata. Salian ieu (sareng pikeun sababaraha ieu bakal janten hal anu paling penting) Docker parantos ngamungkinkeun urang pikeun nyederhanakeun sareng ngahijikeun manajemén siklus kahirupan lingkungan produksi urang.

Sanajan kitu, sagala nikmat ieu hirup modern datangna kalawan hargana. Lamun urang ngajalankeun peti, ngundeur atawa nyieun gambar urang sorangan, sarta nyebarkeun ékosistem kompléks, urang kudu mayar. Sarta kami mayar, antara séjén, kalawan spasi disk.

Upami anjeun henteu kantos mikirkeun sabaraha ruang Docker anu leres-leres nyandak dina mesin anjeun, anjeun tiasa kaget ku kaluaran paréntah ieu:

$ docker system df

Tips Docker: Hapus mesin anjeun tina sampah

Ieu nunjukkeun pamakean disk Docker dina kontéks anu béda:

  • gambar - ukuran total gambar anu diunduh tina gudang gambar sareng diwangun dina sistem anjeun;
  • peti - jumlah total spasi disk dipaké ku ngajalankeun peti (hartina volume total lapisan baca-tulis sadaya peti);
  • volume lokal - volume gudang lokal dipasang kana peti;
  • ngawangun cache - file samentawis anu dihasilkeun ku prosés ngawangun gambar (nganggo alat BuildKit, sayogi dimimitian ku versi Docker 18.09).

Kuring bet yén sanggeus mindahkeun basajan ieu anjeun hayang pisan ngabersihan disk anjeun tina sampah jeung mawa gigabytes adi deui hirup (catetan: utamana lamun mayar nyéwa pikeun gigabytes ieu unggal bulan).

Pamakéan piringan ku wadahna

Unggal-unggal anjeun nyiptakeun wadah dina mesin host, sababaraha file sareng diréktori didamel dina diréktori /var/lib/docker, diantarana anu kedah diperhatoskeun:

  • Diréktori /var/lib/docker/containers/container_ID - nalika nganggo supir logging standar, ieu tempat log acara disimpen dina format JSON. Log anu rinci teuing, kitu ogé log anu teu aya anu maca atanapi anu sanés prosésna, sering nyababkeun disk pinuh.
  • Diréktori /var/lib/docker/overlay2 ngandung lapisan baca-tulis wadah (overlay2 mangrupikeun supir anu dipikaresep dina kalolobaan distribusi Linux). Upami wadahna nyimpen data dina sistem filena, maka dina diréktori ieu bakal disimpen.

Hayu urang bayangkeun sistem anu dipasang Docker murni, anu henteu kantos kalibet dina ngaluncurkeun wadah atanapi ngawangun gambar. Laporan pamakean rohangan disk na bakal siga kieu:

$ 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

Hayu urang ngajalankeun sababaraha wadah, contona, NGINX:

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

Naon anu lumangsung kana disk:

  • gambar nempatan 126 MB, ieu teh NGINX sarua yen urang dibuka dina wadahna;
  • wadah nyandak up a 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

Ditilik ku kacindekan, urang henteu acan gaduh rohangan anu tiasa dibébaskeun. Kusabab 2 bait sagemblengna sagawayah, hayu urang ngabayangkeun yén NGINX urang teu disangka-sangka wrote wae 100 Megabytes data sarta dijieun test.img file persis ukuranana ieu di jero sorangan.

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

Hayu urang nalungtik pamakéan spasi disk on host deui. Urang bakal nempo yén wadahna (wadah) nempatan 100 Megabytes dinya.

$ 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

Jigana otak hayang weruh anjeun geus wondering dimana lokasi file test.img urang. Hayu urang néangan:

$ 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 lebet kana detil, urang tiasa dicatet yén file test.img merenah ayana dina tingkat baca-tulis, dikawasa ku supir overlay2. Upami urang ngeureunkeun wadahna, host bakal nyarioskeun ka urang yén rohangan ieu, prinsipna, tiasa dibébaskeun:

# 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

Kumaha urang tiasa ngalakukeun ieu? Ku ngahapus wadahna, anu bakal ngabersihan rohangan anu aya dina tingkat baca-tulis.

Kalayan paréntah di handap ieu, anjeun tiasa ngahapus sadaya wadah anu dipasang dina hiji swoop sareng mupus disk anjeun tina sadaya file baca-tulis anu diciptakeun ku aranjeunna:

$ 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

Janten, urang ngabebaskeun 104,9 Megabytes ku ngahapus wadahna. Tapi kusabab urang henteu deui nganggo gambar anu diunduh sateuacana, éta ogé janten calon pikeun ngahapus sareng ngabebaskeun sumber daya urang:

$ 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

Catetan: Salami gambar dianggo ku sahenteuna hiji wadah, anjeun moal tiasa nganggo trik ieu.

Subcommand prune anu kami anggo di luhur ngan ukur gaduh pangaruh kana wadah anu dieureunkeun. Upami urang hoyong ngahapus henteu ngan ukur lirén tapi ogé ngajalankeun peti, urang kedah nganggo salah sahiji paréntah ieu:

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

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

Catetan samping: upami anjeun nganggo parameter -rm nalika ngamimitian wadahna, teras nalika lirén, sadaya rohangan disk anu dijajahna bakal dibébaskeun.

Ngagunakeun gambar disk

Sababaraha taun ka tukang, hiji ukuran gambar sababaraha ratus megabytes éta sagemblengna normal: hiji gambar Ubuntu ditimbang 600 megabytes, sarta gambar Microsoft .Net beuratna sababaraha gigabytes. Dina dinten-dinten shaggy éta, unduh ngan hiji gambar tiasa nyandak tol ageung dina rohangan disk bébas anjeun, sanaos anjeun ngabagi tingkat antara gambar. Dinten ayeuna - pujian anu hébat - gambar beuratna langkung handap, tapi sanaos kitu, anjeun tiasa gancang ngeusian sumber daya anu sayogi upami anjeun henteu nyandak sababaraha pancegahan.

Aya sababaraha jinis gambar anu henteu katingali langsung ku pangguna akhir:

  • Gambar panengah, dumasar kana gambar anu sanés dikumpulkeun - aranjeunna henteu tiasa dihapus upami anjeun nganggo wadah dumasar kana gambar "lain" ieu;
  • gambar dangling mangrupakeun gambar panengah nu teu referenced ku salah sahiji wadah ngajalankeun - aranjeunna bisa dihapus.
  • Kalayan paréntah di handap ieu anjeun tiasa pariksa gambar dangling dina sistem anjeun:

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

Anjeun tiasa ngahapus aranjeunna ku cara ieu:

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

Urang ogé tiasa nganggo 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

Upami urang ujug-ujug hoyong ngahapus sadaya gambar sadayana (sanes ngan ukur dangling) kalayan hiji paréntah, maka urang tiasa ngalakukeun ieu:

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

Pamakéan disk ku volume

Jilid dianggo pikeun nyimpen data di luar sistem file wadahna. Salaku conto, upami urang hoyong nyimpen hasil tina aplikasi supados tiasa dianggo ku cara anu sanés. Hiji conto umum nyaéta database.

Hayu urang ngaluncurkeun wadah MongoDB, pasang volume éksternal kana wadahna, sareng malikkeun cadangan database ti dinya (urang gaduhna dina 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

Datana bakal aya dina mesin host dina diréktori /var/lib/docker/volume. Tapi naha henteu dina tingkat baca-tulis wadahna? Kusabab dina Dockerfile tina gambar MongoDB, diréktori / data / db (dimana MongoDB nyimpen datana sacara standar) dihartikeun salaku volume.

Tips Docker: Hapus mesin anjeun tina sampah

Catetan samping: seueur gambar anu kedah ngahasilkeun data nganggo volume pikeun nyimpen data éta.

Lamun urang maénkeun cukup kalawan MongoDB jeung ngeureunkeun (atawa meureun malah ngahapus) wadahna, polumeu moal dihapus. Éta bakal teras-terasan nyandak rohangan disk anu berharga dugi ka urang ngahapus sacara eksplisit kalayan paréntah sapertos kieu:

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

Nya, atanapi urang tiasa nganggo subcommand prune anu parantos wawuh ka urang:

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

Ngagunakeun disk pikeun gambar ngawangun cache

Dina Docker 18.09, prosés nyiptakeun gambar parantos ngalaman sababaraha parobihan berkat alat BuildKit. Hal ieu ningkatkeun laju prosés sareng ngaoptimalkeun panyimpen data sareng manajemén kaamanan. Di dieu urang moal nganggap sadaya detil ngeunaan alat anu saé ieu; urang ngan bakal difokuskeun kumaha éta alamat masalah panggunaan rohangan disk.

Anggap urang gaduh aplikasi Node.Js anu saderhana pisan:

  • file index.js dimimitian server HTTP basajan nu responds kalawan garis pikeun tiap pamundut narima:
  • file package.json ngahartikeun kagumantungan, nu ngan expressjs dipaké pikeun ngajalankeun 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 pikeun ngawangun gambar sapertos kieu:

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

Hayu urang ngawangun gambar dina cara biasa, tanpa ngagunakeun BuildKit:

$ docker build -t app:1.0 .

Upami urang pariksa pamakean rohangan disk, urang tiasa ningali yén ngan ukur gambar dasar (titik: 13-alpine) sareng gambar tujuan (aplikasi: 1.0) anu nyandak rohangan:

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

Hayu urang ngawangun versi kadua aplikasi urang, ngagunakeun BuildKit. Jang ngalampahkeun ieu, urang ngan perlu nyetél DOCKER_BUILDKIT variabel ka 1:

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

Upami urang ayeuna pariksa pamakean disk, urang bakal ningali yén ngawangun cache (buid-cache) ayeuna aub di dinya:

$ 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

Pikeun mupus éta, paké paréntah di handap ieu:

$ 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

Pupus sadayana!

Janten, urang ningal ngabersihkeun rohangan disk anu dijajah ku wadah, gambar sareng jilid. Subcommand prune ngabantosan urang ku ieu. Tapi ogé tiasa dianggo dina tingkat sistem docker, sareng éta bakal ngabersihan sadayana anu tiasa:

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

Upami kusabab sababaraha alesan anjeun ngahémat rohangan disk dina mesin anu ngajalankeun Docker, maka périodik ngajalankeun paréntah ieu kedah janten kabiasaan.

sumber: www.habr.com

Tambahkeun komentar