Apa Itu Lapisan Gambar Docker?

Gambar Docker terdiri dari beberapa lapisan yang secara kolektif menyediakan konten yang Anda lihat di wadah Anda. Tapi apa sebenarnya lapisan itu, dan apa bedanya dengan gambar utuh?

Dalam artikel ini Anda akan belajar bagaimana membedakan kedua konsep ini dan mengapa perbedaan itu penting. Meskipun Anda dapat menggunakan Docker tanpa pemahaman menyeluruh tentang lapisan, memiliki kesadaran akan tujuannya akan membantu Anda mengidentifikasi peluang pengoptimalan.

Apa itu Gambar?

Sebuah “gambar” Docker berperilaku seperti template dari mana wadah yang konsisten dapat dibuat. Jika Docker adalah mesin virtual tradisional, image dapat disamakan dengan ISO yang digunakan untuk menginstal VM Anda. Ini bukan perbandingan yang kuat, karena Docker berbeda dari VM dalam hal konsep dan implementasi, tetapi ini merupakan titik awal yang berguna.

Gambar menentukan status sistem file awal dari wadah baru. Mereka menggabungkan kode sumber aplikasi Anda dan dependensinya ke dalam paket mandiri yang siap digunakan dengan runtime container. Di dalam gambar, konten sistem file direpresentasikan sebagai beberapa lapisan independen.

Apa itu Layer?

Lapisan adalah hasil dari cara gambar Docker dibangun. Setiap langkah dalam Dockerfile membuat “lapisan” baru yang pada dasarnya merupakan perbedaan dari perubahan sistem file sejak langkah terakhir. Instruksi metadata seperti: LABEL dan MAINTAINER jangan membuat lapisan karena tidak mempengaruhi sistem file.

Gambar ini memiliki dua instruksi (COPY dan RUN) sehingga akan membuat dua lapisan:

FROM ubuntu:latest
COPY foo.txt /foo.txt
RUN date > /built-on.txt
  • Salinan langkah pertama foo.txt menjadi lapisan baru yang didasarkan pada ubuntu:latest gambar.
  • Langkah kedua menjalankan date perintah dan menyalurkan outputnya ke dalam file. Ini menciptakan lapisan kedua yang didasarkan pada yang sebelumnya.

Membuat foo.txt di direktori kerja Anda:

$ echo "Hello World" > foo.txt

Sekarang buat gambar sampel:

$ docker build . -t demo:latest
Sending build context to Docker daemon   2.56kB
Step 1/3 : FROM ubuntu:latest
 ---> df5de72bdb3b
Step 2/3 : COPY foo.txt /foo.txt
 ---> 4932aede6a15
Step 3/3 : RUN date > /built-on.txt
 ---> Running in 91d260fc2e68
Removing intermediate container 91d260fc2e68
 ---> 6f653c6a60fa
Successfully built 6f653c6a60fa
Successfully tagged foo:latest

Setiap langkah build memancarkan ID dari layer yang dibuat. Lapisan langkah terakhir menjadi gambar terakhir sehingga ditandai dengan foo:latest.

Urutan mengungkapkan bahwa lapisan adalah gambar Docker yang valid. Meskipun istilah “lapisan” biasanya tidak digunakan untuk merujuk pada gambar yang diberi tag, semua gambar yang diberi tag secara teknis hanyalah lapisan dengan pengenal yang ditetapkan.

Anda dapat memulai wadah dari gambar lapisan perantara:

$ docker run -it 4932aede6a15 sh
# cat /foo.txt
Hello World
# cat /built-on.txt
cat: /built-on.txt: No such file or directory

Contoh ini memulai wadah dari lapisan yang dibuat oleh langkah pembangunan kedua. foo.txt tersedia dalam wadah tetapi built-on.txt tidak ada karena tidak ditambahkan sampai langkah ketiga. File itu hanya tersedia di sistem file lapisan berikutnya.

Peran Lapisan

Lapisan berisi perubahan yang dibuat oleh langkah pembuatan, relatif terhadap lapisan sebelumnya di Dockerfile. FROM instruksi adalah kasus khusus yang mereferensikan lapisan terakhir dari gambar yang ada.

Lapisan memungkinkan langkah-langkah pembangunan di-cache untuk menghindari pekerjaan yang berlebihan. Docker dapat melewati instruksi yang tidak diubah di Dockerfile Anda dengan menggunakan kembali lapisan yang dibuat sebelumnya. Ini mendasarkan langkah berikutnya pada lapisan yang ada, alih-alih membangun yang baru.

Anda dapat melihat ini dengan memodifikasi Dockerfile Anda sebagai berikut:

FROM ubuntu:latest
COPY foo.txt /foo.txt
RUN date +%Y-%m-%d > /built-on.txt

Langkah pembangunan ketiga telah berubah. Sekarang bangun kembali gambar Anda:

$ docker build . -t demo:latest
Sending build context to Docker daemon  3.584kB
Step 1/3 : FROM ubuntu:latest
 ---> df5de72bdb3b
Step 2/3 : COPY foo.txt /foo.txt
 ---> Using cache
 ---> 4932aede6a15
Step 3/3 : RUN date +%Y-%m-%d > /built-on.txt
 ---> Running in 2b91ec0462c4
Removing intermediate container 2b91ec0462c4
 ---> c6647ff378c1
Successfully built c6647ff378c1
Successfully tagged demo:latest

Langkah pembuatan kedua menunjukkan sebagai Using cache dan menghasilkan ID lapisan yang sama. Docker dapat melewati pembuatan lapisan ini karena sudah dibuat sebelumnya dan foo.txt tidak berubah sejak build pertama.

Caching ini hanya berfungsi sampai sebuah layer dimodifikasi. Semua langkah setelah lapisan itu perlu dibangun kembali juga sehingga didasarkan pada revisi sistem file baru.

Lapisan dan Operasi Tarik

Manfaat lain dari lapisan adalah bagaimana mereka memungkinkan penarikan gambar parsial. Setelah Anda mengunduh beberapa gambar ke mesin Anda, Anda akan sering menemukan tarikan baru dapat melewati beberapa lapisan yang sudah Anda miliki. Gambar ini berisi 13 lapisan tetapi hanya enam yang harus diunduh dengan operasi tarik:

docker pull php:8.0-apache
8.0-apache: Pulling from library/php
7a6db449b51b: Already exists 
ad2afdb99a9d: Already exists 
dbc5aa907229: Already exists 
82f252ab4ad1: Already exists 
bf5b34fc9894: Already exists 
6161651d3d95: Already exists 
cf2adf296ef1: Already exists 
f0d7c5221e44: Pull complete 
f647198f6316: Pull complete 
c37afe1da4e5: Pull complete 
09c93531cbca: Pull complete 
fef371007dd3: Pull complete 
52043dbb1c06: Pull complete 
Digest: sha256:429889e8f9eac0a806a005b0728a004303b0d49d77b09496d39158707abd6280
Status: Downloaded newer image for php:8.0-apache
docker.io/library/php:8.0-apache

Lapisan lain sudah ada di host Docker sehingga dapat digunakan kembali. Ini meningkatkan kinerja dan menghindari pemborosan bandwidth jaringan.

Memeriksa Lapisan Gambar

Anda dapat membuat daftar lapisan dalam gambar dengan menjalankan docker image history memerintah. Setiap lapisan menampilkan ID dari gambar yang dibuat dan instruksi Dockerfile yang menyebabkan perubahan. Anda dapat melihat ukuran total konten di dalam lapisan juga.

$ docker image history 
IMAGE          CREATED         CREATED BY                                      SIZE      COMMENT
6f653c6a60fa   4 minutes ago   /bin/sh -c date > /built-on.txt                 29B       
f8420d1a96f3   4 minutes ago   /bin/sh -c #(nop) COPY file:a5630a7506b26a37...   0B        
df5de72bdb3b   4 weeks ago     /bin/sh -c #(nop)  CMD ["bash"]                 0B        
<missing>      4 weeks ago     /bin/sh -c #(nop) ADD file:396eeb65c8d737180...   77.8MB    

Lapisan terakhir ditampilkan sebagai <missing> karena mengacu pada lapisan di dalam ubuntu:latest gambar dasar. Ini tidak tersedia secara lokal, karena hanya lapisan terakhir dari gambar dasar (df5de72bdb3b) ditarik ke bawah selama build. Tidak perlu secara mandiri menarik semua lapisan perantara saat Anda ingin menggunakan gambar tertentu.

Ringkasan

Gambar dan lapisan Docker umumnya merupakan istilah yang dapat dipertukarkan. Lapisan adalah gambar dan gambar terbentuk dari satu atau lebih lapisan. Perbedaan utama terletak pada tag: gambar akan ditandai dan dirancang untuk pengguna akhir, sedangkan istilah “lapisan” biasanya mengacu pada gambar perantara yang tidak ditandai yang dibuat sebagai bagian dari operasi pembuatan. Ini tidak terlihat kecuali Anda mencarinya.

Ada satu topik lagi yang berhubungan dengan lapisan: menjalankan wadah menambahkan lapisan tambahan yang dapat ditulis di atas gambarnya. Lapisan yang bersumber dari gambar penampung bersifat hanya-baca sehingga modifikasi sistem file yang dibuat oleh penampung menargetkan lapisan ephemeral yang dapat ditulis. Lapisan yang dapat ditulis akan dibuang saat penampung dihentikan atau dihapus.

Leave a Comment