Kueri /v1.40/containers/json merujuk pada endpoint HTTP REST API resmi Docker Engine versi 1.40 (dirilis pada Docker Engine 19.03) yang berfungsi untuk menampilkan daftar container yang sedang berjalan maupun terhentiโekuivalen langsung dari perintah CLI docker ps atau docker ps -a.
Endpoint ini diakses via UNIX socket (/var/run/docker.sock) atau TCP socket daemon Docker menggunakan metode GET /v1.40/containers/json. Respons yang dikembalikan berupa JSON array yang berisi metadata lengkap setiap container, mulai dari NetworkSettings, Port mapping, Mounts volume, hingga State eksekusi.
Sintaks Pemanggilan Endpoint & Contoh Respons JSON
Berikut adalah cara memanggil endpoint Docker API v1.40 langsung dari terminal Linux menggunakan cURL via UNIX socket lokal:
# Menampilkan container aktif (ekuivalen 'docker ps')
curl --unix-socket /var/run/docker.sock -X GET "http://localhost/v1.40/containers/json"
# Menampilkan semua container termasuk yang berhenti (ekuivalen 'docker ps -a')
curl --unix-socket /var/run/docker.sock -X GET "http://localhost/v1.40/containers/json?all=true"Struktur payload JSON standar yang dikembalikan oleh Docker Engine v1.40 adalah array of objects dengan format persis seperti di bawah ini:
[
{
"Id": "8dfafdbc3a40bf350291d646faadab92b66fcee45b7cfad4a81d47c33d604e1f",
"Names": [
"/web-production"
],
"Image": "nginx:alpine",
"ImageID": "sha256:51696c87e77e4ff7a53af9be837f35d4eacdb08471230f753d1796e80d4fe1ae",
"Command": "/docker-entrypoint.sh nginx -g 'daemon off;'",
"Created": 1711929600,
"Ports": [
{
"IP": "0.0.0.0",
"PrivatePort": 80,
"PublicPort": 8080,
"Type": "tcp"
}
],
"Labels": {
"maintainer": "NGINX Docker Maintainers",
"environment": "production"
},
"State": "running",
"Status": "Up 4 hours",
"HostConfig": {
"NetworkMode": "bridge"
},
"NetworkSettings": {
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "9b1c90c74780512f4585642a8b321356f7ef57a9f733f114c022880053eb81a7",
"EndpointID": "d2780e57200be649f3e4bc392945d8b671607f2a74c7e6b0a1a011a4cf135bc3",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
},
"Mounts": [
{
"Type": "bind",
"Name": "",
"Source": "/data/nginx/html",
"Destination": "/usr/share/nginx/html",
"Driver": "",
"Mode": "ro",
"RW": false,
"Propagation": "rprivate"
}
]
}
]Parameter Query HTTP GET /v1.40/containers/json
Endpoint ini menerima beberapa parameter string query URL untuk memfilter dan membatasi data container yang ditarik aplikasi klien:
| Parameter | Tipe Data | Default | Fungsi Teknis |
|---|---|---|---|
all | boolean | false | Jika false, hanya menampilkan container berstatus running. Ubah ke true untuk mengambil container berstatus exited, created, atau paused. |
limit | integer | Semua | Membatasi jumlah baris container paling baru yang dikembalikan oleh engine. |
size | boolean | false | Jika true, respons menambahkan field SizeRw (ukuran writable layer) dan SizeRootFs (total disk space). Menghitung size menambah beban I/O engine. |
filters | JSON string | - | JSON encoded string untuk menyaring container berdasarkan kondisi spesifik seperti status, nama, label, atau network. |
Daftar Field JSON dan Fungsinya
Data payload JSON dari endpoint v1.40 memuat atribut vital untuk pemantauan kesehatan container:
| Key JSON | Tipe | Deskripsi Nilai |
|---|---|---|
Id | string (SHA256) | Hash unik 64 karakter identitas container. |
Names | array of string | Daftar nama container di daemon Docker (diawali garis miring, misal /web-production). |
Image | string | Nama repository dan tag image yang dijalankan (misal nginx:alpine). |
ImageID | string | Digest hash dari image Docker asal. |
Command | string | Entrypoint atau command argumen utama saat container di-instantiate. |
Created | integer (Unix Epoch) | Timestamp saat container pertama kali dibuat (detik). |
State | string | Status mesin container: running, exited, paused, restarting, atau dead. |
Status | string | Deskripsi durasi container, misal Up 4 hours atau Exited (0) 10 minutes ago. |
Ports | array of objects | Mapping port forward host ke port internal container, protokol (TCP/UDP), dan bind IP. |
Labels | object (key-value) | Metadata kustom yang disematkan developer via Dockerfile atau opsi --label. |
NetworkSettings.Networks | object | Rincian alokasi IP address, subnet mask, gateway, dan network driver yang terpasang. |
Mounts | array of objects | Daftar volume bind mount, named volume, atau tmpfs beserta status read/write. |
Penggunaan Parameter Filter URL Encoded
Parameter filters memerlukan valid JSON string yang kemudian di-URL encode. Sintaks filter Docker v1.40 menggunakan format {"kunci": ["nilai1", "nilai2"]}.
1. Filter Container Berdasarkan Status Exited
Hanya mengambil container yang mati dengan kode error non-zero atau stopped:
# Format JSON filter: {"status": ["exited"]}
curl --unix-socket /var/run/docker.sock -G \
"http://localhost/v1.40/containers/json" \
--data-urlencode 'all=true' \
--data-urlencode 'filters={"status":["exited"]}'2. Filter Container Berdasarkan Label Environment
Mengambil container yang memiliki label produksi:
# Format JSON filter: {"label": ["environment=production"]}
curl --unix-socket /var/run/docker.sock -G \
"http://localhost/v1.40/containers/json" \
--data-urlencode 'filters={"label":["environment=production"]}'Implementasi Skrip Python Tanpa Library Tambahan (Docker SDK)
Jika ingin membaca endpoint /v1.40/containers/json di sistem backend tanpa menginstal paket berat seperti docker-py, manfaatkan socket standard library Python:
import socket
import json
def get_docker_containers():
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect('/var/run/docker.sock')
request = (
"GET /v1.40/containers/json?all=false HTTP/1.1\r\n"
"Host: localhost\r\n"
"Connection: close\r\n\r\n"
)
sock.sendall(request.encode('utf-8'))
response = b""
while True:
chunk = sock.recv(4096)
if not chunk:
break
response += chunk
sock.close()
# Memisahkan HTTP Header dan Body
header_end = response.find(b"\r\n\r\n")
body = response[header_end + 4:].decode('utf-8')
# Ekstraksi chunked transfer encoding bila ada
lines = body.split("\r\n")
json_data = "".join(lines[1:-1]) if len(lines) > 2 else body
containers = json.loads(json_data)
return containers
# Eksekusi dan cetak container yang aktif
for c in get_docker_containers():
print(f"ID: {c['Id'][:12]} | Image: {c['Image']} | Status: {c['Status']}")Panduan Troubleshooting Lapangan
- Error: 400 Bad Request (bad parameter)
Penyebab paling umum adalah format JSON di parameterfilterstidak sesuai schema array. Pastikan nilai filter berada di dalam kurung siku["nilai"], bukan string tunggal"nilai". - Error: Permission Denied saat membaca /var/run/docker.sock
User non-root tidak memiliki akses read/write ke socket Docker default. Solusinya: masukkan user ke grup docker viasudo usermod -aG docker $USERlalu perbarui sesi shell dengannewgrp docker. - Performa Lambat pada Daemon Besar
Hindari menyetelsize=truejika host menjalankan ratusan container. Penghitungan disk block layer akan menahan thread daemon Docker dan meningkatkan load CPU server.