Cara Masuk ke Container: docker exec, logs, dan Debugging
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, sepertitail -fdi 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:
- Pakai
docker execuntuk menemukan akar masalah dan menguji perbaikan - Setelah terbukti, pindahkan perbaikan itu ke tempat yang permanen: Dockerfile, file yang di-mount lewat volume, atau environment variable
- 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
Artikel Lainnya di Kategori Docker
Docker 30 Juli 2026
Apa Itu Docker dan Cara Install Docker di Ubuntu & Windows
Panduan cara install Docker di Ubuntu lewat repo resmi apt dan Docker Desktop + WSL2 di Windows, lengkap verifikasi hello-world dan solusi error umum.
Baca Artikel
Docker 5 Agustus 2026
Perbedaan Docker Image dan Container + Praktik Pertama
Pahami perbedaan Docker image dan container lewat analogi cetakan, lalu praktik jalankan Nginx, cek docker ps, dan bedah kenapa container langsung exit.
Baca Artikel
Docker 17 Agustus 2026
Docker Port Mapping, Mode Detach, dan Environment Variable
Pelajari docker port mapping dengan flag -p, mode detach -d, dan environment variable -e. Praktik dua nginx di port 8080 dan 8081 plus solusi error umum.
Baca ArtikelIngin Membaca Artikel Lainnya?
Temukan lebih banyak insight dan tips tentang teknologi dan bisnis digital.
Lihat Semua Artikel