핵심 정리
docker logs --follow app
docker exec -it app sh
docker inspect app기본 흐름
어떤 디버깅 명령을 먼저 떠올리면 되나
| 상황 | 먼저 떠올릴 선택 |
|---|---|
| 앱 출력 로그 확인 | docker logs |
| 실행 중 컨테이너 내부 점검 | docker exec -it |
| 포트·마운트·환경변수 같은 메타데이터 확인 | docker inspect |
| 컨테이너가 바로 죽는다 | --entrypoint sh로 수동 확인 |
docker inspect로 컨테이너 메타데이터를 JSON으로 조회하는 방법
docker inspect는 컨테이너나 이미지의 저수준 메타데이터를 JSON으로 출력한다. 포트 매핑, 마운트 경로, 네트워크 설정, 환경변수, 재시작 횟수 등을 한 번에 볼 수 있다. --format 플래그로 필요한 값만 추출하면 스크립트에서 활용하기 편하다.
# 전체 메타데이터
docker inspect app
# 포트 매핑만 추출
docker inspect --format='{{json .NetworkSettings.Ports}}' app
# 마운트 경로 확인
docker inspect --format='{{range .Mounts}}{{.Source}} -> {{.Destination}}{{"\n"}}{{end}}' app
# 환경변수 목록
docker inspect --format='{{range .Config.Env}}{{println .}}{{end}}' appdocker exec으로 실행 중인 컨테이너에 접속하는 패턴
docker exec는 실행 중인 컨테이너 안에서 추가 프로세스를 시작한다. -it 옵션은 인터랙티브 터미널을 붙여준다. sh 대신 bash를 사용하려면 이미지에 bash가 설치돼 있어야 한다. alpine 기반 이미지는 보통 sh만 있다.
# 셸 진입
docker exec -it app sh
# 셸 없이 단일 명령 실행
docker exec app env
docker exec app cat /etc/hosts
# 특정 사용자로 실행
docker exec -it -u root app shdocker logs --follow로 실시간 로그를 확인하는 방법
docker logs는 컨테이너가 stdout과 stderr로 출력한 내용을 보여준다. --follow(-f)를 붙이면 실시간 스트리밍이 된다. --tail로 최근 N줄만 볼 수 있고, --since로 시간 기준 필터링도 가능하다.
# 전체 로그
docker logs app
# 실시간 팔로우
docker logs --follow app
# 최근 100줄만
docker logs --tail 100 app
# 지난 10분 이내 로그
docker logs --since 10m applogs와 exec와 inspect는 보는 대상이 다르다
docker logs는 프로세스가 출력한 로그를 보고, docker exec는 실행 중인 컨테이너 안에서 직접 명령을 돌려 보고, docker inspect는 컨테이너 메타데이터를 읽습니다. "앱이 왜 죽는지"는 로그가 먼저고, "실행 중 환경이 맞는지"는 exec, "포트나 마운트가 어떻게 잡혔는지"는 inspect가 먼저입니다.
# 출력 로그부터 확인
docker logs --tail 50 app
# 실행 중이면 내부 환경 점검
docker exec app env
# 포트/마운트 설정 점검
docker inspect --format='{{json .Mounts}}' app컨테이너가 crash loop일 때 디버깅하는 패턴
컨테이너가 시작하자마자 종료되는 crash loop 상황에서는 exec으로 접속할 수 없다. 이때는 --entrypoint를 덮어써서 앱 대신 셸이 실행되게 하고 내부를 수동으로 확인한다.
# 컨테이너가 즉시 종료되는 경우 — 로그 먼저 확인
docker logs app
# 종료된 컨테이너 로그도 볼 수 있음
docker logs --tail 50 $(docker ps -lq)
# entrypoint를 sh로 바꿔 수동 디버깅
docker run -it --entrypoint sh my-app
# 환경변수나 파일 구성 확인 후 직접 앱 실행 시도
# 컨테이너 내부에서: node server.js체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 앱 출력 로그를 확인할 때 | docker logs --follow |
| 실행 중 컨테이너 내부 확인 | docker exec -it ... sh |
| 포트 매핑, 마운트, 네트워크 설정 확인 | docker inspect + --format |
| 컨테이너가 즉시 죽는 crash loop | --entrypoint sh로 실행 후 수동 확인 |
주의할 점
디버깅 중 컨테이너 안을 직접 수정한 내용은 재시작하면 사라진다. 원인 파악에만 사용하고, 실제 수정은 Dockerfile이나 Compose 설정에 반영해야 다음 배포에도 유지된다.
docker exec -it crashed-app sh
# Error response from daemon: Container ... is not running실행 중이 아닌 컨테이너에는 exec로 들어갈 수 없습니다. 이 경우는 docker logs와 docker inspect를 먼저 보고, 필요하면 docker run --entrypoint sh ...로 새 디버그 컨테이너를 띄우는 쪽이 맞습니다.
참고 링크
2 sources