Pola Pikir Immutability

Container dirancang sementara: data di dalamnya hilang saat container dihapus dan cara berpikir yang mengikutinya.

Daftar isi

Container dirancang untuk hidup sebentar dan mudah diganti, sifat yang disebut ephemeral, yakni sementara. Topik ini menjelaskan akibat rancangan tersebut, yaitu seluruh data di dalam container hilang ketika container dihapus, lalu membahas pola kerja yang mengikutinya. Pola itu mencakup immutability (prinsip bahwa image tidak pernah diubah, melainkan diganti), konfigurasi lewat variabel lingkungan, peletakan data di luar container, dan tabel yang membandingkan kebiasaan lama dengan kebiasaan container.

Container dirancang sementara#

Sistem berkas container terdiri atas layer image yang read-only dan satu lapisan tulis tipis milik container itu sendiri. Lapisan tulis adalah satu-satunya tempat perubahan tertulis, dan umurnya terikat pada umur container. Container yang dihentikan masih dapat dijalankan kembali beserta seluruh isinya, tetapi container yang dihapus membuang lapisan tulisnya seketika, termasuk seluruh berkas yang ditulis di dalamnya. Perbedaan antara menghentikan dan menghapus menjadi kunci pada bagian ini. Perintah docker stop hanya menghentikan proses utama, sedangkan docker rm membuang container beserta lapisan tulisnya, dan tindakan terakhir itu tidak dapat dibatalkan.

Kehilangan ini bukan cacat, melainkan konsekuensi dari rancangan. Image tetap utuh setelah container dihapus, sehingga container baru dari image yang sama dapat dimunculkan kapan saja. Yang hilang hanyalah pekerjaan yang hanya tersimpan di lapisan tulis, misalnya log lokal dan berkas sementara. Perintah berikut menghapus sebuah container beserta seluruh isinya.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# menghapus container berarti membuang lapisan tulisnya
docker rm arsip-catatan

Berhenti memperbaiki dari dalam, bangun ulang image#

Cara merawat server lama adalah masuk ke mesin, menyunting berkas aplikasi secara langsung, lalu memulai ulang layanannya. Kebiasaan itu menimbulkan configuration drift, kondisi ketika isi server menyimpang dari catatannya karena revisi manual yang tidak terdokumentasi. Dua server yang awalnya sama dapat berbeda perilaku setelah beberapa bulan dirawat dengan cara itu.

Pola container menutup celah tersebut dengan prinsip immutability, yaitu image yang sudah ada tidak pernah diubah, melainkan diganti. Perbaikan aplikasi dikerjakan pada sumbernya, lalu image baru dibangun dari Dockerfile yang direvisi. Container baru kemudian dijalankan dari image itu, sedangkan container lama dibuang. Karena dibangun dari resep yang sama, dua image dengan nama dan tag yang sama berisi berkas yang identik, sehingga container yang dibuat darinya berperilaku sama.

Prinsip yang sama menyederhanakan rollback, tindakan mengembalikan layanan ke versi sebelumnya. Image versi lama masih tersimpan dengan tag versinya, sehingga pengembalian cukup dilakukan dengan menjalankan container dari image tersebut. Tidak ada penyalinan cadangan manual dan tidak ada pembangunan ulang, karena versi sebelumnya tidak pernah hilang.

Konfigurasi masuk lewat variabel lingkungan#

Prinsip immutability menuntut agar satu image yang sama dapat dipakai di banyak lingkungan, misalnya lingkungan pengembangan dan produksi. Pembedanya bukan isi image, melainkan variabel lingkungan, pasangan nama dan nilai yang dikirim saat container dijalankan dan terbaca oleh proses di dalamnya. Aplikasi membaca variabel itu untuk menentukan perilakunya, misalnya alamat basis data atau mode operasi.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# satu image, dua perilaku lewat variabel lingkungan
docker run -e MODE=pengembangan alpine:3.20 sh -c 'echo mode: $MODE'
docker run -e MODE=produksi alpine:3.20 sh -c 'echo mode: $MODE'

Kedua perintah di atas memakai image yang sama, tetapi masing-masing mengirim nilai MODE yang berbeda, sehingga teks yang ditampilkan keduanya berbeda pula. Konfigurasi tidak perlu ditanam ke dalam image, sehingga image tetap netral dan aman dibagikan. Nama variabel lazim ditulis dengan huruf kapital, misalnya MODE, dan nilai yang dikirim berupa teks bebas. Image yang terdokumentasi baik mencantumkan variabel yang dibacanya beserta nilai bawaannya, sehingga konfigurasi dapat disiapkan tanpa membaca kode aplikasinya. Data yang berubah terus, seperti isi basis data aplikasi catatan, juga tidak ditanam di lapisan tulis, melainkan disimpan di luar container pada volume, area penyimpanan yang dikelola Docker dan tersedia lebih lama daripada container itu sendiri.

Kebiasaan lama versus kebiasaan container#

Perbedaan terpenting antara kebiasaan lama dan kebiasaan container terletak pada arah perubahan. Pada server lama, perubahan mengalir ke dalam sistem yang sedang berjalan, sedangkan pada container, perubahan mengalir ke dalam image yang baru. Tabel berikut menyandingkan kedua kebiasaan itu pada aspek yang sering dijumpai.

Kebiasaan pada server lamaKebiasaan dengan container
Masuk ke server, lalu menyunting berkas aplikasi secara langsungMerevisi sumber dan Dockerfile, lalu membangun image baru
Menyimpan konfigurasi di berkas pada serverMengirim konfigurasi sebagai variabel lingkungan saat container dijalankan
Menyimpan data aplikasi di direktori aplikasiMenyimpan data di luar container, misalnya pada volume
Melacak versi dengan catatan manualMenandai setiap versi sebagai image dengan tag berbeda
Mengembalikan versi dengan menyalin cadangan manualMengembalikan versi dengan menjalankan image lama yang masih tersimpan

Langkah kebiasaan pada kolom kanan terlihat lebih panjang pada awalnya karena setiap perubahan melewati pembangunan image. Langkah itu terbayar ketika layanan harus dipulihkan, karena container dianggap objek yang mudah diganti dan bukan mesin yang dirawat bertahun-tahun. Seluruh keadaan layanan tercakup oleh image, konfigurasi, dan volume, dan ketiganya dapat dibaca ulang tanpa menebak isi container yang sedang berjalan.

Ringkasan#

  • Lapisan tulis container hilang bersama container yang dihapus, sehingga data yang perlu tersimpan lebih lama ditempatkan di luar container.
  • Perbaikan dikerjakan pada sumber dan Dockerfile, lalu image baru dibangun dan container lama dibuang, sesuai prinsip immutability.
  • Konfigurasi masuk lewat variabel lingkungan sehingga satu image yang sama dapat dipakai di banyak lingkungan.
  • Rollback dilakukan dengan menjalankan image versi lama yang masih tersimpan, tanpa penyalinan cadangan manual.

Referensi#