Interaksi Container

Interaksi Container

Bitnesia • Sep 8, 2026 60 •EN

Container yang sudah menyala bukan berarti pekerjaan kita selesai. Setelah docker run berhasil membuat container, Sysadmin/DevOps Engineer masih perlu memeriksa apakah aplikasi di dalamnya berjalan normal, membaca log untuk melacak error, atau masuk ke dalam container untuk debugging langsung. Developer yang sedang mengembangkan aplikasi juga sering butuh mengintip isi container, menjalankan perintah satu kali untuk pengecekan, atau memantau pemakaian resource supaya container tidak membebani mesin development. Bab ini membahas empat cara utama berinteraksi dengan container yang sedang berjalan: masuk ke dalamnya lewat exec dan attach, membaca log lewat docker logs, memantau resource lewat docker top, serta melihat statistik dan event container secara real-time lewat docker stats dan docker events.

8.1 Masuk ke Container

Docker menyediakan dua perintah berbeda untuk masuk ke dalam container yang sedang berjalan: docker exec dan docker attach. Keduanya sering tertukar karena sama-sama membuka sesi interaktif, padahal cara kerjanya jauh berbeda dan berdampak berbeda pula pada container yang sedang aktif.

8.1.1 Exec ke Container

Perintah docker exec menjalankan proses baru di dalam namespace container yang sudah berjalan, terpisah dari proses utama (PID 1) yang sedang aktif. Karena membuat proses baru, docker exec aman dipakai kapan pun tanpa mengganggu proses utama container. Siapkan dulu container nginx sebagai contoh.

docker run -d --name demo-nginx nginx:1.27

Masuk ke shell container lewat docker exec dengan opsi -i (--interactive) dan -t (--tty), persis seperti kombinasi opsi pada docker run.

docker exec -it demo-nginx sh

Prompt terminal berubah menandakan kita sekarang berada di dalam shell container. Coba beberapa perintah dasar untuk memastikan sesi ini benar-benar terhubung ke filesystem container, bukan ke mesin host.

ls /etc/nginx
cat /etc/os-release
exit

Ketik exit untuk keluar dari sesi shell. Berbeda dari docker run -it, keluar dari sesi docker exec tidak menghentikan container, karena proses sh yang dijalankan lewat exec cuma proses tambahan, bukan proses utama container. Container demo-nginx tetap menyala meski sesi shell-nya sudah ditutup, cek lewat docker ps untuk memastikan.

docker ps --filter name=demo-nginx

docker exec tidak selalu harus membuka sesi interaktif. Untuk perintah sekali jalan, cukup panggil perintahnya langsung tanpa opsi -it, berguna misalnya untuk memeriksa isi file konfigurasi tanpa perlu masuk ke shell sama sekali.

docker exec demo-nginx cat /etc/nginx/nginx.conf

Opsi -u (--user) berguna saat kita perlu menjalankan perintah sebagai user tertentu di dalam container, berbeda dari user default yang dipakai proses utama. Ini sering dipakai Sysadmin/DevOps Engineer saat container berjalan sebagai non-root user demi keamanan, tapi butuh akses root sesaat untuk keperluan debugging atau instalasi tool tambahan.

docker exec -u root demo-nginx whoami

Coba jalankan docker exec ke container yang sudah berhenti untuk melihat perilaku error-nya. Hentikan dulu container contoh, lalu coba masuk lagi.

docker stop demo-nginx
docker exec -it demo-nginx sh

Docker menolak dengan error Error response from daemon: Container <container_id> is not running. Pesan ini jelas menandakan docker exec cuma bisa dipakai pada container yang statusnya benar-benar running; kalau container sudah berhenti, tidak ada proses aktif yang bisa "dititipi" proses baru.

8.1.2 Attach ke Container

Berbeda dari docker exec yang membuat proses baru, docker attach justru menyambungkan terminal kita langsung ke STDIN, STDOUT, dan STDERR milik proses utama (PID 1) container yang sedang berjalan. Nyalakan kembali container contoh, lalu coba attach.

docker start demo-nginx
docker attach demo-nginx

Terminal langsung menampilkan output log nginx secara live, seolah kita sedang menempel langsung ke output proses utamanya. Di titik ini penting diperhatikan risikonya: karena secara default opsi --sig-proxy bernilai true, menekan Ctrl+C di sesi attach meneruskan sinyal SIGINT ke proses utama container, yang pada banyak aplikasi berarti proses tersebut ikut berhenti, dan container pun ikut mati. Ini beda jauh dari docker exec yang aman ditinggal kapan saja.

Untuk keluar dari sesi attach tanpa menghentikan container, gunakan kombinasi tombol detach Ctrl-P diikuti Ctrl-Q (hanya berfungsi kalau container awalnya dijalankan dengan opsi -it). Coba kombinasi ini di sesi attach yang masih terbuka.

Kalau butuh masuk lagi ke sesi attach tanpa risiko sinyal ikut mematikan proses utama, tambahkan opsi --sig-proxy=false supaya Ctrl+C hanya menutup sesi attach di sisi client, tanpa diteruskan ke dalam container.

docker attach --sig-proxy=false demo-nginx

Di lapangan, Sysadmin/DevOps Engineer lebih sering memilih docker exec -it <container> sh ketimbang docker attach untuk keperluan debugging harian, justru karena risiko tidak sengaja mematikan proses utama lewat attach jauh lebih kecil pada exec. docker attach baru benar-benar dibutuhkan saat kita memang perlu berinteraksi langsung dengan proses utama container, misalnya container yang dijalankan interaktif lewat docker run -it dan sempat ter-detach tanpa sengaja.

Bersihkan container contoh sebelum lanjut ke sub-bab berikutnya.

docker rm -f demo-nginx

8.2 Melihat Logs Container

Perintah docker logs menampilkan output yang ditulis proses utama container ke STDOUT dan STDERR, sumber informasi utama untuk melacak error atau memantau aktivitas aplikasi tanpa perlu masuk ke dalam container. Siapkan container nginx sebagai contoh, lalu kirim beberapa request supaya ada log yang tercatat.

docker run -d --name demo-nginx -p 8080:80 nginx:1.27
curl http://localhost:8080

Tampilkan seluruh log yang tercatat sejak container dijalankan.

docker logs demo-nginx
/docker-entrypoint.sh: Configuration complete; ready for start up
172.17.0.1 - - [08/Sep/2026:10:15:22 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/8.5.0" "-"

Untuk log yang terus bertambah secara real-time, tambahkan opsi -f (--follow), mirip perilaku tail -f pada file log biasa.

docker logs -f demo-nginx

Buka terminal lain, kirim beberapa request tambahan, dan perhatikan baris log baru langsung muncul di terminal yang sedang follow. Tekan Ctrl+C untuk menghentikan mode follow; ini aman dan tidak memengaruhi container sama sekali, karena docker logs hanya membaca output yang sudah tercatat, bukan menyambung langsung ke proses utama seperti docker attach.

Untuk log yang sudah menumpuk banyak, opsi --tail membatasi jumlah baris terakhir yang ditampilkan, supaya tidak perlu menggulir ribuan baris log lama.

docker logs --tail 20 demo-nginx

Opsi --since dan --until memfilter log berdasarkan rentang waktu, menerima format waktu relatif seperti 10m (10 menit terakhir) maupun timestamp absolut format RFC 3339.

docker logs --since 10m demo-nginx

Tambahkan opsi -t (--timestamps) untuk menyertakan timestamp di setiap baris log, berguna saat kita perlu mencocokkan waktu kejadian error dengan log dari sistem lain.

docker logs -t --tail 5 demo-nginx

docker logs hanya bisa membaca log lewat logging driver tertentu, yaitu json-file (driver default Docker), local, dan journald. Kalau container dijalankan dengan logging driver lain yang tidak mendukung pembacaan langsung, misalnya syslog atau fluentd, perintah docker logs akan menolak dan menampilkan error semacam Error response from daemon: configured logging driver does not support reading. Cek logging driver yang dipakai sebuah container lewat docker inspect.

docker inspect --format '{{.HostConfig.LogConfig.Type}}' demo-nginx

Di lapangan, log yang ditampilkan docker logs ikut membesar seiring waktu selama logging driver-nya json-file tanpa batas ukuran (rotasi) yang dikonfigurasi, berpotensi memenuhi disk host pada container yang sangat cerewet menulis log dalam jangka panjang. Sysadmin/DevOps Engineer di production biasanya mengatur opsi max-size dan max-file pada logging driver json-file supaya log lama otomatis dirotasi, bukan mengandalkan ukuran log yang terus tumbuh tanpa batas.

Bersihkan container contoh sebelum lanjut.

docker rm -f demo-nginx

8.3 Monitoring Resource Usage

Selain log aplikasi, memantau proses dan resource yang dipakai container sama pentingnya, terutama saat mendiagnosis container yang terasa lambat atau tidak responsif. Perintah docker top menampilkan daftar proses yang berjalan di dalam sebuah container, dilihat langsung dari sudut pandang host karena Docker container berbagi kernel yang sama dengan host-nya.

docker run -d --name demo-nginx nginx:1.27
docker top demo-nginx
UID    PID    PPID   C    STIME   TTY   TIME       CMD
root   4821   4799   0    10:20   ?     00:00:00   nginx: master process nginx -g daemon off;
101    4867   4821   0    10:20   ?     00:00:00   nginx: worker process

Kolom PID di atas adalah PID di namespace host, bukan PID di dalam container, karena docker top sebenarnya menjalankan ps dari sisi host dengan filter proses milik container tersebut. Ini berguna buat Sysadmin/DevOps Engineer yang perlu tahu proses container mana yang menyumbang beban CPU tinggi di level host, tanpa harus masuk dulu ke dalam container.

docker top menerima opsi tambahan sama seperti perintah ps biasa di Linux, misalnya untuk menampilkan kolom penggunaan memori.

docker top demo-nginx aux

Kalau container sudah berhenti, docker top otomatis gagal karena memang tidak ada proses aktif untuk diperiksa. Hentikan dulu container contoh untuk melihat perilakunya.

docker stop demo-nginx
docker top demo-nginx

Docker menampilkan error Error response from daemon: Container <container_id> is not running, mirip perilaku docker exec pada container yang sudah berhenti; keduanya sama-sama butuh proses aktif di dalam container untuk bisa bekerja.

Nyalakan kembali container contoh sebelum lanjut ke sub-bab berikutnya.

docker start demo-nginx

8.4 Container Stats dan Events

docker top menunjukkan proses yang berjalan, tapi belum menjawab pertanyaan berapa besar CPU, memori, atau bandwidth jaringan yang benar-benar dipakai container. Untuk itu Docker menyediakan docker stats, yang menampilkan metrik resource secara live, dan docker events, yang menampilkan aliran event real-time dari Docker daemon.

8.4.1 Docker Stats

Jalankan docker stats tanpa argumen untuk melihat statistik seluruh container yang sedang berjalan, diperbarui terus secara live layaknya top pada sistem Linux.

docker stats
CONTAINER ID   NAME         CPU %   MEM USAGE / LIMIT     MEM %   NET I/O          BLOCK I/O   PIDS
7a1b2c3d4e5f   demo-nginx   0.00%   3.406MiB / 7.762GiB   0.04%   1.24kB / 0B      0B / 0B     2

Kolom MEM USAGE / LIMIT menampilkan pemakaian memori container dibanding batas atas yang dialokasikan untuknya, sedangkan NET I/O dan BLOCK I/O masing-masing menunjukkan total lalu lintas jaringan dan operasi baca/tulis disk sejak container dijalankan. Kolom PIDS mencatat jumlah proses dan thread aktif di dalam container, angka yang berguna untuk mendeteksi fork bomb atau proses yang membiak tak terkendali di dalam container.

Untuk memantau container tertentu saja, sebutkan namanya secara eksplisit.

docker stats demo-nginx

Karena docker stats secara default terus mengalir (streaming) dan mengunci terminal, tambahkan opsi --no-stream saat kita hanya butuh satu snapshot angka, misalnya dipakai di dalam skrip otomatis yang tidak boleh menunggu tanpa batas waktu.

docker stats --no-stream demo-nginx

Opsi --format menyesuaikan kolom yang ditampilkan memakai Go template, berguna saat statistik ini perlu diproses lebih lanjut oleh tool monitoring lain.

docker stats --no-stream --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"

Di lapangan, penting diketahui bahwa di Linux, CLI docker stats menghitung MEM USAGE dengan mengurangi pemakaian page cache dari total memori cgroup container, supaya angkanya lebih mendekati memori yang benar-benar dipakai aktif oleh aplikasi, bukan sekadar cache kernel yang sifatnya bisa dilepas kapan saja. Meski begitu, angka ini tetap bisa berbeda dari hasil tool profiling di level aplikasi, karena cara cgroup menghitung memori shared library dan buffer tidak selalu sama persis dengan cara aplikasi menghitung memori miliknya sendiri. Jangan buru-buru menyimpulkan aplikasi bocor memori (memory leak) hanya dari kenaikan MEM USAGE tanpa memeriksa lebih dalam lewat tool profiling di level aplikasi.

8.4.2 Docker Events

docker events menampilkan aliran event real-time dari Docker daemon, mencatat setiap perubahan status yang terjadi pada container, image, volume, maupun network di mesin Docker kita. Jalankan perintah berikut di satu terminal untuk mulai memantau.

docker events

Buka terminal lain, lakukan beberapa aksi terhadap container contoh, lalu perhatikan event yang muncul di terminal docker events.

docker stop demo-nginx
docker start demo-nginx
2026-09-08T10:25:01.123456789Z container die 7a1b2c3d4e5f (image=nginx:1.27, name=demo-nginx)
2026-09-08T10:25:01.234567890Z container stop 7a1b2c3d4e5f (image=nginx:1.27, name=demo-nginx)
2026-09-08T10:25:05.345678901Z container start 7a1b2c3d4e5f (image=nginx:1.27, name=demo-nginx)

Tekan Ctrl+C untuk menghentikan pemantauan; sama seperti docker logs -f, ini tidak berdampak apa pun pada container karena docker events hanya membaca stream event dari daemon, bukan menyambung ke proses container.

Opsi --filter mempersempit event yang ditampilkan, misalnya hanya event bertipe container milik container tertentu.

docker events --filter container=demo-nginx --filter event=die

Sama seperti docker logs, opsi --since dan --until berguna untuk menelusuri event yang sudah lewat, bukan cuma yang terjadi live saat perintah dijalankan.

docker events --since 30m --until 0m

Di lapangan, docker events jadi andalan Sysadmin/DevOps Engineer untuk membangun audit trail sederhana atau memicu automasi eksternal, misalnya skrip yang otomatis mengirim notifikasi ke tim saat event die atau oom (container dimatikan paksa kernel karena kehabisan memori) muncul pada container penting di production. Karena docker events hanya menampilkan event yang terjadi setelah perintah dijalankan (kecuali dibatasi --since), pastikan proses pemantauan ini berjalan terus-menerus di background, bukan dijalankan sesaat lalu ditutup, supaya tidak ada event penting yang terlewat.

Bersihkan container contoh yang dipakai sepanjang bab ini.

docker rm -f demo-nginx
PerintahFungsi
docker exec -it <container> shMenjalankan proses baru di dalam container yang sedang berjalan
docker attach <container>Menyambungkan terminal ke proses utama (PID 1) container
docker logs -f <container>Menampilkan dan mengikuti output STDOUT/STDERR container
docker top <container>Menampilkan daftar proses yang berjalan di dalam container
docker stats <container>Menampilkan pemakaian CPU, memori, network, dan disk secara live
docker eventsMenampilkan aliran event real-time dari Docker daemon