Kembali ke Artikel

Cara Masuk ke Container: docker exec, logs, dan Debugging

Solusi IT

Cara masuk ke container yang sedang jalan adalah dengan perintah docker exec -it nama_container bash. Kalau image-nya berbasis Alpine dan tidak punya bash, ganti dengan docker exec -it nama_container sh. Setelah itu kamu berada di dalam shell container, bisa lihat file, cek proses, dan edit konfigurasi seperti di server biasa.

Artikel ini bagian kelima dari seri Belajar Docker dari Nol. Di sini kita bahas docker exec masuk container secara praktik: masuk ke container nginx, cari dan edit file konfigurasinya, lalu reload tanpa restart. Kita juga bahas cara memantau aplikasi lewat docker logs dan docker stats, mengambil file dengan docker cp, plus error klasik bash not found yang hampir pasti kamu temui.

Di proyek klien, tim Arrazy hampir setiap hari memakai kombinasi exec dan logs ini untuk debug backend Go dan Laravel yang jalan di container. Ini skill dasar yang kepakai terus sampai level production.

Prasyarat Sebelum Mulai

Tutorial ini memakai Docker Engine 27.x di Ubuntu 24.04. Perintahnya sama persis di Windows dan macOS yang memakai Docker Desktop. Cek versimu dulu:

docker --version

Output yang diharapkan kurang lebih seperti ini:

Docker version 27.5.1, build 9f9e405

Kamu juga perlu paham konsep menjalankan container di background dan port mapping. Kalau belum, baca dulu bagian sebelumnya: Docker Port Mapping, Mode Detach, dan Environment Variable.

docker exec -it: Masuk ke Shell Container yang Sedang Jalan

Perintah docker exec menjalankan perintah tambahan di dalam container yang sudah berjalan. Formatnya:

docker exec [opsi] nama_container perintah

Dua opsi yang hampir selalu dipakai bersamaan:

  • -i (interactive): menjaga input tetap terbuka, jadi apa yang kamu ketik diteruskan ke container
  • -t (tty): memberi terminal virtual, jadi tampilannya seperti terminal normal lengkap dengan prompt

Digabung jadi -it. Tanpa keduanya, shell memang jalan tapi kamu tidak bisa mengetik apa-apa. Contoh paling umum:

docker exec -it web bash

Perintah ini membuka shell bash di dalam container bernama web. Untuk keluar, ketik exit atau tekan Ctrl+D. Container tetap jalan setelah kamu keluar, karena yang berhenti hanya proses bash yang tadi kamu buka, bukan proses utama container.

Bedanya docker exec dan docker run

Pemula sering menukar dua perintah ini. Padahal fungsinya beda jauh:

Aspek docker run docker exec
Fungsi Membuat container baru dari image Menjalankan perintah di container yang sudah jalan
Butuh apa Image Container berstatus running
Efek Muncul container baru di docker ps Tidak ada container baru
Contoh kasus Start nginx pertama kali Cek isi file config nginx yang sedang jalan

Jadi kalau kamu menjalankan docker run -it nginx bash dengan niat “masuk ke nginx yang tadi”, yang terjadi justru Docker membuat container nginx kedua yang terpisah total. File yang kamu ubah di situ tidak akan berpengaruh ke container pertama. Ini sumber kebingungan yang sangat sering terjadi.

Praktik: Masuk ke Container Nginx dan Edit Konfigurasinya

Biar nempel, kita praktik langsung. Jalankan nginx versi 1.27 di background dengan port mapping:

docker run -d --name web -p 8080:80 nginx:1.27

Pastikan jalan:

docker ps

Kolom STATUS harus menunjukkan Up. Sekarang masuk ke dalamnya:

docker exec -it web bash

Prompt kamu berubah jadi seperti ini, tanda kamu sudah di dalam container:

root@3f2a1b9c7d5e:/#

Mencari file konfigurasi nginx

Konfigurasi utama nginx ada di /etc/nginx/nginx.conf, dan konfigurasi per situs ada di /etc/nginx/conf.d/. Cek isinya:

cat /etc/nginx/conf.d/default.conf

Kamu akan lihat blok server yang listen di port 80 dan menyajikan file dari /usr/share/nginx/html.

Edit konfigurasi tanpa editor

Image nginx resmi itu ramping, tidak ada nano atau vim di dalamnya. Tapi ada sed, jadi kita bisa edit file langsung dari command line. Kita tambahkan header custom supaya perubahannya gampang dibuktikan:

sed -i 's|listen       80;|listen       80;\n    add_header X-Diedit-Dari "dalam-container";|' /etc/nginx/conf.d/default.conf

Validasi dulu sebelum reload. Ini kebiasaan wajib biar nginx tidak mati gara-gara typo:

nginx -t

Output yang diharapkan:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Kalau sudah ok, reload nginx tanpa restart container:

nginx -s reload

Keluar dari container dengan exit, lalu tes dari mesin host:

curl -I http://localhost:8080

Di antara header respons, kamu akan melihat baris ini:

X-Diedit-Dari: dalam-container

Berhasil. Kamu baru saja masuk ke container yang sedang jalan, mengubah konfigurasinya, dan me-reload service tanpa downtime.

Tidak harus buka shell dulu

Untuk perintah sekali jalan, kamu tidak perlu masuk shell. Langsung saja:

docker exec web nginx -t
docker exec web cat /etc/nginx/conf.d/default.conf

Pola ini enak dipakai di script atau saat cuma butuh satu informasi cepat.

Memantau Aplikasi: docker logs, docker stats, dan docker cp

Masuk ke container itu satu hal. Tapi sebagian besar sesi debugging justru dimulai dari membaca log dari luar.

docker logs -f –tail: membaca log real time

Container yang baik menulis log ke stdout dan stderr, dan Docker menangkap semuanya. Lihat log container nginx tadi:

docker logs web

Dua opsi yang paling sering dipakai:

docker logs -f --tail 50 web
  • --tail 50: hanya tampilkan 50 baris terakhir, bukan seluruh riwayat log yang bisa ribuan baris
  • -f (follow): terus menampilkan log baru secara real time, seperti tail -f di Linux

Coba buka http://localhost:8080 di browser sambil docker logs -f jalan. Setiap request langsung muncul sebagai baris access log baru. Tekan Ctrl+C untuk berhenti mengikuti log. Ini tidak mematikan container, hanya berhenti menonton.

docker stats: cek pemakaian CPU dan memori

Aplikasi lambat atau server penuh? Cek konsumsi resource semua container secara live:

docker stats

Outputnya kurang lebih:

CONTAINER ID   NAME   CPU %   MEM USAGE / LIMIT     MEM %   NET I/O       BLOCK I/O   PIDS
3f2a1b9c7d5e   web    0.00%   4.2MiB / 7.6GiB       0.05%   1.2kB/850B    0B/0B       5

Dari sini kelihatan container mana yang rakus memori atau CPU. Tekan Ctrl+C untuk keluar. Kalau cuma mau snapshot sekali tanpa tampilan live, pakai docker stats --no-stream.

docker cp: ambil file dari dalam container

Kadang kamu butuh menyalin file dari container ke laptop, misalnya file konfigurasi atau log aplikasi yang ditulis ke file. Formatnya docker cp sumber tujuan:

docker cp web:/etc/nginx/conf.d/default.conf ./default.conf

File config tadi sekarang ada di folder kerjamu di host. Arah sebaliknya juga bisa, dari host ke container:

docker cp ./default.conf web:/etc/nginx/conf.d/default.conf

Setelah menyalin config baru ke dalam, jangan lupa docker exec web nginx -s reload supaya perubahan terbaca.

Kapan docker exec Cocok untuk Debug, dan Apa Batasnya

Gunakan docker exec untuk hal-hal yang sifatnya memeriksa dan bereksperimen: cek apakah file environment terbaca, tes koneksi ke database dari dalam container, lihat isi folder, atau coba ubah satu nilai config untuk membuktikan hipotesis. Cepat, tanpa rebuild, tanpa restart.

Tapi ada satu hal penting yang wajib kamu pahami: semua perubahan lewat exec itu sementara. Perubahan tersimpan di writable layer milik container itu saja, bukan di image. Begitu container dihapus dan dibuat ulang dari image yang sama, misalnya lewat docker rm lalu docker run lagi, semua editanmu hilang dan kondisi kembali seperti bawaan image.

Jadi alurnya yang sehat seperti ini:

  1. Pakai docker exec untuk menemukan akar masalah dan menguji perbaikan
  2. Setelah terbukti, pindahkan perbaikan itu ke tempat yang permanen: Dockerfile, file yang di-mount lewat volume, atau environment variable
  3. Rebuild atau recreate container, lalu verifikasi ulang

Di tim Arrazy, aturan mainnya sama saat membangun sistem aplikasi untuk klien: exec hanya untuk investigasi, perbaikan permanen selalu masuk ke Dockerfile atau konfigurasi yang diversion-control. Kalau perbaikan cuma hidup di dalam container, satu kali server restart bisa mengembalikan bug yang sama dan tidak ada yang tahu kenapa.

Troubleshooting: Error yang Sering Dialami Pemula

OCI runtime exec failed: bash not found

Kamu menjalankan docker exec -it nama_container bash lalu muncul:

OCI runtime exec failed: exec failed: unable to start container process:
exec: "bash": executable file not found in $PATH: unknown

Penyebab: image-nya berbasis Alpine Linux, misalnya nginx:1.27-alpine atau redis:7-alpine. Alpine tidak menyertakan bash, adanya sh. Solusinya ganti perintahnya:

docker exec -it nama_container sh

Fungsinya sama saja untuk keperluan debug. Kalau ragu image apa yang dipakai container, cek dengan docker ps di kolom IMAGE.

Container is not running

Error response from daemon: container abc123 is not running

Penyebab: docker exec hanya bisa dipakai ke container yang statusnya running. Kalau container-nya sudah exit, tidak ada proses yang bisa ditumpangi. Cek statusnya dengan docker ps -a. Kalau statusnya Exited, lihat dulu kenapa dia mati lewat docker logs nama_container, perbaiki penyebabnya, lalu start ulang dengan docker start nama_container sebelum exec.

The input device is not a TTY

the input device is not a TTY

Penyebab paling umum: menjalankan docker exec -it dari Git Bash atau MinTTY di Windows, atau dari dalam script otomatis yang tidak punya terminal interaktif. Solusi di Git Bash: awali perintah dengan winpty, jadi winpty docker exec -it web bash. Kalau di dalam script atau cron, buang opsi -t dan jalankan perintah non-interaktif saja, misalnya docker exec web nginx -t.

docker logs kosong padahal aplikasi jalan

Kamu menjalankan docker logs tapi tidak ada output sama sekali. Penyebab yang paling sering: aplikasinya menulis log ke file di dalam container, bukan ke stdout/stderr. Docker hanya menangkap stdout dan stderr dari proses utama. Solusinya ada dua: konfigurasi aplikasi supaya log ke stdout (praktik standar untuk container), atau ambil file lognya dengan docker exec -it nama_container sh lalu cat, atau salin keluar pakai docker cp.

Rangkuman dan Lanjut ke Bagian Berikutnya

Sekarang kamu punya empat senjata utama untuk berurusan dengan container yang sedang jalan: docker exec -it untuk masuk ke shell, docker logs -f --tail untuk membaca log real time, docker stats untuk memantau resource, dan docker cp untuk memindahkan file. Kamu juga sudah paham kenapa perubahan lewat exec hilang setelah container dibuat ulang, dan kapan harus memindahkan perbaikan ke Dockerfile.

Bagian berikutnya dari seri ini membahas “Mengelola Docker Image: Pull, Tag, dan Docker Hub”. Di sana kita bedah cara kerja tag image, kenapa latest itu jebakan, dan cara menyimpan image buatanmu sendiri. Artikelnya terbit menyusul, pantau daftarnya di halaman hub Belajar Docker.

Referensi

BACA JUGA

Artikel Lainnya di Kategori Docker

Ingin Membaca Artikel Lainnya?

Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.

Lihat Semua Artikel