Exec

Membuka shell interaktif di dalam container yang berjalan dan batasan image minimal tanpa shell.

Daftar isi

Topik ini membahas docker exec, perintah untuk menjalankan perintah tambahan di dalam container yang sedang berjalan. Pembahasan mencakup eksekusi sekali jalan, sesi interaktif di dalam container, perbandingannya dengan akses jarak jauh, serta batasan pada image minimal. Setelah membacanya, bagian dalam container yang berjalan dapat diperiksa tanpa menghentikan container itu sendiri.

Menjalankan perintah pada container yang berjalan#

docker exec membuat proses baru di dalam container yang sudah hidup, berdampingan dengan proses utamanya. Namespace, fitur kernel yang mengisolasi pandangan sebuah proses, tetap milik container tersebut, sehingga perintah yang dieksekusi melihat sistem berkas, jaringan, dan daftar proses yang sama dengan proses utama. Perintahnya hanya dieksekusi selama proses utama masih hidup, dan tidak dijalankan ulang ketika container direstart.

Perbedaannya dengan docker run terletak pada objek yang dibuat. docker run membuat container baru dari sebuah image, sedangkan exec bekerja pada container yang sudah ada. Tabel berikut merangkum perbedaan itu.

Aspekdocker rundocker exec
Objek yang dibuatContainer baru dari sebuah imageProses baru di dalam container yang sudah ada
Container sasaranBelum ada, dibuat oleh perintah itu sendiriWajib dalam keadaan berjalan
Akibat pada containerContainer baru muncul dan tetap terdaftarTidak ada perubahan pada container sasaran

Perintah sekali jalan mengeksekusi satu program, menampilkan keluarannya ke terminal host, yaitu mesin tempat Docker berjalan, lalu berakhir. Contoh berikut memeriksa isi direktori aplikasi dan versi Python pada container catatan-app tanpa membuka sesi apa pun.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# daftar berkas di dalam direktori aplikasi
docker exec catatan-app ls /app
# versi Python yang dipakai container
docker exec catatan-app python --version

Container tetap berjalan sebelum, selama, dan sesudah eksekusi. Keluaran perintahnya tampil langsung di terminal, sehingga hasil pemeriksaannya segera terbaca. Pola sekali jalan ini cocok untuk pemeriksaan tunggal, misalnya membaca satu berkas konfigurasi atau menguji apakah sebuah program tersedia di dalam image.

Sesi shell interaktif dengan -it#

Untuk menjelajah isi container, exec juga dapat membuka shell di dalam container. Shell adalah program yang membaca dan menafsirkan perintah yang diketik. Dua opsi digunakan bersama untuk keperluan itu. Opsi -i menjaga stdin, aliran masukan program, tetap terbuka, sehingga ketikan diteruskan ke proses di dalam container. Opsi -t mengalokasikan terminal semu, sehingga keluarannya ditampilkan seperti sesi terminal biasa.

Perintah lengkapnya bergantung pada isi image. Image alpine dan image ramping lainnya hanya membawa sh, sedangkan image berbasis Debian atau Ubuntu membawa bash. Contoh berikut membuka shell di dalam container aplikasi catatan.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# buka shell interaktif di dalam container
docker exec -it catatan-app sh

Di dalam sesi itu, perintah ls /app menampilkan isi direktori aplikasi dan env menampilkan variabel lingkungan yang terbawa, lalu exit mengakhiri sesi. Menutup sesi exec tidak menghentikan container, karena shell hanyalah proses tamu di dalamnya. Perilaku ini berbeda dari docker run -it catatan sh yang dijalankan tanpa mode latar. Pada perintah itu, shell menjadi proses utama sebuah container baru, sehingga keluar dari shell berarti mengakhiri container.

bash
# tidak-dijalankan: daemon Docker tidak tersedia di sandbox
# shell menjadi proses utama container baru, keluar berarti container berakhir
docker run -it catatan sh

Perbedaan dengan SSH#

Masuk ke sebuah mesin melalui SSH, layanan akses jarak jauh yang lazim pada mesin virtual, terlihat serupa tetapi bekerja dengan cara yang berbeda. Jalur SSH membutuhkan server SSH yang berjalan di dalam container, port yang dibuka, serta pengelolaan kata sandi atau kunci. Semua itu menambah proses, permukaan serangan, dan pekerjaan pemeliharaan pada setiap image yang membutuhkannya.

docker exec tidak membutuhkan salah satu dari itu. Perintah ini mengirim permintaan langsung kepada daemon Docker melalui API-nya, lalu daemon memulai proses baru di dalam namespace container. Tidak ada server ekstra yang harus dipasang di image, tidak ada port tambahan, dan tidak ada kredensial yang dikelola. Hak aksesnya mengikuti hak menjalankan docker exec di host.

Konsekuensinya, exec cocok sebagai alat diagnosis cepat pada container apa pun yang masih hidup, termasuk image pihak lain yang tidak mungkin dimodifikasi. SSH tetap menjadi pilihan untuk mesin virtual dan server sungguhan, sedangkan di dalam container exec menggantikan peran itu tanpa server, port, dan kredensial tambahan.

Batasan image minimal#

Shell yang dibuka exec hanya ada bila image membawanya. Image distroless, kategori image yang hanya memuat aplikasi beserta pustaka runtime-nya tanpa alat sistem, tidak menyertakan sh, bash, maupun ls. Perintah docker exec -it nama sh pada image semacam itu gagal dengan pesan error yang menyatakan berkas eksekusi tidak ditemukan, dan sesi tidak pernah terbuka.

Batasan ini memang disengaja oleh perancang image minimal, karena shell yang tersedia justru memperluas permukaan serangan. Diagnosisnya pun tidak berhenti di exec. Log tetap tersedia melalui docker logs, metadata container dapat dibaca dengan docker inspect, dan beberapa image menyediakan varian khusus diagnosis yang membawa shell beserta alat debug.

Pemilihan image pun menjadi pertimbangan sejak awal. Image berbasis alpine memberi keseimbangan praktis antara ukuran kecil dan ketersediaan sh, sedangkan image distroless menuntut pendekatan diagnosis tanpa shell sejak perancangannya. Keduanya sah, asalkan konsekuensi diagnosisnya sudah diperhitungkan.

Ringkasan#

  • docker exec membuat proses baru di dalam container yang berjalan tanpa membuat container baru, dan proses itu melihat sistem berkas serta jaringan yang sama dengan proses utama.
  • Exec tanpa opsi menjalankan satu perintah sekali jalan, sedangkan -i dan -t membuka shell interaktif di dalam container.
  • Menutup sesi exec tidak menghentikan container, berbeda dengan docker run -it yang menjadikan shell sebagai proses utamanya.
  • Image minimal seperti distroless tidak membawa shell, sehingga exec terhadapnya hanya bisa menjalankan program yang benar-benar ada di dalam image.

Referensi#