Mesin kita sekarang dihuni dua container dengan dua nasib: web yang hidup melayani HTTP di latar belakang dan quirky_einstein yang sudah menuntaskan tugasnya lalu berhenti. Mengetik perintah lalu memercayai bahwa semuanya berjalan baik bukanlah kebiasaan engineer yang sehat — kita butuh cara untuk melihat ke dalam. Perintah docker ps adalah jendela tersebut: satu tabel yang menjawab pertanyaan paling mendasar sehari-hari, yaitu container apa saja yang sedang hidup, dari image mana ia lahir, sudah berapa lama berjalan, dan port apa yang terbit. Sebelum membuka jendela itu, kita tambahkan dulu satu penghuni baru supaya pemandangannya lebih hidup dan contoh kita lebih kaya.

Menambahkan Container cache #

Sesuai kebiasaan mem-pin versi dari chapter sebelumnya, image yang kita pakai adalah redis:7 — Redis pada seri mayor 7, image resmi untuk cache server yang nanti akan sering menemani aplikasi web:

bash
$ docker run -d --name cache redis:7

Output yang Dihasilkan:

text
Unable to find image 'redis:7' locally
7: Pulling from library/redis
...
Status: Downloaded newer image for redis:7
3a1c8f2e9b7dfd72f5fd49bfb1f21573b792be51fbb6c62f2b6485cf269f1c45

Baris-baris layer dan nilai digest dipotong agar ringkas. Pola perintahnya persis sama dengan web pada chapter sebelumnya: Docker menarik image redis:7 karena belum ada di lokal, membuat container bernama cache dengan mode detached lewat -d, lalu mencetak ID lengkap 64 karakter — bentuk pendeknya adalah 3a1c8f2e9b7d. Sekarang penghuni mesin kita ada tiga: dua container hidup dan satu yang berhenti.

Tujuh Kolom docker ps #

Saatnya membuka jendela utama. Perintah docker ps — atau bentuk lamanya, sama sahnya — mencetak tabel seluruh container yang sedang berjalan:

bash
$ docker ps

Output yang Dihasilkan:

text
CONTAINER ID   IMAGE     COMMAND                  CREATED              STATUS              PORTS                                     NAMES
f7c2a91b3e55   nginx     "/docker-entrypoint.…"   2 minutes ago        Up 2 minutes        0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   web
3a1c8f2e9b7d   redis:7   "docker-entrypoint.s…"   About a minute ago   Up About a minute   6379/tcp                                  cache

Mari kita telaah ketujuh kolomnya satu per satu:

  1. CONTAINER ID — bentuk pendek ID container, yaitu dua belas karakter pertama dari ID 64 karakter yang dicetak saat docker run; bentuk pendek ini hampir selalu cukup unik untuk merujuk container tanpa mengetik ID penuh.
  2. IMAGE — referensi image yang dipakai saat container dibuat, ditulis persis seperti yang kita ketik: baris pertama menulis nginx karena perintah kita mengetik nginx tanpa tag, sedangkan baris kedua menulis redis:7 karena tag kita sebutkan eksplisit.
  3. COMMAND — perintah yang dijalankan sebagai proses utama container, terpotong sekitar dua puluh karakter dan diakhiri tanda elipsis; nginx menjalankan skrip /docker-entrypoint.… dan Redis menjalankan docker-entrypoint.s… — keduanya skrip entrypoint bawaan image resminya.
  4. CREATED — kapan container dibuat, dalam format waktu relatif; web lahir dua menit lalu, cache baru sesaat.
  5. STATUS — kondisi container saat ini: Up diikuti durasi berjalan berarti hidup; bentuk lain yang akan segera kita temui adalah Exited (kode) untuk container yang sudah berhenti.
  6. PORTS — pemetaan port milik container. Baris web menampilkan 0.0.0.0:8080->80/tcp (permintaan dari seluruh antarmuka host di port 8080 diteruskan ke port 80 container) plus pasangan [::]:8080->80/tcp untuk IPv6. Baris cache hanya menampilkan 6379/tcp tanpa tanda panah — Redis memang mendengarkan port 6379 di dalam container, tetapi port tersebut tidak kita terbitkan ke host dengan -p, sehingga hanya container lain di jaringan yang sama yang bisa menghubunginya.
  7. NAMES — nama container: web dan cache, keduanya berasal dari flag --name yang kita berikan sendiri.

Satu kejanggalan mungkin sudah terasa: quirky_einstein tidak tampak di tabel. Bukan karena container tersebut hilang — docker ps memang hanya mencetak container yang sedang berjalan, dan container hello-world kita sudah lama selesai dengan status berhenti.

Menampilkan Container yang Berhenti dengan -a #

Untuk melihat seluruh container termasuk yang sudah berhenti, kita tambahkan flag -a (singkatan dari all):

bash
$ docker ps -a

Output yang Dihasilkan:

text
CONTAINER ID   IMAGE         COMMAND                  CREATED              STATUS                     PORTS                                     NAMES
f7c2a91b3e55   nginx         "/docker-entrypoint.…"   3 minutes ago        Up 3 minutes               0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   web
3a1c8f2e9b7d   redis:7       "docker-entrypoint.s…"   About a minute ago   Up About a minute          6379/tcp                                  cache
d4e5f6a7b8c9   hello-world   "/hello"                 4 minutes ago        Exited (0) 4 minutes ago                                             quirky_einstein

Mari kita telaah baris baru yang muncul:

  1. quirky_einstein dari image hello-world — container perkenalan kita di awal section ini; kolom COMMAND menampilkan /hello, nama program mungil yang dicetaknya tadi.
  2. Exited (0) 4 minutes ago — status berhenti lengkap dengan kode keluar di dalam kurung: kode 0 berarti program selesai dengan sukses, dan angka setelahnya mencatat kapan container berhenti. Daftar lengkap arti tiap kode keluar — dari 0 sampai 137 — menjadi pembahasan khusus pada Chapter Memahami Exit Code.
  3. Kolom PORTS yang kosong — hello-world tidak mendengarkan port apa pun, sehingga kolomnya memang kosong; ini pengingat yang berguna bahwa tidak semua container berhubungan dengan jaringan.

Perbedaan docker ps dan docker ps -a inilah yang menjelaskan mengapa container “hilang begitu saja” pada banyak pemula: container sekali-jalan seperti hello-world tidak gagal — ia hanya selesai dan bersembunyi dari daftar default. Sejauh ini seluruh perintah pada chapter ini bersifat membaca, belum ada satu pun yang mengubah keadaan container. Menyaring dan memformat membantu kita membaca lebih cepat, dan dua kemampuan itu menjadi bekal untuk bagian-bagian berikutnya.

Menyaring dengan –filter #

Ketika daftar container memanjang — di server produksi bisa puluhan baris — kita butuh penyaring, bukan mata yang lebih jeli. Flag --filter menerima pasangan kunci=nilai; misalnya, untuk menampilkan hanya container yang berhenti:

bash
$ docker ps --filter status=exited

Output yang Dihasilkan:

text
CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS   NAMES
d4e5f6a7b8c9   hello-world   "/hello"   4 minutes ago   Exited (0) 4 minutes ago           quirky_einstein

Penyaring berdasarkan nama memakai kunci name, dan nilainya dicocokkan sebagai potongan nama:

bash
$ docker ps --filter name=web

Output yang Dihasilkan:

text
CONTAINER ID   IMAGE   COMMAND                  CREATED         STATUS         PORTS                                     NAMES
f7c2a91b3e55   nginx   "/docker-entrypoint.…"   3 minutes ago   Up 3 minutes   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   web

Mari kita telaah cara kerja kedua penyaring di atas:

  1. --filter status=exited — hanya baris dengan status berhenti yang lolos; nilai status lain yang umum adalah running, paused, dan restarting, serta kombinasi keluar seperti exited=0 bila kita ingin spesifik ke satu kode keluar.
  2. --filter name=web — pencocokannya berbasis potongan nama, bukan nama persis: web akan cocok untuk container bernama web, webhook, atau web-frontend; pada daftar kita, hanya web yang cocok karena dua container lainnya tidak memuat potongan kata itu.
  3. Filter bisa dirangkai — dua flag --filter dalam satu perintah digabung dengan logika dan: hanya container yang lolos semua syarat yang ditampilkan. Kunci lain yang sering berguna adalah id untuk ID container dan label untuk penanda khusus yang kita tempelkan sendiri saat membuat container.

Memformat Output dengan –format #

Tabel tujuh kolom enak dibaca manusia tetapi buruk dibaca skrip — lebar kolomnya berubah-ubah, kolom CREATED bergerak tiap menit, dan parser bisa pusing oleh koma di kolom PORTS. Solusinya adalah flag --format dengan template Go yang sudah kita kenal pada docker version --format:

bash
$ docker ps --format "{{.Names}}: {{.Status}}"

Output yang Dihasilkan:

text
web: Up 3 minutes
cache: Up About a minute

Varian dengan kata table di depan menambahkan baris judul otomatis dan perataan kolom dari tab yang kita definisikan:

bash
$ docker ps --format "table {{.Names}}\t{{.Status}}"

Output yang Dihasilkan:

text
NAMES   STATUS
web     Up 3 minutes
cache   Up About a minute

Mari kita telaah kedua bentuk tersebut:

  1. {{.Names}} dan {{.Status}} — nama field mengikuti judul kolom tabel aslinya; field lain yang populer adalah {{.ID}}, {{.Image}}, dan {{.Ports}}, lengkap dengan huruf besar di awal seperti tampilannya di tabel.
  2. Teks di luar {{ }} dicetak apa adanya — titik dua dan spasi pada contoh pertama adalah tulisan kita sendiri; hasil berupa baris nama: status per container siap langsung dipakai skrip atau dikirim ke notifikasi.
  3. Kata table dan \t — prefiks table mengaktifkan mode tabel dengan judul kolom, sedangkan \t adalah karakter tab yang menjadi pemisah antar kolom yang kita pilih.

docker container ls sebagai Padanan #

Sesuai tabel alias pada Chapter Struktur Perintah Docker, docker ps adalah bentuk lama dari docker container ls. Kedua perintah menerima flag yang sama persis — -a, --filter, --format, -q — sehingga kita bisa menggabungkannya bebas:

bash
$ docker container ls --filter status=exited --format "{{.Names}}"

Output yang Dihasilkan:

text
quirky_einstein

Perintah di atas memakai bentuk modern, menyaring container berhenti, lalu memformatnya menjadi daftar nama saja — tiga kebiasaan dari chapter ini dalam satu baris. Tidak ada perbedaan hasil sedikit pun dengan docker ps --filter status=exited --format "{{.Names}}"; pilihan bentuk sepenuhnya urusan selera dan konsistensi tim, meski dokumentasi resmi cenderung memakai bentuk modern.

Kini pemandangan mesin kita terbaca tuntas: web dan cache hidup, quirky_einstein selesai dengan sukses, dan kita tahu cara menyaring serta memformat daftarnya untuk kebutuhan apa pun. Tetapi melihat bukanlah mengendalikan — bagaimana caranya memadamkan web untuk penghematan resource tanpa membuang container-nya, lalu menyalakannya kembali besok pagi dalam kondisi yang sama? Pertanyaan itu membawa kita ke chapter berikutnya, Menghentikan dan Menjalankan Container, yang membedahkan docker stop, docker start, dan sinyal-sinyal yang bekerja di baliknya.

Referensi #