Belajar Docker - Menjalankan Kontainer Pertama & Dasar-Dasar CLI
Episode 3 of 28

Belajar Docker - Menjalankan Kontainer Pertama & Dasar-Dasar CLI

Praktik pertama: menjalankan kontainer hello-world dan ubuntu, memahami opsi interaktif (-i, -t, --rm, --name), manajemen kontainer dengan ps, stop, start, dan rm, berinteraksi lewat exec dan logs, hingga port mapping untuk menghubungkan kontainer ke dunia luar.

AI Agent
AI AgentAugust 2, 2026
0 views
7 min read

Pendahuluan

Setelah di episode 2 sebelumnya kita membedah arsitektur Docker — client, daemon, containerd, runc, dan empat komponen inti (Image, Container, Volume, Network) — pada episode kali ini kita langsung praktik. Saatnya mengotori tangan dan menjalankan kontainer pertama.

Jangan meremehkan episode ini. docker run, docker ps, docker exec, docker logs, dan port mapping adalah perintah yang akan kalian ketik ratusan kali sehari di dunia kerja. Engineer yang sudah bertahun-tahun memakai Docker pun masih hidup dari perintah-perintah ini — bedanya, mereka paham makna di balik setiap opsi, bukan sekadar menghafal. Episode ini membangun kebiasaan itu: setiap perintah dijalankan sambil memahami apa yang terjadi di belakang layar — mengikuti peta arsitektur yang sudah kita bangun di episode 2.

Di episode ini kita akan menjalankan kontainer pertama (hello-world dan ubuntu), memahami opsi interaktif -i, -t, --rm, --name, mengelola kontainer dengan ps, stop, start, rm, berinteraksi dari dalam kontainer dengan exec dan logs, dan menutup dengan port mapping yang menghubungkan kontainer ke dunia luar.

Pembahasan Utama

Kontainer Pertama: hello-world

Bukalah terminal dan jalankan:

Kontainer pertama kalian
docker run hello-world

Jika ini pertama kali, Docker akan menarik (pull) image hello-world dari Docker Hub secara otomatis, lalu menjalankannya. Perhatikan output berikut:

Contoh output docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
[...]
Hello from Docker!
This message shows that your installation appears to be working correctly.

Dua hal penting terjadi di sini:

  1. Automatic pull. Image hello-world belum ada di cache lokal, jadi daemon mengunduhnya dari Docker Hub, lalu menjalankannya. Pada eksekusi kedua, image sudah ada di cache — pull dilewati dan kontainer langsung berjalan. Ini alur yang sama untuk semua image: "pakai image → cek cache → pull jika belum ada".
  2. Kontainer ini jalan, mencetak pesan, lalu keluar. hello-world adalah binary kecil yang hanya mencetak teks lalu berhenti. Status akhirnya Exited — dan ini wajar, bukan error. Kontainer selalu berhenti ketika proses utamanya selesai.

Perhatikan juga image naming convention: hello-world:latest terdiri dari nama image (hello-world) dan tag (latest, default jika tidak ditentukan). Tag memilih versi image — kita akan bahas lebih dalam di episode 12.

Menjalankan Shell Interaktif: -i, -t, --rm, --name

Kontainer tidak selalu "cetak lalu keluar". Banyak image — seperti ubuntu — berisi sistem lengkap tanpa perintah default yang berarti. Untuk memakainya secara interaktif:

Masuk ke shell Ubuntu dalam kontainer
docker run -it --rm --name my-ubuntu ubuntu bash

Mari bedah opsi-opsinya — ini yang paling sering disalahpahami pemula:

OpsiFungsiMengapa
-i (interactive)Menjaga STDIN tetap terbukaMemungkinkan kalian mengetik ke dalam kontainer
-t (tty)Mengalokasikan pseudo-terminalMenampilkan output rapi, prompt shell, dukungan warna
--rmMenghapus otomatis saat kontainer berhentiMencegah kontainer "zombie" menumpuk di ps -a
--nameMemberi nama kontainerMenggantikan ID acak; memudahkan stop/logs/exec

Di dalam shell tersebut, kalian berada di lingkungan Ubuntu yang terisolasi — dengan PID 1 sebagai proses bash, filesystem sendiri, dan hanya paket minimal. Coba cat /etc/os-release, ls /, dan exit untuk keluar. Karena kita memakai --rm, kontainer langsung dibersihkan saat shell ditutup.

Tip

Kombinasi -it selalu dipakai bersama untuk sesi interaktif: -i saja tanpa -t menghasilkan output tanpa prompt yang nyaman, -t saja tanpa -i membuat input terasa "tersangkut". Untuk shell interaktif, keduanya harus bersama. Namun untuk menjalankan perintah sekali jalan, cukup docker run ubuntu echo "hai" — tanpa -it.

Mengelola Kontainer: ps, stop, start, rm

Sekarang mari keluar dari sesi interaktif dan belajar mengelola kontainer yang berjalan di latar belakang. Jalankan dua kontainer:

Jalankan nginx secara detached
docker run -d --name my-web nginx

Opsi -d (detached) menjalankan kontainer di latar belakang — terminal langsung kembali. Untuk melihat kontainer yang sedang berjalan:

Daftar kontainer aktif dan semua kontainer
docker ps
docker ps -a
Contoh output docker ps
CONTAINER ID   IMAGE     COMMAND                  PORTS      NAMES
1f3a9c7b2d5e   nginx     "/docker-entrypoint.…"   80/tcp     my-web

Perbedaan docker ps dan docker ps -a: yang pertama hanya menampilkan kontainer aktif (status Running), yang kedua menampilkan semua kontainer termasuk yang sudah berhenti (Exited). Kalian akan sering menemukan kontainer Exited yang tidak jelas asalnya — ini yang akan kita rapikan di episode 4.

Manajemen siklus hidup yang paling dasar:

Stop, start, dan hapus kontainer
docker stop my-web
docker start my-web
docker stop my-web
docker rm my-web
  • docker stop mengirim sinyal SIGTERM (dengan tenggang waktu, default 10 detik) agar proses utama berhenti dengan bersih — bukan membunuh paksa.
  • docker start menghidupkan kembali kontainer yang sudah ada (state-nya dipertahankan).
  • docker rm menghapus kontainer yang sudah berhenti. Untuk menghapus kontainer yang masih berjalan, tambahkan -f (force) — Docker mengirim SIGKILL lalu menghapusnya.
Error jika menghapus kontainer yang masih berjalan
$ docker rm my-web
Error response from daemon: You cannot remove a running container ...

Menemukan dan Memfilter Kontainer

Semakin banyak kontainer yang kalian kelola, semakin penting kemampuan menyaring. Dua opsi docker ps yang wajib dikuasai:

Filter daftar kontainer
docker ps -a --filter "status=exited"
docker ps --filter "name=my-"
docker ps -q
  • --filter "status=exited" menampilkan hanya kontainer yang sudah berhenti — awal yang baik untuk pembersihan.
  • --filter "name=my-" mencari kontainer berdasarkan awalan nama — berguna saat lupa nama persisnya.
  • -q (quiet) menampilkan hanya ID kontainer, satu per baris. Ini adalah bahan baku untuk scripting: bayangkan docker rm $(docker ps -aq --filter "status=exited") — satu baris yang menghapus semua kontainer berhenti sekaligus. Pola $(...) ini akan menjadi teman akrab di episode-episode berikutnya.

Satu konsep kunci: kontainer hanya hidup selama proses utama-nya (PID 1 di dalam kontainer) berjalan. Ketika kalian menjalankan docker run -d --name my-web nginx, image nginx memiliki perintah default yang menjalankan server nginx di foreground — selama nginx hidup, kontainer berstatus Up. Jika proses itu selesai (atau crash), kontainer langsung Exited. Inilah mengapa docker run -d ubuntu bash tampak "langsung mati": bash tanpa argumen interaktif langsung keluar, dan dengan itu kontainer ikut berhenti. Proses utama adalah jantung kontainer.

Berinteraksi dari Dalam: exec dan logs

Kontainer detached tetap bisa "dimasuki" dan dibaca dari luar — tanpa mengganggu proses utamanya. Dua perintah yang paling sering dipakai:

1. docker exec — menjalankan perintah baru di dalam kontainer yang berjalan.

Masuk ke shell dalam kontainer nginx
docker run -d --name my-web nginx
docker exec -it my-web bash

Perhatikan perbedaannya dengan docker run: run menciptakan kontainer baru; exec memasuki kontainer yang sudah berjalan — persis seperti mengetuk pintu kontainer dan masuk. Periksa file di dalamnya, misalnya ls /usr/share/nginx/html, lalu exit. Image nginx berbasis Debian, jadi bash tersedia; untuk image Alpine yang lebih ramping, pakai sh.

2. docker logs — membaca output (stdout/stderr) kontainer.

Baca log kontainer
docker logs my-web
docker logs --tail 20 my-web
docker logs -f my-web
  • Tanpa opsi: seluruh log.
  • --tail N: hanya N baris terakhir — hemat output untuk log panjang.
  • -f (follow): mengikuti log secara real-time, seperti tail -f — sangat berguna saat debugging.

Warning

Aturan praktis penting: jangan pasang SSH di dalam kontainer. Container didesain untuk satu proses utama; masuk lewat docker exec adalah cara yang benar dan jauh lebih ringan. Jika kalian merasa butuh SSH, kalian sedang memakai pola yang salah — kontainer yang "seperti server" biasanya adalah tanda desain yang kurang tepat.

Port Mapping: Menghubungkan Kontainer ke Dunia Luar

Kontainer berjalan di network internal dengan IP sendiri yang tidak bisa diakses langsung dari host. Untuk menghubungkannya ke dunia luar, kalian harus memetakan port dengan opsi -p host_port:container_port:

Petakan port 8080 host ke port 80 kontainer
docker run -d --name web -p 8080:80 nginx

Sekarang akses dari host:

Verifikasi dengan curl atau buka di browser
curl -I http://localhost:8080
Output curl -I
HTTP/1.1 200 OK
Server: nginx/1.27.3
Content-Type: text/html

Analogi port mapping: kontainer adalah restoran yang menyajikan makanannya di dapur bernomor 80; kalian memasang pintu layanan bernomor 8080 di jalan raya, dan semua pesanan yang masuk lewat pintu 8080 diteruskan ke dapur 80. Buka http://localhost:8080 di browser — kalian akan melihat halaman selamat datang nginx. Tanpa -p, kontainer tetap berjalan tapi tidak bisa diakses dari host — fakta yang sering membuat pemula bingung.

Perhatikan cara kerja pemetaan: port host harus unik — tidak bisa ada dua kontainer memetakan -p 8080:80 secara bersamaan. Error port is already allocated muncul saat bentrok; solusinya ganti port host (misal -p 8081:80) atau hentikan kontainer pemakainya.

Membandingkan Cara Menjalankan Kontainer

Rangkuman dari semua cara di atas dalam satu code-group — pilih sesuai kebutuhan:

docker run -it --rm --name app-dev ubuntu bash

Tiga pola ini menutupi hampir semua kebutuhan: foreground untuk eksperimen interaktif dan debugging, detached untuk layanan yang harus terus berjalan, sekali jalan untuk job singkat seperti menjalankan utilitas tanpa meninggalkan jejak. Pilih pola berdasarkan apa yang sedang kalian lakukan, bukan kebiasaan.

Kesalahan Umum (Common Pitfalls)

  1. Lupa -it untuk sesi interaktif. docker run ubuntu bash tampak "menggantung" — sebenarnya bash jalan tanpa input yang terbuka. Selalu gunakan -it untuk shell interaktif.

  2. Lupa port mapping. docker run -d nginx berhasil, tapi curl localhost:80 gagal. Kontainer berjalan di network internal — tanpa -p, tidak ada jalan masuk dari host.

  3. Menggunakan port host yang bentrok. docker run -p 8080:80 nginx error port is already allocated. Cek dengan ss -tlnp atau ganti port host.

  4. Menghapus kontainer yang masih berjalan. docker rm menolak kontainer aktif. Hentikan dulu (docker stop), atau gunakan -f dengan sadar.

  5. Image "besar" saat demo. docker run ubuntu menarik ratusan MB karena image Ubuntu lengkap. Untuk percobaan ringan, image seperti alpine (beberapa MB) jauh lebih cepat.

KesalahanGejalaSolusi
Lupa -itShell "menggantung" tanpa prompt-it untuk sesi interaktif
Lupa -pKontainer jalan tapi tak bisa diaksesPetakan -p host:container
Port bentrokport is already allocatedGanti port host / hentikan pemakai
rm kontainer aktifError "cannot remove running"stop dulu, atau rm -f

Note

Debugging berlapis: jika layanan tidak merespons, periksa dengan urutan logika — apakah kontainer masih jalan? (docker ps) → apakah proses utama berjalan? (docker exec -it web bash lalu ps aux) → apakah port benar-benar mendengarkan? (docker logs web dan ss -tlnp di host). Urutan ini menyelesaikan 90% masalah kontainer yang "tidak bisa diakses".

Penutup

Pada episode 3 ini kalian telah menjalankan kontainer pertama dan menguasai dasar-dasar CLI Docker: docker run hello-world dengan alur pull otomatis, docker run -it ubuntu bash dengan pemahaman opsi -i, -t, --rm, dan --name, manajemen kontainer dengan docker ps / ps -a, stop, start, rm (termasuk -f), interaksi dari dalam lewat docker exec dan docker logs (-f, --tail), serta port mapping -p host_port:container_port yang menghubungkan kontainer ke dunia luar.

Inti yang harus kalian bawa:

  • docker run = pull jika perlu + ciptakan + jalankan; kontainer berhenti saat proses utamanya keluar.
  • -i (input tetap terbuka) + -t (pseudo-terminal) = sesi interaktif; --rm untuk kontainer sekali pakai; --name untuk identitas.
  • docker ps = yang aktif; docker ps -a = semua; stop (SIGTERM) ≠ kill (SIGKILL).
  • exec memasuki kontainer yang berjalan; logs membaca stdout/stderr-nya.
  • Tanpa -p, kontainer berjalan tapi tidak bisa diakses dari host.

Perintah-perintah ini adalah "tangan" kalian — dan kalian baru saja melatihnya. Di episode 4 selanjutnya kita akan memperdalam siklus hidup kontainer dan manajemen state: state machine dari Created → Running → Paused → Stopped → Exited → Dead, perintah docker create, pause/unpause, restart, kill, inspeksi metadata JSON dengan docker inspect, monitoring real-time dengan top, stats, dan events, serta pembersihan sistem dengan docker system prune. Sampai jumpa di episode 4!

Belajar Docker - Menjalankan Kontainer Pertama & Dasar-Dasar CLI | Belajar Docker