Saya baru mengenal Docker dan berusaha memahami apa sebenarnya gambar Docker . Setiap definisi tunggal dari gambar Docker menggunakan istilah "layer", tetapi tampaknya tidak mendefinisikan apa yang dimaksud dengan layer .
Dari dokumen Docker resmi :
Kita telah melihat bahwa gambar Docker adalah templat hanya-baca dari mana wadah Docker diluncurkan. Setiap gambar terdiri dari serangkaian lapisan. Docker menggunakan sistem file gabungan untuk menggabungkan lapisan-lapisan ini menjadi satu gambar. Sistem file Union memungkinkan file dan direktori sistem file terpisah, yang dikenal sebagai cabang, untuk ditindih secara transparan, membentuk sistem file koheren tunggal.
Jadi saya bertanya, apa itu layer (tepatnya); dapatkah seseorang memberikan beberapa contoh nyata tentang hal itu? Dan bagaimana lapisan-lapisan ini "bersatu" untuk membentuk suatu gambar?
https://labs.ctl.io/caching-docker-images/
) rusak. Adakah yang punya saran untuk pengganti?Gambar container docker dibuat menggunakan dockerfile . Setiap baris di dockerfile akan membuat layer. Pertimbangkan contoh boneka berikut:
Ini akan membuat gambar akhir di mana jumlah total layer akan menjadi X + 3
sumber
Mereka paling masuk akal bagi saya dengan contoh ...
Memeriksa lapisan bangunan Anda sendiri dengan docker diff
Mari kita ambil contoh buatan Dockerfile:
Masing-masing
dd
perintah menghasilkan file 1M ke disk. Mari kita membangun gambar dengan bendera tambahan untuk menyimpan wadah sementara:Dalam output, Anda akan melihat masing-masing perintah yang berjalan terjadi dalam wadah sementara yang sekarang kami simpan alih-alih dihapus secara otomatis:
Jika Anda menjalankan
docker diff
masing-masing id wadah itu, Anda akan melihat file apa yang dibuat dalam wadah itu:Setiap baris diawali dengan
A
menambahkan file,C
menunjukkan perubahan ke file yang ada, danD
menunjukkan penghapusan.Inilah bagian TL; DR
Masing-masing dari sistem berkas wadah di atas masuk ke dalam satu "lapisan" yang akan dirakit ketika Anda menjalankan gambar sebagai wadah. Seluruh file ada di setiap lapisan saat ada penambahan atau perubahan, sehingga setiap
chmod
perintah itu, meskipun hanya mengubah sedikit izin, menghasilkan seluruh file yang disalin ke lapisan berikutnya. File yang dihapus / data / satu masih di lapisan sebelumnya, sebenarnya 3 kali, dan akan disalin melalui jaringan dan disimpan dalam disk ketika Anda menarik gambar.Meneliti gambar yang ada
Anda dapat melihat perintah yang digunakan untuk membuat lapisan gambar yang ada dengan
docker history
perintah. Anda juga dapat menjalankan adocker image inspect
pada gambar dan melihat daftar lapisan di bawah bagian RootFS.Inilah sejarah untuk gambar di atas:
Lapisan terbaru tercantum di atas. Yang perlu diperhatikan, ada dua lapisan di bagian bawah yang cukup tua. Mereka berasal dari gambar busybox itu sendiri. Saat Anda membangun satu gambar, Anda mewarisi semua lapisan gambar yang Anda tentukan di
FROM
baris. Ada juga lapisan yang ditambahkan untuk perubahan pada meta-data gambar, sepertiCMD
garis. Mereka hampir tidak mengambil ruang apa pun dan lebih untuk menyimpan pengaturan apa yang berlaku untuk gambar yang Anda jalankan.Mengapa lapisan?
Lapisan memiliki beberapa keunggulan. Pertama, mereka tidak berubah. Setelah dibuat, lapisan yang diidentifikasi oleh hasa sha256 tidak akan pernah berubah. Kekekalan itu memungkinkan gambar saling membangun dan memotong dengan aman. Jika dua dockerfiles memiliki himpunan garis awal yang sama, dan dibangun pada server yang sama, mereka akan berbagi himpunan lapisan awal yang sama, menghemat ruang disk. Itu juga berarti jika Anda membangun kembali gambar, dengan hanya beberapa baris terakhir Dockerfile mengalami perubahan, hanya lapisan-lapisan yang perlu dibangun kembali dan sisanya dapat digunakan kembali dari cache lapisan. Ini dapat membuat pembangunan kembali gambar buruh pelabuhan sangat cepat.
Di dalam sebuah wadah, Anda melihat sistem file gambar, tetapi sistem file itu tidak disalin. Di atas semua layer gambar itu, container me-mount sendiri layer sistem file read-write. Setiap pembacaan file turun melalui lapisan sampai menyentuh lapisan yang telah menandai file untuk dihapus, memiliki salinan file di lapisan itu, atau membaca kehabisan lapisan untuk mencari. Setiap tulisan membuat modifikasi dalam lapisan baca-tulis khusus wadah.
Mengurangi lapisan kembung
Salah satu kelemahan lapisan adalah membangun gambar yang menduplikasi file atau mengirim file yang dihapus di lapisan selanjutnya. Solusinya adalah sering menggabungkan beberapa perintah menjadi satu
RUN
perintah. Khususnya ketika Anda memodifikasi file yang sudah ada atau menghapus file, Anda ingin langkah-langkah tersebut berjalan di perintah yang sama di mana mereka pertama kali dibuat. Menulis ulang Dockerfile di atas akan terlihat seperti:Dan jika Anda membandingkan gambar yang dihasilkan:
Hanya dengan menggabungkan beberapa baris dalam contoh yang dibuat, kami mendapatkan konten yang dihasilkan sama di gambar kami, dan menyusut gambar kami dari 5MB menjadi hanya 1MB file yang Anda lihat di gambar akhir.
sumber
Sejak Docker v1.10, dengan pengenalan penyimpanan yang dapat dialamatkan konten, gagasan 'lapisan' menjadi sangat berbeda. Lapisan tidak memiliki gagasan tentang suatu gambar atau milik suatu gambar, mereka hanya menjadi kumpulan file dan direktori yang dapat dibagikan di seluruh gambar. Lapisan dan gambar menjadi terpisah.
Sebagai contoh, pada gambar lokal dibangun dari gambar dasar, katakanlah,
ubuntu:14.04
, yangdocker history
perintah menghasilkan rantai gambar, tetapi beberapa ID gambar akan ditampilkan sebagai 'hilang' karena sejarah membangun tidak lagi dimuat. Dan lapisan-lapisan yang menyusun gambar-gambar ini dapat ditemukan melaluiKonten lapisan disimpan di
/var/lib/docker/aufs/diff
jika pemilihan driver penyimpananaufs
. Tetapi layer-layer tersebut dinamai dengan ID cache yang dibuat secara acak, tampaknya tautan antara layer dan ID cache-nya hanya diketahui oleh Docker Engine karena alasan keamanan. Saya masih mencari cara untuk mencari tahuBlog ini memberikan banyak wawasan.
sumber
Per spesifikasi gambar Docker melalui The Moby Project :
Jadi, pada dasarnya, layer hanyalah sekumpulan perubahan yang dibuat pada sistem file.
sumber
"Each [Docker] layer is a set of filesystem changes."
(Dengan asumsi ini benar.) Untuk beberapa alasan saya tidak mengerti poin mendasar ini ketika membaca banyak dokumen lain / blog / Q + A's / etc, dan saya curiga keterbatasannya adalah milik mereka dan bukan milik saya. Apapun, bravo Aditya untuk sampai ke inti permasalahan.Saya pikir dokumen resmi memberikan penjelasan yang cukup rinci: https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/ .
(sumber: docker.com )
Gambar terdiri dari banyak lapisan yang biasanya dihasilkan dari Dockerfile, setiap baris di Dockerfile akan membuat layer baru, dan hasilnya adalah gambar, yang dilambangkan dengan bentuk
repo:tag
, sepertiubuntu:15.04
.Untuk informasi lebih lanjut, silakan baca dokumen resmi di atas.
sumber
Terima kasih @ David Castillo untuk informasi yang bermanfaat . Saya pikir layer adalah beberapa perubahan biner atau instruksi dari suatu gambar yang dapat dilakukan atau dibatalkan dengan mudah. Mereka dilakukan langkah demi langkah yang sama dengan layer pada layer, jadi kami menyebutnya "layer".
Untuk informasi lebih lanjut, Anda dapat melihat "riwayat buruh pelabuhan" seperti ini:
sumber
Pemahaman pribadi saya adalah bahwa kita dapat membandingkan layer docker dengan github commit. Untuk gambar dasar Anda (repo master baru Anda), Anda membuat beberapa komit, setiap komit mengubah status master Anda, itu sama di buruh pelabuhan, setiap lapisan melakukan beberapa operasi berdasarkan pada lapisan menengah sebelumnya. Dan kemudian, lapisan ini menjadi lapisan menengah baru ke lapisan berikutnya.
sumber
Saya dulu berpikir mereka seperti diff pada lapisan sebelumnya. Setelah membaca beberapa jawaban di sini saya tidak begitu yakin; mereka digambarkan sebagai set perubahan ke sistem file . Saya telah menulis beberapa Dockerfiles untuk menunjukkan mereka lebih seperti diff, yaitu, mereka benar-benar bergantung pada layer sebelumnya.
Diberi dua Dockerfiles ini
dan
orang akan mengharapkan lapisan yang sama jika mereka hanya tentang perubahan pada sistem file, tetapi ini tidak terjadi:
dan
Anda dapat melihat caranya, meskipun perubahan pada sistem file sama dalam kedua kasus, urutannya penting.
sumber