Apakah aman untuk membersihkan buruh pelabuhan / overlay2 /


109

Saya mendapatkan beberapa kontainer buruh pelabuhan yang berjalan di AWS EC2, folder / var / lib / docker / overlay2 tumbuh sangat cepat dalam ukuran disk.

Saya bertanya-tanya apakah aman untuk menghapus isinya? atau jika buruh pelabuhan memiliki semacam perintah untuk membebaskan beberapa penggunaan disk.


MEMPERBARUI:

Saya sebenarnya docker system prune -asudah mencoba , yang mendapatkan kembali 0Kb.

Juga ukuran disk / docker / overlay2 saya jauh lebih besar daripada keluaran dari docker system df

Setelah membaca dokumentasi buruh pelabuhan dan jawaban BMitch, saya percaya bahwa menyentuh folder ini adalah ide yang bodoh dan saya akan mencoba cara lain untuk mendapatkan kembali ruang disk saya.


apakah kamu menemukan jawaban untuk ini? Saya masih mendapatkan masalah yang sama.
Saurabh_Jhingan

1
Saya berlari docker image prune --alldan kemudian docker system prune -a. Itu telah merebut kembali ruang disk saya sekitar 50 GB, yang digunakan oleh file di bawah / var / lib / docker / overlay2. Tapi, docker system prune -asudah cukup. Juga, spesifik konfigurasi saya adalah: OS: Ubuntu 20,Docker : 19.03.12
Binita Bharati

Jawaban:


73

Docker menggunakan / var / lib / docker untuk menyimpan gambar, kontainer, dan volume lokal Anda. Menghapus ini dapat mengakibatkan hilangnya data dan kemungkinan menghentikan mesin untuk bekerja. Subdirektori overlay2 secara khusus berisi berbagai lapisan sistem file untuk gambar dan container.

Untuk membersihkan kontainer dan gambar yang tidak digunakan, lihat docker system prune. Ada juga opsi untuk menghapus volume dan bahkan gambar yang diberi tag, tetapi tidak diaktifkan secara default karena kemungkinan kehilangan data.


1
Jawabannya sama (kecuali Anda dapat mengecualikan volume). Jika Anda menghapus sesuatu di sana dan memecahkannya, Anda bisa menyimpan kedua bagian tersebut. Gunakan alat yang disediakan untuk pekerjaan ini.
BMitch

1
Folder overlay2 harus berisi lapisan sistem file yang diperlukan untuk gambar dan kontainer Anda. Anda bebas mengabaikan saran ini, tetapi tolong jangan meminta saran saya tentang cara memulihkan sistem yang gagal setelah Anda merusaknya, terutama karena saya memberi Anda cara yang didukung untuk membersihkan sistem file Anda.
BMitch

21
Saya mencoba docker system prune -a, yang memulihkan ruang 0kb. Saat ini kasus bagi saya adalah ukuran disk / docker / overlay2 jauh lebih besar daripada keluaran dari docker system df. Itulah alasan mengapa saya terus menggali masalah ini. Sekali lagi, terima kasih atas balasan Anda, Pak. Saya rasa saya perlu membaca lebih lanjut tentang dokumentasi buruh pelabuhan atau mungkin menghapus buruh pelabuhan seluruhnya dan memulai ulang. Saya hanya memiliki database postgres yang perlu disimpan, dan saya memasangnya
qichao_he

9
Saya akan mengatakan bahwa cara "didukung" tidak berhasil untuk saya juga. Melakukan semua pemangkasan sistem buruh pelabuhan -a, pemangkasan volume buruh pelabuhan, pemangkasan gambar buruh pelabuhan, dan pemangkasan kontainer buruh pelabuhan masih menyisakan 80% dari disk saya yang digunakan oleh Docker. Itu dengan semua kontainer dihentikan.
Craig Brett

1
@franzisk untuk menghapus semua yang akan Anda hapus semua /var/lib/dockerdaripada satu sub-direktori yang akan membiarkannya dalam keadaan tidak konsisten.
BMitch

52

Saya menemukan ini bekerja paling baik untuk saya:

docker image prune --all

Secara default, Docker tidak akan menghapus gambar bernama, meskipun gambar tersebut tidak digunakan. Perintah ini akan menghapus gambar yang tidak digunakan.

Perhatikan setiap lapisan dalam gambar adalah folder di dalam /usr/lib/docker/overlay2/folder tersebut.


3
'pemangkasan gambar' bekerja jauh lebih baik daripada 'pemangkasan sistem'. Terima kasih!
DavidG

Peringatan! Ini cukup merusak, karena menghapus semua gambar dari kontainer yang tidak berjalan. Anda akan membangunnya kembali selama berjam-jam jika itu milik Anda dan belum didorong ke registri. Tapi itu masih tidak bisa melampaui apa yang docker system dfditunjukkan (Anda mungkin masih keluar dari ruang angkasa dan overlay2tempat pembuangan sampah yang jahat itu perlu di-nuked secara manual.
mirekphd

Ya, itu menghapus gambar.
Sarke

Perhatian: Dalam kasus saya di mana saya menggunakan kawanan buruh pelabuhan, itu juga menghapus semua gambar yang diberi tag, bahkan untuk menjalankan wadah
velop

Ini berhasil tetapi pembeli berhati-hatilah ini menghapus SEMUA yang tidak ada dalam wadah.
jimh

30

Saya punya masalah ini ... Itu adalah log yang sangat besar. Log ada di sini:

/var/lib/docker/containers/<container id>/<container id>-json.log

Anda dapat mengaturnya di baris perintah run atau di file tulis. Lihat di sana: Konfigurasi driver logging

Saya pribadi menambahkan 3 baris ini ke file docker-compose.yml saya:

my_container:
  logging:
    options:
      max-size: 10m

2
Bisakah Anda menambahkan beberapa baris dari tautan ke jawaban?
RtmY

Alangkah baiknya juga mendapatkan info tentang cara mengidentifikasi wadah mana yang memiliki file log raksasa. Saya memiliki banyak kontainer dan file log, ada yang besar ada yang kecil.
Mikha Zoltu

Bagaimana itu menjawab pertanyaan OP ?!
Slavik Meltser

2
Jawaban ini adalah jawaban parsial, terutama jika 'log' adalah masalahnya (mungkin kita dapat memperbaikinya dengan beberapa pengeditan?). Sampai saya melihat jawaban ini, saya akan mulai secara acak menghapus direktori besar dari direktori saya yang terlalu penuh overlay2. Dalam kasus saya, total kapasitas untuk /var/lib/dockeritu 50GB dan 36GB dari itu dikonsumsi oleh satu file: /var/lib/docker/overlay2/<container id>/diff/var/log/faillog. Dengan asumsi bahwa file ini tidak penting untuk menjaga semuanya tetap berjalan, peretasan jangka pendek saya adalah hanya menghapusnya (dan mungkin saya juga akan menyesuaikan saya docker-composejuga).
D. Woods

19

juga bermasalah dengan berkembang pesat overlay2

/var/lib/docker/overlay2- adalah folder tempat buruh pelabuhan menyimpan lapisan yang dapat ditulis untuk wadah Anda. docker system prune -a- hanya dapat berfungsi jika wadah dihentikan dan dilepas.

di saya, saya dapat mengetahui apa yang menghabiskan ruang dengan pergi ke overlay2dan menyelidiki.

folder itu berisi folder bernama hash lainnya. masing-masing memiliki beberapa folder termasuk difffolder.

diff folder - berisi perbedaan aktual yang ditulis oleh wadah dengan struktur folder yang tepat sebagai wadah Anda (setidaknya dalam kasus saya - ubuntu 18 ...)

jadi saya sudah terbiasa du -hsc /var/lib/docker/overlay2/LONGHASHHHHHHH/diff/tmpuntuk mengetahui bahwa /tmpdi dalam wadah saya adalah folder yang tercemar .

jadi sebagai solusinya saya telah menggunakan -v /tmp/container-data/tmp:/tmpparameter untuk docker runperintah untuk memetakan /tmpfolder dalam ke host dan menyiapkan cron pada host untuk membersihkan folder itu.

tugas cron sederhana:

  • sudo nano /etc/crontab
  • */30 * * * * root rm -rf /tmp/container-data/tmp/*
  • save and exit

CATATAN: overlay2adalah folder buruh pelabuhan sistem, dan mereka dapat mengubah strukturnya kapan saja. Semua di atas berdasarkan apa yang saya lihat di sana. Harus masuk dalam struktur folder buruh pelabuhan hanya karena sistem benar-benar kehabisan ruang dan bahkan tidak mengizinkan saya untuk ssh ke dalam wadah buruh pelabuhan.


Terima kasih atas jawaban ini, kami memasukkan basis data / aplikasi lama ke dalam wadah yang menghasilkan banyak /var/log/apache2/error.log. Saya mengatur ulang error.log dan access.log dan menambahkan volume baru untuk memungkinkan pengelolaan termudah
bcag2

6

Backgroud

Penyebab masalah ini dapat dibagi antara kesalahan konfigurasi volume penampung kami, dan masalah dengan buruh pelabuhan yang bocor (gagal merilis) data sementara yang ditulis ke volume ini. Kita harus memetakan (baik ke folder host atau klaim penyimpanan persisten lainnya) semua dari folder temporer / logs / scratch di mana aplikasi kita sering menulis dan / atau berat. Docker tidak bertanggung jawab atas pembersihan semua yang dibuat secara otomatis yang disebut EmptyDirs yang terletak secara default di /var/lib/docker/overlay2/*/diff/*. Isi dari folder "non-persistent" ini harus dibersihkan secara otomatis oleh buruh pelabuhan setelah kontainer dihentikan, tetapi ternyata tidak (mereka bahkan tidak mungkin untuk dihapus dari sisi host jika kontainer masih berjalan - dan dapat berjalan selama berbulan-bulan pada suatu waktu).

Solusi

Sebuah solusi membutuhkan pembersihan manual yang hati-hati, dan meskipun sudah dijelaskan di tempat lain, Anda masih dapat menemukan beberapa petunjuk dari studi kasus saya, yang saya coba buat se-instruktif dan digeneralisasikan mungkin.

Jadi yang terjadi adalah aplikasi pelakunya (dalam kasus saya clair-scanner) berhasil menulis selama beberapa bulan ratusan pertunjukan data ke /diff/tmpsubfolder dari buruh pelabuhanoverlay2

du -sch /var/lib/docker/overlay2/<long random folder name seen as bloated in df -haT>/diff/tmp

271G total

Jadi karena semua subfolder di dalamnya /diff/tmpcukup jelas (semuanya dalam bentuk clair-scanner-*dan memiliki tanggal pembuatan yang sudah tidak berlaku), saya menghentikan wadah terkait ( docker stop clair) dan dengan hati-hati menghapus subfolder usang ini dari diff/tmp, mulai dengan hati-hati dengan satu (tertua), dan menguji dampaknya pada mesin buruh pelabuhan (yang memang membutuhkan restart [ systemctl restart docker] untuk mendapatkan kembali ruang disk):

rm -rf $(ls -at /var/lib/docker/overlay2/<long random folder name seen as bloated in df -haT>/diff/tmp | grep clair-scanner | tail -1)

Saya mendapatkan kembali ratusan pertunjukan ruang disk tanpa perlu menginstal ulang buruh pelabuhan atau membersihkan seluruh foldernya. Semua container yang sedang berjalan harus dihentikan pada satu titik, karena restart daemon docker diperlukan untuk mendapatkan kembali ruang disk, jadi pastikan dulu container failover Anda berjalan dengan benar pada / node lain). Saya berharap bahwa docker pruneperintah itu dapat mencakup data yang usang /diff/tmp(atau bahkan /diff/*) juga (melalui sakelar lain).

Ini adalah masalah berusia 3 tahun sekarang, Anda dapat membaca riwayatnya yang kaya dan penuh warna di forum Docker, di mana varian yang ditujukan untuk log aplikasi dari solusi di atas diusulkan pada tahun 2019 dan tampaknya telah berfungsi dalam beberapa pengaturan: https: // forums.docker.com/t/some-way-to-clean-up-identify-contents-of-var-lib-docker-overlay/30604


5

PERINGATAN: JANGAN GUNAKAN DALAM SISTEM PRODUKSI

/# df
...
/dev/xvda1      51467016 39384516   9886300  80% /
...

Oke, pertama-tama mari kita coba pemangkasan sistem

#/ docker system prune --volumes
...
/# df
...
/dev/xvda1      51467016 38613596  10657220  79% /
...

Tidak terlalu bagus, sepertinya itu membersihkan beberapa megabyte. Ayo gila sekarang:

/# sudo su
/# service docker stop
/# cd /var/lib/docker
/var/lib/docker# rm -rf *
/# service docker start
/var/lib/docker# df
...
/dev/xvda1      51467016 8086924  41183892  17% /
...

Bagus! Ingatlah bahwa ini TIDAK disarankan untuk apa pun kecuali server sekali pakai. Pada titik ini, basis data internal Docker tidak akan dapat menemukan hamparan ini dan dapat menyebabkan konsekuensi yang tidak diinginkan.


Menyelesaikan seluruh /var/lib/dockerdirektori (saat daemon dihentikan dan dengan asumsi direktori tidak berisi mount filesystem khusus atau serupa) sebenarnya adalah cara cepat-dan-kotor yang valid untuk kembali ke titik awal. Saya tidak yakin mengapa Anda mendapatkan semua suara negatif. Docker mencoba memulihkan diri, dan akan mengenali saat semua harapan hilang dan menginisialisasi ulang /var/lib/dockerdirektori sesuai kebutuhan.
L0j1k

Dewa suci akhirnya jawaban yang berhasil. Saya telah memangkas dan melakukan banyak hal selama 4 jam tetapi saya seharusnya menghentikan layanan buruh pelabuhan, meletakkan semuanya di tempat sampah dan memulai ulang.
Osi

Ini berfungsi , tetapi juga hanya menghapus SEMUA yang telah diproduksi oleh Docker. Jadi bukan solusi yang bagus , per sé.
Akito

2

JANGAN LAKUKAN INI DALAM PRODUKSI

Jawaban yang diberikan oleh @ ravi-luthra secara teknis berfungsi tetapi memiliki beberapa masalah!

Dalam kasus saya, saya hanya mencoba memulihkan ruang disk. The lib/docker/overlayfolder mengambil 30GB ruang dan saya hanya menjalankan beberapa kontainer teratur. Sepertinya buruh pelabuhan memiliki beberapa masalah dengan kebocoran data dan beberapa data sementara tidak dihapus saat penampung berhenti.

Jadi saya melanjutkan dan menghapus semua isi lib/docker/overlayfolder. Setelah itu, instance buruh pelabuhan saya menjadi tidak bisa digunakan. Ketika saya mencoba menjalankan atau membangun wadah apa pun, itu memberi saya kesalahan ini:

failed to create rwlayer: symlink ../04578d9f8e428b693174c6eb9a80111c907724cc22129761ce14a4c8cb4f1d7c/diff /var/lib/docker/overlay2/l/C3F33OLORAASNIYB3ZDATH2HJ7: no such file or directory

Kemudian dengan beberapa trial and error, saya memecahkan masalah ini dengan menjalankan

(PERINGATAN: Ini akan menghapus semua data Anda di dalam volume buruh pelabuhan)

docker system prune --volumes -a

Jadi tidak disarankan untuk melakukan pembersihan kotor seperti itu kecuali Anda benar-benar memahami cara kerja sistem.


1

Semua yang ada di / var / lib / docker adalah sistem file kontainer. Jika Anda menghentikan semua container dan memangkasnya, folder tersebut akan kosong. Anda mungkin tidak terlalu menginginkannya, jadi jangan menghapus barang-barang di sana secara acak. Jangan hapus sesuatu di / var / lib / docker secara langsung. Anda mungkin kadang-kadang lolos, tetapi itu tidak disarankan karena banyak alasan.

Lakukan ini sebagai gantinya:

sudo bash
cd /var/lib/docker
find . -type f | xargs du -b  | sort -n

Apa yang akan Anda lihat adalah file terbesar yang ditampilkan di bagian bawah. Jika Anda mau, cari tahu di kontainer apa file-file itu berada, masukkan kontainer itu docker exec -ti containername -- /bin/shdan hapus beberapa file.

Anda juga dapat melakukan docker system prune -a -ftugas cron harian / mingguan selama Anda tidak meninggalkan kontainer dan volume yang Anda pedulikan. Lebih baik mencari tahu alasan mengapa itu tumbuh, dan memperbaikinya di tingkat wadah.


0

Saya baru-baru ini mengalami masalah serupa, overlay2 semakin besar dan besar, Tapi saya tidak tahu apa yang menghabiskan sebagian besar ruang.

df menunjukkan bahwa overlay2 berukuran sekitar 24 GB.

Dengan dusaya mencoba mencari tahu apa yang menempati ruang ... dan gagal.

Perbedaannya berasal dari fakta bahwa file yang dihapus (kebanyakan file log dalam kasus saya) di mana masih digunakan oleh suatu proses (Docker). Dengan demikian, file tidak muncul dutetapi ruang yang ditempati akan ditampilkan df.

Reboot mesin host membantu. Memulai ulang kontainer buruh pelabuhan mungkin sudah membantu… Artikel di linuxquestions.org ini membantu saya untuk mengetahuinya.


0

menambahkan ke komentar di atas, di mana orang menyarankan untuk memangkas sistem seperti volume yang menjuntai jelas, gambar, keluar dari kontainer dll., Kadang-kadang aplikasi Anda menjadi penyebabnya, itu menghasilkan terlalu banyak log dalam waktu singkat dan jika Anda menggunakan volume langsung kosong (volume lokal ) ini mengisi partisi / var. Dalam hal ini saya menemukan perintah di bawah ini sangat menarik untuk diketahui, apa yang memakan ruang pada disk partisi / var saya.

du -ahx / var / lib | sort -rh | kepala -n 30

Perintah ini akan mencantumkan 30 teratas, yang menghabiskan sebagian besar ruang pada satu disk. Berarti jika Anda menggunakan penyimpanan eksternal dengan wadah Anda, itu menghabiskan banyak waktu untuk menjalankan perintah du. Perintah ini tidak akan menghitung volume pemasangan. Dan jauh lebih cepat. Anda akan mendapatkan direktori / file persis yang memakan ruang. Kemudian Anda dapat pergi ke direktori tersebut dan memeriksa file mana yang berguna atau tidak. jika file-file ini diperlukan maka Anda dapat memindahkannya ke beberapa penyimpanan persisten dengan membuat perubahan dalam aplikasi untuk menggunakan penyimpanan persisten untuk lokasi itu atau mengubah lokasi file itu. Dan untuk istirahat Anda bisa membersihkannya.


0

Anda dapat membersihkan folder overlay buruh pelabuhan tanpa mempengaruhi instalasi buruh pelabuhan menggunakan perintah di bawah ini.

sudo systemctl stop docker
sudo rm -r /var/lib/docker/overlay2
sudo mkdir /var/lib/docker/overlay2
sudo systemctl start docker

-5

Saya menggunakan "sistem buruh pelabuhan prune -a" itu membersihkan semua file di bawah volume dan overlay2

    [root@jasontest volumes]# docker system prune -a
    WARNING! This will remove:
            - all stopped containers
            - all networks not used by at least one container
            - all images without at least one container associated to them
            - all build cache
    Are you sure you want to continue? [y/N] y
    Deleted Images:
    untagged: ubuntu:12.04
    untagged: ubuntu@sha256:18305429afa14ea462f810146ba44d4363ae76e4c8dfc38288cf73aa07485005
    deleted: sha256:5b117edd0b767986092e9f721ba2364951b0a271f53f1f41aff9dd1861c2d4fe
    deleted: sha256:8c7f3d7534c80107e3a4155989c3be30b431624c61973d142822b12b0001ece8
    deleted: sha256:969d5a4e73ab4e4b89222136eeef2b09e711653b38266ef99d4e7a1f6ea984f4
    deleted: sha256:871522beabc173098da87018264cf3e63481628c5080bd728b90f268793d9840
    deleted: sha256:f13e8e542cae571644e2f4af25668fadfe094c0854176a725ebf4fdec7dae981
    deleted: sha256:58bcc73dcf4050a4955916a0dcb7e5f9c331bf547d31e22052f1b5fa16cf63f8
    untagged: osixia/openldap:1.2.1
    untagged: osixia/openldap@sha256:6ceb347feb37d421fcabd80f73e3dc6578022d59220cab717172ea69c38582ec
    deleted: sha256:a562f6fd60c7ef2adbea30d6271af8058c859804b2f36c270055344739c06d64
    deleted: sha256:90efa8a88d923fb1723bea8f1082d4741b588f7fbcf3359f38e8583efa53827d
    deleted: sha256:8d77930b93c88d2cdfdab0880f3f0b6b8be191c23b04c61fa1a6960cbeef3fe6
    deleted: sha256:dd9f76264bf3efd36f11c6231a0e1801c80d6b4ca698cd6fa2ff66dbd44c3683
    deleted: sha256:00efc4fb5e8a8e3ce0cb0047e4c697646c88b68388221a6bd7aa697529267554
    deleted: sha256:e64e6259fd63679a3b9ac25728f250c3afe49dbe457a1a80550b7f1ccf68458a
    deleted: sha256:da7d34d626d2758a01afe816a9434e85dffbafbd96eb04b62ec69029dae9665d
    deleted: sha256:b132dace06fa7e22346de5ca1ae0c2bf9acfb49fe9dbec4290a127b80380fe5a
    deleted: sha256:d626a8ad97a1f9c1f2c4db3814751ada64f60aed927764a3f994fcd88363b659
    untagged: centos:centos7
    untagged: centos@sha256:2671f7a3eea36ce43609e9fe7435ade83094291055f1c96d9d1d1d7c0b986a5d
    deleted: sha256:ff426288ea903fcf8d91aca97460c613348f7a27195606b45f19ae91776ca23d
    deleted: sha256:e15afa4858b655f8a5da4c4a41e05b908229f6fab8543434db79207478511ff7

    Total reclaimed space: 533.3MB
    [root@jasontest volumes]# ls -alth
    total 32K
    -rw-------  1 root root  32K May 23 21:14 metadata.db
    drwx------  2 root root 4.0K May 23 21:14 .
    drwx--x--x 14 root root 4.0K May 21 20:26 ..

3
Perintah ini tidak memberikan jawaban atas pertanyaan tersebut. Perintah yang diusulkan bahkan tertulis dalam teks pertanyaan ..
MBT

jadi ini diturunkan menjadi abu tetapi jawaban yang persis sama di bawah ini dinaikkan 41 kali. Situs ini rusak.
Adam Zahran
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.