LabHub
배우기 러닝패스 코스

Docker Fundamentals

Narrowing the Cause From Logs

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

이 실습은 진짜 VM 에서 돕니다

이 상자는 파드가 아니라 KubeVirt 가 띄운 가상머신입니다. 리눅스 커널이 따로 돌고 systemd 가 실제로 서비스를 관리하며, docker 는 흉내가 아니라 진짜 도커 엔진입니다. docker run 으로 띄운 컨테이너는 실제로 프로세스가 되고, docker execdocker logs 도 그대로 동작합니다.

예전에는 이 실습이 파드 안에서 돌았고, 커널 권한을 전부 내려놓은 상자라 컨테이너를 띄우는 단계가 전부 막혀 있었습니다. 이제 막힌 단계가 없습니다.

알아 둘 것이 둘 있습니다.

목표

살아 있는 컨테이너와 죽은 컨테이너를 각각 진단해, 로그·종료코드·상태 필드 세 가지로 원인을 좁히는 순서를 몸에 익힙니다.

왜 중요한가

컨테이너 진단이 어려운 이유는 정보가 없어서가 아니라 어디를 볼지 순서가 없어서입니다. 순서가 있으면 대부분 3분 안에 끝납니다. 로그를 먼저 보는 이유는 앱이 스스로 남긴 마지막 말이기 때문이고, 그다음 종료코드를 보는 이유는 로그가 비어 있을 때(=신호로 즉사했을 때) 그것만이 유일한 단서이기 때문입니다. 이 순서는 나중에 쿠버네티스에서도 그대로 씁니다. 도구 이름만 바뀔 뿐입니다.

단계

  1. /root/dk3 을 만들고, dk-noisy 컨테이너가 line-1 부터 line-50 까지 출력한 뒤 마지막에 done-50 을 출력하고 끝나게 합니다.
  2. dk-noisy 로그의 마지막 5줄만 /root/dk3/tail5.txt 로 저장합니다.
  3. dk-err 컨테이너를 만들어 표준 출력에 to-stdout, 표준 오류에 to-stderr 를 내보내게 한 뒤, 표준 출력만 /root/dk3/out.txt 로, 표준 오류만 /root/dk3/err.txt 로 분리 저장합니다.
  4. dk-noisy 로그에 타임스탬프를 붙여 첫 줄만 /root/dk3/ts.txt 로 저장합니다.
  5. nginx:1.27-alpine 으로 dk-web2 를 띄우고, 그 안에서 nginx 버전을 확인해 /root/dk3/nginx-version.txt 로 저장합니다.
  6. dk-crash 컨테이너를 만들어 starting 을 출력한 뒤 없는 경로를 읽어 실패하게 합니다. 그리고 /root/dk3/crash.txtexit=<실제 종료코드> 한 줄을 적습니다.
  7. dk-noisy 로그에서 line- 이 몇 번 나오는지 세어 /root/dk3/count.txt 에 숫자만 적습니다.
  8. /root/dk3/triage.mddk-noisy, dk-crash, dk-web2 세 컨테이너를 한 줄씩 적되, 각 줄에 컨테이너 이름과 현재 상태를 함께 넣고 dk-crash 줄에는 종료코드도 넣습니다.

참고

로그를 뿜는 컨테이너 만들기

/root/dk3 을 만들고, dk-noisy 컨테이너가 line-1 부터 line-50 까지 출력한 뒤 마지막에 done-50 을 출력하고 끝나게 합니다.

루프로 여러 줄을 출력하게 하고 마지막에 완료 표시를 남기세요. 컨테이너가 끝까지 실행돼야 마지막 줄이 나옵니다.

마지막 몇 줄만 보기

dk-noisy 로그의 마지막 5줄만 /root/dk3/tail5.txt 로 저장합니다.

로그가 길면 앞이 아니라 뒤를 봐야 합니다. 출력 줄 수를 제한하는 옵션이 있습니다.

표준 출력과 표준 오류 분리하기

dk-err 컨테이너를 만들어 표준 출력에 to-stdout, 표준 오류에 to-stderr 를 내보내게 한 뒤, 표준 출력만 /root/dk3/out.txt 로, 표준 오류만 /root/dk3/err.txt 로 분리 저장합니다.

docker logs 는 두 스트림을 각각 그대로 흘려보냅니다. 셸 리다이렉션으로 하나씩 걸러낼 수 있습니다.

언제 찍힌 로그인지 알아내기

dk-noisy 로그에 타임스탬프를 붙여 첫 줄만 /root/dk3/ts.txt 로 저장합니다.

타임스탬프를 붙이는 옵션이 있습니다. 앞에 RFC3339 시각이 붙은 첫 줄만 저장하세요.

돌고 있는 컨테이너 안 확인하기

nginx:1.27-alpine 으로 dk-web2 를 띄우고, 그 안에서 nginx 버전을 확인해 /root/dk3/nginx-version.txt 로 저장합니다.

nginx 는 버전을 표준 오류로 출력합니다. 리다이렉션을 잊으면 파일이 비어 보일 수 있습니다.

실패한 컨테이너 진단하기

dk-crash 컨테이너를 만들어 starting 을 출력한 뒤 없는 경로를 읽어 실패하게 합니다. 그리고 /root/dk3/crash.txtexit=<실제 종료코드> 한 줄을 적습니다.

로그의 마지막 줄과 종료코드를 함께 보면 원인이 특정됩니다. 종료코드는 inspect 로 확인하세요.

로그에서 패턴 세기

dk-noisy 로그에서 line- 이 몇 번 나오는지 세어 /root/dk3/count.txt 에 숫자만 적습니다.

로그를 파일로 옮기지 않고 파이프로 바로 세도 됩니다. 정확한 개수를 파일에는 숫자만 남기세요.

세 컨테이너 상태 정리

/root/dk3/triage.mddk-noisy, dk-crash, dk-web2 세 컨테이너를 한 줄씩 적되, 각 줄에 컨테이너 이름과 현재 상태를 함께 넣고 dk-crash 줄에는 종료코드도 넣습니다.

각 컨테이너의 실제 상태와 종료코드를 inspect 로 확인해 한 줄씩 적으세요. 죽은 것은 종료코드도 함께 있어야 합니다.