Docker Container Restart Terus? 5 Penyebab yang Paling Sering

· Troubleshooting

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, bukan restart: always (always bisa loop tanpa batas)
  • Healthcheck dengan 127.0.0.1, bukan localhost
  • Volume path dibuat sebelum docker compose up
  • depends_on dengan 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.