Docker Container Restart Terus? 5 Penyebab yang Paling Sering
Gejalanya
Container hidup beberapa detik, lalu mati, lalu hidup lagi. Di docker ps akan terlihat Restarting (1) 5 seconds ago. Log akan penuh baris yang sama berulang.
Langkah 0: Baca Log-nya Dulu
docker logs --tail 50 <nama-container>
docker logs -f <nama-container> # ikuti realtime
Kalau log kosong, coba:
docker inspect <nama-container> --format '{{json .State}}'
Penyebab 1: Port Sudah Dipakai
Paling sering. Gejalanya: bind: address already in use.
ss -tlnp | grep <port>
Solusi: ganti port di compose, atau stop proses yang bentrok.
ports:
- "8081:80" # bukan 8080
Penyebab 2: Image Tidak Ada
Gejalanya di log: pull access denied atau manifest unknown.
docker compose pull
Kalau image private, pastikan sudah login:
docker login
Penyebab 3: Volume Salah Path
Mount volume ke path yang tidak ada, atau container tidak punya permission tulis.
docker inspect <nama-container> --format '{{json .Mounts}}'
Solusi: pastikan folder dibuat dan ownership benar.
mkdir -p ./data && sudo chown -R 1000:1000 ./data
Penyebab 4: Healthcheck Terlalu Ketat
Container sebenarnya sehat, tapi healthcheck gagal sehingga Docker menganggapnya harus restart.
Gejalanya: container jalan normal saat dicek manual, tapi tetap restart.
docker exec <nama-container> wget -q --spider http://127.0.0.1/
Perhatikan: pakai 127.0.0.1, bukan localhost. Di beberapa image Alpine, localhost me-resolve ke IPv6 yang tidak di-listen.
Penyebab 5: Dependency Belum Siap
Kalau container A butuh container B, dan B belum siap, A crash karena koneksi refused.
Solusinya depends_on ditambah condition: service_healthy:
services:
app:
depends_on:
db:
condition: service_healthy
db:
healthcheck:
test: ["CMD", "pg_isready", "-U", "user"]
interval: 10s
retries: 5
Diagnosis Cepat
# restart count
docker inspect <nama-container> --format '{{.RestartCount}}'
# exit code dan alasan
docker inspect <nama-container> --format '{{.State.ExitCode}} {{.State.Error}}'
# log terakhir sebelum mati
docker logs --tail 20 <nama-container>
Prevention Checklist
- Selalu pakai
restart: unless-stopped, bukanrestart: always(always bisa loop tanpa batas) - Healthcheck dengan
127.0.0.1, bukanlocalhost - Volume path dibuat sebelum
docker compose up -
depends_ondengan kondisi health, bukan hanya urutan start - Cek log setiap hari:
docker ps --filter "status=restarting"
Kesimpulan
Restart loop hampir selalu berasal dari 5 hal ini. Mulai dari log, bukan menebak. Setelah ketemu penyebabnya, perbaikinya biasanya satu baris di compose file.