Dalam dunia pengembangan perangkat lunak, Docker telah menjadi salah satu platform yang sangat populer untuk mengelola aplikasi secara efisien. Salah satu fitur utama dari Docker adalah kemampuannya untuk mengemas, mendistribusikan, dan menjalankan aplikasi dalam wadah yang disebut sebagai Docker container. Namun, apa sebenarnya yang ada di dalam sebuah container? Bagaimana lapisan-lapisan Docker image bekerja? Pada artikel ini, kita akan menggali lapisan-lapisan Docker image dan mempelajari lebih lanjut tentang cara kerjanya.
1. Pengenalan ke Docker Image
Docker image adalah template yang digunakan oleh Docker untuk membuat container. Image ini terdiri dari beberapa lapisan (layers) yang dikombinasikan menjadi satu.
Lapisan-lapisan ini dapat berisi file sistem operasi, perangkat lunak pendukung, dependensi aplikasi, dan kode aplikasi itu sendiri. Setiap lapisan dalam Docker image bersifat read-only (tidak dapat diubah), dan semua data yang ditulis ke dalam container disimpan sebagai lapisan baru.
1.1 Struktur Hierarchy
Struktur hierarki pada sebuah Docker image terdiri dari beberapa lapisan dengan basis pada lapisan sebelumnya. Dalam struktur tersebut, layer terakhir disebut sebagai container layer atau writable layer, karena inilah tempat dimana data ditulis saat container berjalan.
1.2 Union File System
Salah satu hal unik tentang Docker adalah penggunaan Union File System (UFS) untuk menggabungkan dan mengelola lapisan-lapisan dalam Docker image. UFS memungkinkan data pada lapisan yang berbeda untuk tampak sebagai satu sistem file yang sama di dalam container.
Dalam implementasinya, UFS menggunakan pendekatan Copy-on-Write (COW), yang berarti ketika data perlu diubah, Docker akan membuat salinan lapisan tersebut dan menerapkannya ke lapisan baru, sehingga tidak merusak konten asli dari lapisan sebelumnya.
2. Membangun Docker Image
Untuk membangun Docker image, Anda perlu membuat Dockerfile, yaitu file teks yang berisi instruksi untuk membangun image. Instruksi-instruksi ini mencakup langkah-langkah seperti mengunduh dan menginstal dependensi, menyalin file aplikasi ke dalam container, dan melakukan konfigurasi lain yang diperlukan.
Ketika Anda menjalankan perintah docker build dengan menggunakan Dockerfile tersebut, Docker Engine akan membaca instruksi-instruksi tersebut dan secara otomatis membangun image baru berdasarkan konfigurasi yang ditentukan.
2.1 Membagi Command Instruction
Dalam banyak kasus, sebuah command instruction pada sebuah Dockerfile dapat dipecah menjadi beberapa lapisan terpisah oleh cache layer ketika dikompilasi oleh Docker Engine. Ini memungkinakan caching pada level instruction tanpa harus me-rebuild seluruh image saat ada perubahan pada sebuah instruction.
2.2 Mengoptimalkan Size Image
Ukuran image docker yang besar bisa menjadi masalah ketika dilakukan pembuatan dan pengiriman image. Untuk mengoptimalkan ukuran image, beberapa teknik yang dapat digunakan antara lain adalah mengurangi dependensi yang tidak perlu, menggunakan multi-stage build untuk membuang dependensi build-time, dan melakukan kompresi terhadap file-file dalam image.
3. Mengelola Docker Image
Docker menyediakan berbagai perintah untuk mengelola Docker image. Beberapa perintah yang umum digunakan meliputi docker pull untuk mengunduh image dari registry Docker, docker push untuk mendorong (push) image ke registry Docker, dan docker rmi untuk menghapus (remove) suatu image.
Anda juga dapat membuat tag pada sebuah image dengan menggunakan perintah docker tag, sehingga memudahkan dalam mengidentifikasi versi atau variabel dari suatu image.
3.1 Menjalankan Container dari Image
Setelah Anda memiliki Docker image yang siap, Anda dapat menjalankan container berdasarkan pada image tersebut dengan menggunakan perintah docker run. Dalam perintah ini, Anda dapat menentukan opsi seperti port mapping, volume mounting, dan lainnya.
Setiap kali container dijalankan, lapisan new writable akan ditambahkan di atas lapisan read-only dari Docker image asli. Ini memungkinkan container untuk memiliki state-nya sendiri tanpa merusak konten asli dalam Docker image.
3.2 Membuat Container Snapshot sebagai Image Baru
Docker juga memungkinkan Anda untuk membuat snapshot dari sebuah container yang berjalan dan menyimpannya sebagai Docker image baru. Hal ini berguna ketika Anda ingin memperbaiki atau memperbarui suatu container yang telah dikonfigurasi dengan sempurna.
Dengan menggunakan perintah docker commit, Anda dapat membuat image baru berdasarkan pada container yang sedang berjalan. Image baru ini kemudian dapat digunakan untuk membuat instance container lain dengan konfigurasi yang sama.
Dalam kesimpulan, lapisan-lapisan Docker image membantu kita dalam mengelola dependensi dan mendistribusikan aplikasi secara efisien. Dengan pemahaman tentang struktur hierarki, Union File System, dan langkah-langkah membangun serta mengelola Docker image, kita dapat lebih efektif mengembangkan dan menjalankan aplikasi menggunakan Docker.