Image dan Container

Image sebagai templat read-only dan container sebagai instans yang berjalan di atasnya.

Daftar isi

Docker memasangkan dua objek inti, yaitu image, templat read-only yang hanya dapat dibaca dan berisi sistem berkas beserta metadata aplikasi, serta container, instans yang berjalan di atas image tersebut. Topik ini merinci isi image, lapisan tulis milik container, makna docker run sebagai gabungan pembuatan dan penjalanan, dan cara membaca status siklus hidup container melalui docker ps -a. Setelah topik ini selesai, hubungan antara templat dan instans dapat dijelaskan dengan istilah yang tepat.

Image sebagai templat read-only#

Image adalah paket mandiri yang berisi dua hal, yaitu sistem berkas aplikasi dan metadata. Sistem berkasnya memuat pustaka, runtime, dan seluruh berkas yang dibutuhkan aplikasi, sedangkan metadatanya mencatat perintah default yang dijalankan saat container dimulai, variabel lingkungan awal, dan rincian lain yang ditetapkan saat image dibangun. Karena seluruh kebutuhan itu ikut dikemas, image dapat berjalan di komputer mana pun yang memasang Docker tanpa pemasangan tambahan.

Sifat read-only berarti isi image tidak pernah diubah selama dipakai. Docker menomori image dengan pengenal unik dan menghitung isinya, sehingga image yang sama di dua komputer berisi berkas yang persis sama. Apabila aplikasi perlu diperbarui, image baru dibangun dari sumber yang direvisi, sedangkan image lama tetap tersimpan untuk keperluan pengembalian versi. Daftar image yang tersimpan di komputer lokal dapat dilihat dengan perintah berikut.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# menampilkan image yang tersimpan di komputer lokal
docker image ls

Perintah tersebut menampilkan tabel berisi nama repository, yaitu nama penyimpanan image, tag sebagai label versi, pengenal unik image, waktu pembuatan, dan ukurannya. Pembahasan nama lengkap image tersedia pada topik tentang registry, gudang image tempat image disimpan dan dibagikan, di modul ini.

Container sebagai instans yang berjalan#

Container adalah image yang sedang hidup, yaitu proses yang dijalankan dengan isolasi namespace. Namespace adalah teknik kernel untuk memisahkan pandangan proses, jaringan, dan sistem berkas dari host, komputer tempat Docker berjalan. Saat sebuah container dimulai, Docker menyusun sistem berkas container dari layer image, kumpulan perubahan sistem berkas yang read-only, lalu menambahkan satu lapisan tulis tipis di bagian paling atas. Seluruh penulisan yang terjadi selama container hidup, misalnya berkas log yang baru dibuat, tertulis pada lapisan tulis itu dan tidak pernah menyentuh image.

Satu image dapat memunculkan banyak container. Diagram berikut memperlihatkan satu image alpine yang dipakai untuk menjalankan tiga container dengan tugas berbeda.

docker runImagealpine:3.20templat read-onlylapisan tulisContainer catatanlapisan tulisContainer statistiklapisan tulisContainer cadangan
Satu image alpine:3.20 memancarkan tiga container, masing-masing dengan lapisan tulis tersendiri

Ketiga container membaca layer image yang sama, tetapi lapisan tulisnya terpisah sepenuhnya. Perubahan di dalam satu container tidak terlihat oleh container lain dan tidak mengubah image. Menghapus container berarti membuang lapisan tulisnya, sedangkan image tetap utuh dan siap memunculkan container berikutnya.

docker run sebagai create dan start#

docker run melakukan dua langkah sekaligus. Langkah pertama adalah create, yaitu membuat container baru dari sebuah image, dan langkah kedua adalah start, yaitu menjalankan proses utama container itu. Proses utama adalah proses yang menjaga container tetap berjalan. Kedua langkah juga dapat dipisahkan apabila container perlu disiapkan lebih dahulu sebelum dijalankan.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# gabungan create dan start dalam satu perintah
docker run --name cadangan alpine:3.20 sh -c 'echo arsip disalin'

# dua langkah yang setara dengan docker run
docker create --name cadangan alpine:3.20 sh -c 'echo arsip disalin'
docker start cadangan

Opsi --name memberi nama tetap pada container sehingga container itu mudah dirujuk oleh perintah berikutnya. Tanpa opsi tersebut, daemon, proses latar belakang Docker yang mengerjakan seluruh pekerjaan container, menghasilkan nama acak secara otomatis. Pada contoh di atas, proses utama hanya menjalankan satu perintah echo yang menampilkan teksnya ke terminal, kemudian berakhir. Proses yang berakhir membuat container berpindah dari status running ke status exited, tetapi container itu sendiri tetap tersimpan.

Pemisahan create dan start berguna apabila container perlu disiapkan lebih dahulu, misalnya saat konfigurasinya disusun oleh langkah lain sebelum prosesnya dijalankan. Container hasil docker create berstatus created dan belum menjalankan proses apa pun. Perintah docker start kemudian menjalankan proses utama pada container yang sama, dan lapisan tulis yang sudah terbentuk tetap dipakai.

Siklus hidup container#

Container melewati beberapa status selama hidupnya, dan daemon mencatat perpindahan antarstatus itu. Tabel berikut merangkum status utamanya beserta maknanya.

StatusMakna
createdContainer sudah dibuat dari image, tetapi proses utamanya belum pernah dijalankan.
runningProses utama sedang berjalan.
pausedProses utama dibekukan sementara oleh docker pause dan dapat dilanjutkan dengan docker unpause.
exitedProses utama sudah berakhir, baik karena tugasnya selesai maupun karena error.

Daftar status setiap container terbaca pada kolom STATUS di keluaran docker ps -a. Perintah docker ps tanpa opsi hanya menampilkan container yang sedang running, sedangkan opsi -a menyertakan container yang berhenti. Untuk container yang sedang berjalan, kolom STATUS memuat keterangan lama berjalan, sedangkan untuk container yang berhenti kolom itu memuat kata exited diikuti kode keluar proses utamanya dalam tanda kurung. Kode keluar 0 menandakan proses berakhir normal, sedangkan kode selain 0 menandakan adanya error.

Ringkasan#

  • Image adalah templat read-only berisi sistem berkas dan metadata, sedangkan container adalah instans berjalan yang menambahkan satu lapisan tulis tipis di atas layer image.
  • Satu image dapat memunculkan banyak container yang saling terpisah, dan tulisan pada lapisan satu container tidak memengaruhi image maupun container lain.
  • docker run menggabungkan dua langkah, yaitu docker create yang membuat container dan docker start yang menjalankan proses utamanya.
  • Status container terbaca pada kolom STATUS di docker ps -a dengan nilai utama created, running, paused, dan exited.

Referensi#