Container Pertama

Menjalankan image pertama dengan docker run, shell interaktif, dan membaca siklus hidup container.

Daftar isi

Topik ini mempraktikkan pengoperasian container, instans yang berjalan di atas sebuah image, templat read-only berisi sistem berkas aplikasi. Perintah docker run dijalankan untuk pertama kalinya pada image resmi alpine, shell interaktif di dalam container dicoba, dan pembersihan otomatis diuji dengan opsi --rm. Bagian akhir menunjukkan cara membaca status container melalui docker ps, menghentikan dan menjalankan kembali container, serta menghapusnya dengan docker rm.

Menjalankan perintah sekali pakai#

docker run menerima nama image beserta perintah yang dijalankan di dalamnya. Bentuk paling sederhana menjalankan satu perintah pendek, lalu selesai begitu perintah itu berakhir.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# menjalankan satu perintah singkat di dalam container alpine
docker run alpine:3.20 sh -c 'echo arsip cadangan disalin'

Apabila image alpine:3.20 belum tersimpan di komputer, daemon menarik (pull) image itu terlebih dahulu dari registry. Daemon adalah proses latar belakang Docker yang mengerjakan seluruh pekerjaan container, sedangkan registry adalah gudang image yang melayani permintaan unduhan melalui jaringan. Penarikan hanya terjadi sekali, karena image yang sudah tersimpan dipakai ulang oleh setiap docker run berikutnya. Image alpine dipakai pada seluruh contoh topik ini karena ukurannya kecil, status resminya dikurasi Docker, dan shell beserta alat dasarnya ikut tersedia di dalamnya.

Setelah image siap, sh dijalankan dengan opsi -c. sh adalah shell, program yang membaca dan menafsirkan perintah, sedangkan opsi -c membuat shell mengeksekusi argumen berikutnya sebagai satu perintah. Teks yang dihasilkan echo tampil di terminal, proses utama berakhir, dan container berpindah ke status exited.

Container yang sudah exited tetap tersimpan beserta lapisan tulisnya, sehingga jejaknya masih dapat diperiksa melalui docker ps -a. Status inilah yang diperiksa pada bagian akhir topik ini. Perilaku bawaan ini berbeda dengan opsi --rm yang menghapus container segera setelah prosesnya berakhir.

Shell interaktif di dalam container#

Isi image dapat dijelajahi dengan membuka shell interaktif di dalam container. Opsi -i menjaga masukan standar tetap terbuka, sedangkan opsi -t mengalokasikan terminal sehingga prompt dan keluaran terlihat seperti sesi terminal biasa. Kedua opsi lazim ditulis gabungan -it.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# membuka shell interaktif di dalam container
docker run -it alpine:3.20 sh

Prompt berubah dan menandakan perintah berikutnya dibaca oleh shell di dalam container, bukan oleh terminal di host, komputer tempat Docker berjalan. Dari sini perintah seperti ls dan cat /etc/os-release dijalankan untuk melihat isi image, dan perintah exit menutup sesi tersebut. Isi sistem berkas yang terlihat dari shell tersebut adalah milik container, bukan milik host, karena sistem berkasnya disusun dari layer image beserta lapisan tulis. Perintah hostname menampilkan pengenal container yang berbeda dari nama host, dan perintah ps menampilkan proses yang berjalan di dalam container saja. Eksplorasi semacam ini aman karena perubahan apa pun hanya menulis pada lapisan tulis container, sedangkan image tetap utuh.

Karena shell adalah proses utama container, shell yang ditutup dengan exit membuat container ikut berhenti dan berstatus exited. Menjalankan docker run -it yang sama lagi tidak melanjutkan container lama, melainkan membuat container baru dari image yang sama.

Pembersihan otomatis dengan opsi –rm#

Secara bawaan, container yang berhenti tetap tersimpan dan menumpuk di daftar container. Opsi --rm mengubah perilaku itu, sehingga container beserta lapisan tulisnya dihapus secara otomatis begitu proses utama berakhir. Perilaku ini cocok untuk tugas sekali pakai yang tidak perlu meninggalkan jejak.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# container dihapus otomatis segera setelah prosesnya berakhir
docker run --rm alpine:3.20 sh -c 'echo tugas sekali pakai selesai'

Tanpa opsi ini, setiap percobaan meninggalkan satu container berstatus exited yang tetap tercatat pada docker ps -a. Daftar itu tidak mengganggu container lain, tetapi menumpuk seiring banyaknya percobaan sehingga pembersihan berkala dengan docker rm menjadi perlu. Opsi --rm menjaga daftar tersebut tetap bersih tanpa penghapusan manual. Polanya sejalan dengan prinsip bahwa container adalah objek sekali pakai, sedangkan data yang bernilai disimpan di luar container.

Menghentikan, menjalankan kembali, dan menghapus container#

Status container paling mudah diamati pada proses yang berjalan cukup lama. Contoh berikut menjalankan container bernama penghitung dengan proses sleep yang berjalan selama dua menit, sehingga status container sempat diperiksa dari terminal.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# menjalankan container bernama penghitung dengan proses yang tidur dua menit
docker run --name penghitung alpine:3.20 sh -c 'sleep 120'

# menghentikan container dari terminal kedua selama proses masih berjalan
docker stop penghitung

# menampilkan seluruh container beserta statusnya
docker ps -a

# menjalankan kembali container yang sama tanpa membuat container baru
docker start penghitung

# menghentikan kembali, lalu menghapus container
docker stop penghitung
docker rm penghitung

Opsi --name memberi nama tetap sehingga container mudah dirujuk oleh perintah berikutnya. Perintah docker stop mengirim sinyal penghentian ke proses utama, dan apabila proses tidak merespons dalam batas waktu bawaan, proses dihentikan secara paksa. Perintah docker start menjalankan kembali proses utama pada container yang sama beserta lapisan tulisnya, berbeda dengan docker run yang selalu membuat container baru. Perintah docker rm menghapus container secara permanen, dan Docker menolaknya apabila container masih berjalan, sehingga container dihentikan lebih dahulu.

Perbandingan docker ps dan docker ps -a dirangkum pada tabel berikut.

PerintahYang ditampilkanKegunaan
docker psHanya container yang sedang berjalanMemeriksa layanan yang sedang hidup
docker ps -aSeluruh container, termasuk yang berhentiMelacak container berhenti beserta kode keluarnya

Pada container yang berjalan, kolom STATUS memuat lama waktu berjalan. Pada container yang berhenti, kolom itu memuat kata exited diikuti kode keluar dalam tanda kurung, dan kode 0 menandakan proses berakhir normal. Kolom NAMES memuat nama container, sedangkan kolom IMAGE memuat image asalnya.

Kesalahan umum#

  • Mengira docker run melanjutkan container yang sudah ada. docker run selalu membuat container baru, sehingga perintah yang diulang tanpa --rm memunculkan banyak container berstatus exited dengan nama acak. Perbaikannya, jalankan kembali container lama dengan docker start nama, dan gunakan --rm untuk tugas sekali pakai.
  • Mengira container hilang karena docker ps tidak menampilkannya. docker ps hanya menampilkan container yang berjalan, sedangkan container yang berhenti masih tersimpan. Perbaikannya, periksa dengan docker ps -a sebelum menyimpulkan sebuah container sudah terhapus.
  • Menjalankan docker run -it untuk masuk ke container yang sedang berjalan. Perintah itu justru membuat container baru. Perbaikannya, gunakan docker exec -it nama sh untuk membuka shell pada container yang sudah berjalan.
  • Menjalankan docker run --name penghitung dua kali tanpa menghapus yang lama. Docker menolak dengan error karena nama container harus unik di antara seluruh container yang tersimpan. Perbaikannya, hapus container lama dengan docker rm terlebih dahulu, atau gunakan nama yang berbeda.

Ringkasan#

  • docker run menarik image bila belum tersimpan, membuat container baru, lalu menjalankan proses utamanya, dan container berpindah ke status exited begitu proses itu berakhir.
  • Opsi -it membuka shell interaktif di dalam container, sedangkan perintah exit menutup shell dan sekaligus menghentikan container karena shell adalah proses utamanya.
  • Opsi --rm menghapus container beserta lapisan tulisnya secara otomatis setelah prosesnya berakhir, sehingga cocok untuk tugas sekali pakai.
  • docker ps menampilkan container yang berjalan dan docker ps -a menyertakan yang berhenti, sedangkan docker stop, docker start, dan docker rm mengatur siklus hidupnya.

Referensi#