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:
$ docker run -d --name cache redis:7Output yang Dihasilkan:
Unable to find image 'redis:7' locally
7: Pulling from library/redis
...
Status: Downloaded newer image for redis:7
3a1c8f2e9b7dfd72f5fd49bfb1f21573b792be51fbb6c62f2b6485cf269f1c45Baris-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:
$ docker psOutput yang Dihasilkan:
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 cacheMari kita telaah ketujuh kolomnya satu per satu:
CONTAINER ID— bentuk pendek ID container, yaitu dua belas karakter pertama dari ID 64 karakter yang dicetak saatdocker run; bentuk pendek ini hampir selalu cukup unik untuk merujuk container tanpa mengetik ID penuh.IMAGE— referensi image yang dipakai saat container dibuat, ditulis persis seperti yang kita ketik: baris pertama menulisnginxkarena perintah kita mengetiknginxtanpa tag, sedangkan baris kedua menulisredis:7karena tag kita sebutkan eksplisit.COMMAND— perintah yang dijalankan sebagai proses utama container, terpotong sekitar dua puluh karakter dan diakhiri tanda elipsis; nginx menjalankan skrip/docker-entrypoint.…dan Redis menjalankandocker-entrypoint.s…— keduanya skrip entrypoint bawaan image resminya.CREATED— kapan container dibuat, dalam format waktu relatif;weblahir dua menit lalu,cachebaru sesaat.STATUS— kondisi container saat ini:Updiikuti durasi berjalan berarti hidup; bentuk lain yang akan segera kita temui adalahExited (kode)untuk container yang sudah berhenti.PORTS— pemetaan port milik container. Bariswebmenampilkan0.0.0.0:8080->80/tcp(permintaan dari seluruh antarmuka host di port 8080 diteruskan ke port 80 container) plus pasangan[::]:8080->80/tcpuntuk IPv6. Bariscachehanya menampilkan6379/tcptanpa 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.NAMES— nama container:webdancache, keduanya berasal dari flag--nameyang 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):
$ docker ps -aOutput yang Dihasilkan:
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_einsteinMari kita telaah baris baru yang muncul:
quirky_einsteindari imagehello-world— container perkenalan kita di awal section ini; kolomCOMMANDmenampilkan/hello, nama program mungil yang dicetaknya tadi.Exited (0) 4 minutes ago— status berhenti lengkap dengan kode keluar di dalam kurung: kode0berarti program selesai dengan sukses, dan angka setelahnya mencatat kapan container berhenti. Daftar lengkap arti tiap kode keluar — dari0sampai137— menjadi pembahasan khusus pada Chapter Memahami Exit Code.- Kolom
PORTSyang 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:
$ docker ps --filter status=exitedOutput yang Dihasilkan:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d4e5f6a7b8c9 hello-world "/hello" 4 minutes ago Exited (0) 4 minutes ago quirky_einsteinPenyaring berdasarkan nama memakai kunci name, dan nilainya dicocokkan sebagai potongan nama:
$ docker ps --filter name=webOutput yang Dihasilkan:
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 webMari kita telaah cara kerja kedua penyaring di atas:
--filter status=exited— hanya baris dengan status berhenti yang lolos; nilai status lain yang umum adalahrunning,paused, danrestarting, serta kombinasi keluar sepertiexited=0bila kita ingin spesifik ke satu kode keluar.--filter name=web— pencocokannya berbasis potongan nama, bukan nama persis:webakan cocok untuk container bernamaweb,webhook, atauweb-frontend; pada daftar kita, hanyawebyang cocok karena dua container lainnya tidak memuat potongan kata itu.- Filter bisa dirangkai — dua flag
--filterdalam satu perintah digabung dengan logika dan: hanya container yang lolos semua syarat yang ditampilkan. Kunci lain yang sering berguna adalahiduntuk ID container danlabeluntuk 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:
$ docker ps --format "{{.Names}}: {{.Status}}"Output yang Dihasilkan:
web: Up 3 minutes
cache: Up About a minuteVarian dengan kata table di depan menambahkan baris judul otomatis dan perataan kolom dari tab yang kita definisikan:
$ docker ps --format "table {{.Names}}\t{{.Status}}"Output yang Dihasilkan:
NAMES STATUS
web Up 3 minutes
cache Up About a minuteMari kita telaah kedua bentuk tersebut:
{{.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.- Teks di luar
{{ }}dicetak apa adanya — titik dua dan spasi pada contoh pertama adalah tulisan kita sendiri; hasil berupa barisnama: statusper container siap langsung dipakai skrip atau dikirim ke notifikasi. - Kata
tabledan\t— prefikstablemengaktifkan mode tabel dengan judul kolom, sedangkan\tadalah 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:
$ docker container ls --filter status=exited --format "{{.Names}}"Output yang Dihasilkan:
quirky_einsteinPerintah 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 #
- docker container ls
— referensi resmi
docker ps: flag-a,--filter,--format, dan--quiet. - redis di Docker Hub — halaman image resmi Redis beserta tag seri 7 dan 8.
- Use the Docker CLI — pola perintah CLI dan padanan bentuk lama-modern.