Docker 컨테이너 로그 지우기

David Mbochi Njonge 2023년10월12일
  1. 새 프로젝트 만들기
  2. 이미지 정의
  3. 이미지 구축
  4. 컨테이너 실행
  5. 컨테이너 로그 확인
  6. 로그 파일에서 컨테이너 로그 확인
  7. echo 명령을 사용하여 Docker 컨테이너 로그 지우기
  8. truncate 명령을 사용하여 Docker 컨테이너 로그 지우기
  9. 로그 회전을 사용하여 Docker 컨테이너 로그 지우기
  10. 결론
Docker 컨테이너 로그 지우기

로그는 특정 이벤트 또는 상태가 발생할 때 애플리케이션에서 기록하는 정보이며 애플리케이션을 모니터링하고 필요한 조치를 취하는 데 도움이 됩니다.

예를 들어, 로그는 애플리케이션을 프로덕션에 배포할 때 애플리케이션 상태가 작동 중인지 작동 중지인지를 알 수 있도록 도와줍니다. 오류가 발생하면 로그를 통해 발생한 오류의 종류를 파악할 수 있습니다.

이 정보를 사용하여 오류를 수정하는 데 필요한 사항을 변경할 수 있습니다. 많은 사람들이 사용하는 대규모 애플리케이션에서는 로그 관리가 어려울 수 있지만 도커를 사용하면 로그 조작에 도움이 되는 기능을 제공하므로 로그를 쉽게 관리할 수 있습니다.

Docker는 로그 조작에 활용할 수 있는 --details, --since, --tail, --timestamps--until과 같은 명령을 제공합니다. 기본적으로 docker는 /var/lib/docker/containers/ 폴더에 JSON 형식으로 로그를 저장하지만 생성할 로그가 포함된 파일에 대해 root 사용자로 이미지를 빌드하고 해당 컨테이너를 실행해야 합니다. .

루트 사용자 권한 없이 이 작업을 수행하면 파일 또는 디렉토리를 찾을 수 없음 오류가 발생합니다. 이 자습서에서는 */*-json.log 파일에서 로그를 지우는 데 활용할 수 있는 다양한 접근 방식을 배웁니다.

새 프로젝트 만들기

WebStorm IDEA를 열고 파일 > 새로 만들기 > 프로젝트를 선택합니다. 열린 창에서 Node.js를 선택하고 프로젝트 이름을 제목 없음에서 docker-logs-clear로 변경하거나 원하는 이름을 사용하십시오.

마지막으로 만들기 버튼을 눌러 프로젝트를 생성합니다.

docker-logs-clear 폴더 아래 index.js 파일을 만들고 다음 코드를 파일에 복사하여 붙여넣습니다.

console.log('This is an express application')
console.error('An error occurred')
throw new Error('An exception occurred')

이 파일은 애플리케이션을 실행할 때 로그 파일에 추가될 하나의 STDOUT 메시지와 두 개의 STDERR 메시지를 생성합니다. 이 코드를 웹 애플리케이션으로 변경할 수 있지만 STDOUTSTDERR 메시지만 로그 파일에 추가됩니다.

이미지 정의

docker-logs-clear 폴더 아래 Dockerfile 파일을 만들고 다음 지침을 파일에 복사하여 붙여넣습니다.

FROM node:18-alpine
WORKDIR /com/app
ADD package*.json ./
RUN npm install
ADD . .
CMD node index.js

여기에서 FROM은 후속 지침을 사용하여 사용자 정의 이미지를 생성할 기본 이미지를 설정합니다. 이 경우에는 alpine을 사용하여 Node의 경량 이미지를 기본 이미지로 사용했습니다.

docker 설명서는 다른 지침에 대해 자세히 알아볼 수 있는 자세한 Dockerfile 참조를 제공합니다.

이미지 구축

이 단계는 루트 사용자로 실행해야 합니다. 이렇게 하려면 컴퓨터의 키보드 단축키를 사용하여 새 터미널 창을 열고 아래 명령을 실행하여 현재 사용자를 루트 사용자로 변경합니다.

david@david-HP-ProBook-6470b:~/WebstormProjects/docker-logs-clear$ sudo su

출력:

root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear#

이미지를 빌드할 수 있도록 위에 표시된 대로 cd 디렉토리를 프로젝트 위치로 변경해야 합니다. 루트 사용자에 대한 액세스 권한이 있으면 다음 명령을 실행하여 docker-logs:latest 태그가 있는 이미지를 빌드합니다.

root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# docker build --tag docker-logs:latest .

이 명령은 Dockerfile을 실행하며 아래와 같이 터미널 창에서 실행되는 명령을 볼 수 있습니다.

Step 1/6 : FROM node:18-alpine
18-alpine: Pulling from library/node
213ec9aee27d: Already exists
f379b689aea3: Pull complete
fe299d5780c0: Pull complete
c34a027bbf26: Pull complete
Digest: sha256:f829c27f4f7059609e650023586726a126db25aded0c401e836cb81ab63475ff
Status: Downloaded newer image for node:18-alpine
 ---> 867dce98a500
Step 2/6 : WORKDIR /com/app
 ---> Running in 3b215b9ad992
Removing intermediate container 3b215b9ad992
 ---> aba9cfa2472b
Step 3/6 : ADD package*.json ./
 ---> 6243ccacf178
Step 4/6 : RUN npm install
 ---> Running in 9b90745b171e

added 57 packages, and audited 58 packages in 9s

7 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities
Removing intermediate container 9b90745b171e
 ---> e73c696d9743
Step 5/6 : ADD . .
 ---> e5235f761af0
Step 6/6 : CMD node index.js
 ---> Running in 7a857eea0a06
Removing intermediate container 7a857eea0a06
 ---> 29a367a3be2d
Successfully built 29a367a3be2d
Successfully tagged docker-logs:latest

컨테이너 실행

docker-logs 이미지를 사용하여 컨테이너를 실행하려면 docker-logs-prod라는 컨테이너를 실행하는 다음 명령을 실행합니다. 웹 애플리케이션이 아니므로 포트가 노출되지 않습니다.

root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# docker run -d --name docker-logs-prod docker-logs:latest

컨테이너 로그 확인

컨테이너를 실행하면 애플리케이션에서 코드가 실행됩니다. STDOUTSTDERR 메시지의 결과로 컨테이너에서 생성된 로그를 보려면 아래 명령을 실행하십시오.

root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# docker logs -f docker-logs-prod

출력:

This is an express application
An error occurred
/com/app/index.js:3
throw new Error("An exception occurred")
^

Error: An exception occurred
    at Object.<anonymous> (/com/app/index.js:3:7)
    at Module._compile (node:internal/modules/cjs/loader:1149:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1203:10)
    at Module.load (node:internal/modules/cjs/loader:1027:32)
    at Module._load (node:internal/modules/cjs/loader:868:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
    at node:internal/main/run_main_module:23:47

Node.js v18.10.0

로그 파일에서 컨테이너 로그 확인

이전 로그가 로그 파일에 추가되었는지 확인하려면 다음 명령을 사용하여 컨테이너가 생성된 로그를 저장하는 로그 파일의 위치를 확인합니다.

root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# docker inspect --format='{{.LogPath}}' docker-logs-prod

출력:

/var/lib/docker/containers/1eb27be7b062346872869eaedfb250c526dc77437123dd18adf3dbb5e8b6b7da/1eb27be7b062346872869eaedfb250c526dc77437123dd18adf3dbb5e8b6b7da-json.log

이제 로그 파일이 생성된 위치가 있으므로 다음 명령을 실행하여 로그 파일의 JSON 콘텐츠를 인쇄합니다.

root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# cat /var/lib/docker/containers/1eb27be7b062346872869eaedfb250c526dc77437123dd18adf3dbb5e8b6b7da/1eb27be7b062346872869eaedfb250c526dc77437123dd18adf3dbb5e8b6b7da-json.log

출력:

{"log":"This is an express application\n","stream":"stdout","time":"2022-10-07T10:47:16.594937015Z"}
{"log":"An error occurred\n","stream":"stderr","time":"2022-10-07T10:47:16.596273395Z"}
{"log":"/com/app/index.js:3\n","stream":"stderr","time":"2022-10-07T10:47:16.617728515Z"}
{"log":"throw new Error(\"An exception occurred\")\n","stream":"stderr","time":"2022-10-07T10:47:16.61780931Z"}
{"log":"^\n","stream":"stderr","time":"2022-10-07T10:47:16.617822419Z"}
{"log":"\n","stream":"stderr","time":"2022-10-07T10:47:16.617832094Z"}
{"log":"Error: An exception occurred\n","stream":"stderr","time":"2022-10-07T10:47:16.617846368Z"}
{"log":"    at Object.\u003canonymous\u003e (/com/app/index.js:3:7)\n","stream":"stderr","time":"2022-10-07T10:47:16.617855581Z"}
{"log":"    at Module._compile (node:internal/modules/cjs/loader:1149:14)\n","stream":"stderr","time":"2022-10-07T10:47:16.617864838Z"}
{"log":"    at Module._extensions..js (node:internal/modules/cjs/loader:1203:10)\n","stream":"stderr","time":"2022-10-07T10:47:16.617882182Z"}
{"log":"    at Module.load (node:internal/modules/cjs/loader:1027:32)\n","stream":"stderr","time":"2022-10-07T10:47:16.617890043Z"}
{"log":"    at Module._load (node:internal/modules/cjs/loader:868:12)\n","stream":"stderr","time":"2022-10-07T10:47:16.617898124Z"}
{"log":"    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)\n","stream":"stderr","time":"2022-10-07T10:47:16.617906808Z"}
{"log":"    at node:internal/main/run_main_module:23:47\n","stream":"stderr","time":"2022-10-07T10:47:16.617914665Z"}
{"log":"\n","stream":"stderr","time":"2022-10-07T10:47:16.61792284Z"}
{"log":"Node.js v18.10.0\n","stream":"stderr","time":"2022-10-07T10:47:16.617930182Z"}

파일에서 반환된 JSON 콘텐츠에서 이벤트가 발생한 streamtime을 포함하여 컨테이너에서 생성된 모든 로그를 볼 수 있습니다. 다음 섹션에서는 이 파일에서 로그를 지우는 방법을 알아봅니다.

echo 명령을 사용하여 Docker 컨테이너 로그 지우기

로그 파일에서 JSON 콘텐츠를 지우려면 echo 명령을 사용하여 빈 문자열로 파일을 덮어쓰는 다음 명령을 실행합니다.

root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# echo "" > $(docker inspect --format='{{.LogPath}}' docker-logs-prod)

로그 파일이 지워졌는지 확인하려면 docker logs -f docker-logs-prod 명령을 실행하고 파일에서 어떤 로그도 반환하지 않는다는 점에 유의하십시오.

truncate 명령을 사용하여 Docker 컨테이너 로그 지우기

이전 컨테이너를 다시 실행하여 로그를 다시 생성하고 다음 명령을 실행하여 로그 파일에 추가된 로그를 지웁니다. 이것은 truncate 명령을 사용하여 파일 크기를 0으로 줄입니다.

root@david-HP-ProBook-6470b:/home/david/WebstormProjects/docker-logs-clear# truncate -s 0 $(docker inspect --format='{{.LogPath}}' docker-logs-prod)

로그 파일이 지워졌는지 확인하려면 docker logs -f docker-logs-prod 명령을 실행하고 파일에서 어떤 로그도 반환하지 않는다는 점에 유의하십시오.

로그 회전을 사용하여 Docker 컨테이너 로그 지우기

앞의 두 예제에서는 echotruncate 명령을 사용하여 로그 파일의 내용을 수동으로 지웠습니다. 이러한 접근 방식은 Docker 로깅 시스템에 영향을 미치고 예기치 않은 동작을 유발할 수 있으므로 권장되지 않습니다.

컨테이너에서 로그를 지우는 권장 방법은 로그 회전을 사용하는 것입니다. 기본 로깅 드라이버 json-file로 로그 회전을 사용하려면 /etc/docker 아래에 있는 daemon.json파일에서 로그 파일의max-sizemax-file을 설정할 수 있습니다. / 폴더에 아래와 같이 표시됩니다.

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

이것은 root 사용자 권한으로 수행되어야 합니다. 변경 사항을 적용하려면 systemctl reload docker 명령을 사용하여 도커를 다시 로드해야 합니다.

개별 컨테이너에 대한 로그 회전을 지정하려면 --log-driver json-file, --log-opt max-size=10m--log-opt max-file을 지정할 수 있습니다. =3 컨테이너를 실행할 때 옵션.

결론

이 자습서에서는 로그 파일에 추가된 JSON 콘텐츠를 지워 도커 컨테이너에서 로그를 지우는 데 사용할 수 있는 다양한 접근 방식을 배웠습니다. 이 튜토리얼에서 다룬 접근법에는 echo 명령, truncate 명령 및 log-rotation 사용이 포함됩니다.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub