Docker
Docker 컨테이너가 실행되지 않을 때 로그 읽는 법
컨테이너가 시작 직후 종료된다면, 스택 트레이스와 에러 메시지를 로그에서 찾는 게 가장 먼저 할 일이다.
Docker 컨테이너가 실행되지 않으면 패닉하기 쉽지만, 대부분의 경우 로그에 명확한 원인이 적혀 있다. 시간을 낭비하지 않으려면 로그를 정확하게 읽는 법부터 배워야 한다.
컨테이너 로그 보는 기본
docker logs service-name
기본적으로 전체 로그를 출력한다. 로그가 길면 처음부터 천천히 본다.
마지막 100줄만 보려면:
docker logs --tail=100 service-name
실시간으로 로그를 보려면:
docker logs -f service-name
로그에서 에러 찾기
에러 메시지를 필터링하면 훨씬 빠르다:
docker logs service-name | grep -i error
docker logs service-name | grep -i exception
docker logs service-name | grep -i fatal
또는 전체 로그에서 중요한 부분만 찾기:
docker logs service-name | grep -A 5 -B 5 "error"
일반적인 Docker 에러
"address already in use"
포트가 이미 사용 중이라는 뜻이다:
sudo ss -lntp | grep :3000
"No such file or directory"
Dockerfile의 COPY 또는 RUN 명령에서 잘못된 경로를 사용했다.
"Cannot connect to Docker daemon"
Docker 서비스가 실행되지 않았다:
sudo systemctl start docker
컨테이너 상태 확인
docker ps -a | grep service-name
상태(STATUS) 컬럼을 본다:
Up: 실행 중Exited: 종료됨 (뒤에 종료 코드가 있음)exit 0: 정상 종료exit 1: 에러로 인한 종료
환경 변수와 시작 명령 확인
docker inspect service-name
여기서 볼 것:
Cmd: 컨테이너 시작 명령Env: 환경 변수Mounts: 볼륨 마운트
빌드 로그 확인
이미지 빌드 단계에서 문제가 있으면:
docker build --no-cache -t image-name . 2>&1 | tail -50
각 RUN 단계에서 실패할 수 있다.
대화형 컨테이너로 직접 확인
같은 이미지로 대화형 컨테이너를 실행해서 내부 상태를 본다:
docker run -it --rm image-name /bin/sh
# 컨테이너 내부에서
ls -la /app # 파일 확인
env | grep DATABASE # 환경 변수 확인
node app.js # 애플리케이션 시작해보기
로그 포맷 이해하기
Node.js 애플리케이션의 전형적인 로그:
> node app.js
Server is running on port 3000
Connected to database
...
error: Connect ECONNREFUSED 127.0.0.1:5432
FatalError: Database connection failed
Process exited with code 1
여기서 중요한 건 마지막 에러인 "Database connection failed"다.
디버깅 단계
docker logs로 전체 로그 확인grep error로 에러만 필터링docker inspect로 설정 확인docker run -it로 대화형 테스트- Dockerfile 검토
이 순서를 따르면 Docker 문제의 95%를 해결할 수 있다.