컨테이너가 계속 재시작되거나 Exited 상태로 멈춘다면 로그와 exit code로 원인을 바로 알 수 있습니다.
Step 1 — 상태와 exit code 확인
# 모든 컨테이너 상태 (중지된 것 포함)
docker ps -a
# 출력 예
# CONTAINER ID IMAGE STATUS NAMES
# abc123 myapp Restarting (1) 5s ago myapp
# def456 nginx Exited (137) 2 minutes ago nginx
# ↑ exit code| Exit code | 의미 | 주요 원인 |
|---|---|---|
0 | 정상 종료 | 컨테이너 작업이 끝남 (의도된 종료) |
1 | 앱 오류 | 애플리케이션 런타임 에러 |
137 | SIGKILL | OOM Killer 또는 docker kill |
139 | Segfault | 앱 메모리 충돌 |
143 | SIGTERM | docker stop 이후 정상 종료 |
Step 2 — 컨테이너 로그 확인
# 마지막 100줄 로그
docker logs --tail 100 컨테이너명
# 실시간 로그 (재시작 반복 중 확인)
docker logs -f 컨테이너명
# 타임스탬프 포함
docker logs -t --tail 50 컨테이너명
# 중지된 컨테이너 로그도 볼 수 있음
docker logs 컨테이너IDExit code 1 — 앱 크래시
로그에서 에러 메시지를 확인합니다.
docker logs 컨테이너명 2>&1 | tail -30주요 원인:
- 환경변수 누락:
Error: DATABASE_URL is not defined - 포트 충돌:
Error: listen EADDRINUSE :::3000 - 파일/설정 없음:
No such file or directory
# 환경변수 확인
docker inspect 컨테이너명 | grep -A 20 '"Env"'
# 컨테이너 안에서 직접 확인 (일회성 실행)
docker run --rm -it --env-file .env 이미지명 /bin/shExit code 137 — OOM 강제 종료
# OOM으로 죽었는지 확인
docker inspect 컨테이너명 | grep -i oom
# "OOMKilled": true 이면 OOM
# 메모리 사용량 확인
docker stats --no-stream 컨테이너명# 메모리 제한 늘리기 (docker run)
docker run -m 512m 이미지명
# docker-compose.yml
# services:
# myapp:
# mem_limit: 512mrestart policy 확인·변경
# 현재 restart policy 확인
docker inspect 컨테이너명 | grep -A 3 'RestartPolicy'| Policy | 동작 |
|---|---|
no | 재시작 안 함 (기본값) |
always | 항상 재시작 (exit code 무관) |
on-failure | 비정상 종료(non-0)만 재시작 |
unless-stopped | 수동 중지 전까지 항상 재시작 |
# 재시작 반복이 문제라면 policy를 on-failure로 변경
docker update --restart=on-failure:5 컨테이너명
# 5회 시도 후 중지
# 완전히 중지
docker update --restart=no 컨테이너명
docker stop 컨테이너명디버깅 — 컨테이너를 수동으로 시작
# entrypoint 무시하고 쉘로 진입 (원인 직접 파악)
docker run --rm -it --entrypoint /bin/sh 이미지명
# 기존 컨테이너 설정 그대로 쉘 진입
docker run --rm -it $(docker inspect 컨테이너명 --format '{{range .Config.Env}}-e {{.}} {{end}}') --entrypoint /bin/sh 이미지명자주 묻는 질문 (FAQ)
Q. docker ps에서 계속 Restarting 상태입니다. 어디부터 보나요?
A. docker logs <컨테이너>로 종료 직전 로그를 먼저 봅니다. 그다음 docker inspect <컨테이너> --format '{{.State.ExitCode}}'로 종료 코드를 확인하세요. 137=OOM(메모리 초과), 1·2=앱 예외, 126·127=실행 파일·권한 문제입니다. restart 정책이 always면 앱이 죽을 때마다 무한 재시작하므로, 원인을 잡기 전엔 --restart=no로 바꿔 로그를 확보하는 게 편합니다.
이 가이드는 AI 도구를 활용해 초안을 구성하고 사람이 명령어·문맥을 검토해 발행했습니다. 운영체제와 도구 버전에 따라 결과가 달라질 수 있으므로 적용 전 공식 문서를 함께 확인하세요. 오류를 발견하시면 이메일로 제보해 주세요.
질문 & 답변 (Q&A)
이 가이드에 대해 궁금한 점을 질문해보세요. 확인 후 답변드립니다.