>운영 및 유지보수 >엔진스 >Docker에서 nginx 로그 파일을 스크롤하는 방법

Docker에서 nginx 로그 파일을 스크롤하는 방법

WBOY
WBOY앞으로
2023-05-28 20:22:041105검색

docker 사용법

 1. 실행 중인 컨테이너를 보려면 docker ps

 2. docker 이미지를 보려면 docker 이미지

 3. docker rm id(컨테이너 ID) 컨테이너 삭제(컨테이너 ID는 docker ps를 통해 볼 수 있음, 컨테이너 중지해야 함 3.1 모든 컨테이너 삭제 docker rm `docker ps -a -q`

  4. docker stop id(컨테이너 ID) 컨테이너 실행 중지

5. docker rmi id(미러 ID) 이미지 삭제

6 . docker pull ubuntu:16.04 (이미지 이름: 버전 번호) 이미지 다운로드

 7. docker run -it ubuntu:16.04 컨테이너 컨테이너 생성 및 실행

  -t는 새 컨테이너에 의사 터미널 또는 터미널을 지정하는 것을 의미합니다

- 즉, 컨테이너의 (stdin)과 상호 작용할 수 있다는 의미입니다.

  -p는 매핑된 포트를 지정합니다.

  -d는 백그라운드에서 컨테이너를 실행하고 컨테이너 ID를 인쇄합니다.

  7.1 docker run -dit ubuntu:16.04 Create 및 백그라운드에서 컨테이너 실행

  7.2 docker run -ditp 8080:8080 (호스트 포트: 컨테이너 포트) ubuntu:16.04 백그라운드에서 컨테이너 생성 및 실행 및 컨테이너 포트 매핑

 8. docker attachment id ( 컨테이너 ID) 실행 중인 컨테이너 환경에 진입

 9. Exit Container

  9.1exit는 컨테이너를 직접 종료하고 컨테이너의 실행을 종료합니다

  9.2 [ctrl+p]+[ctrl+q](단축키)는 컨테이너를 종료하지만 컨테이너 실행을 종료하지 않습니다

 10.docker commit -m' version ID ' id(컨테이너 ID) ubuntu:16.04(이미지 및 버전 번호) 이미지 제출 및 이미지 생성(이 명령을 사용하여 빌드된 컨테이너를 패키징할 수 있음) 새 이미지로 넣거나 원본 이미지를 덮어씁니다(즉, 원본 이미지 내용을 수정하여 생성합니다. 이미지 이름이 버전 번호와 동일하면 직접 덮어쓸 수 있습니다))


Docker에서 nginx 로그 파일을 스크롤하는 방법

Things

nginx 공식에서는 실제로 로그 회전 방법에 대한 지침을 제공합니다.


로그 파일 회전

로그 파일을 회전하려면 먼저 이름을 바꿔야 하며 그 후 마스터 프로세스에 usr1 신호가 전송되어야 합니다. 현재 열려 있는 모든 로그 파일을 다시 열고 작업자 프로세스가 실행 중인 권한 없는 사용자를 소유자로 할당합니다. 다시 열면 마스터 프로세스는 열려 있는 모든 파일을 닫고 작업자 프로세스에 요청하는 메시지를 보냅니다. 파일을 다시 엽니다. 작업자 프로세스는 새 파일을 열고 이전 파일을 즉시 닫습니다. 결과적으로 오래된 파일을 압축과 같은 사후 처리에 거의 즉시 사용할 수 있습니다.



이 설명의 일반적인 아이디어는 다음과 같습니다.

•먼저 이전 로그 파일의 이름을 바꿉니다
•usr1 신호를 nginx 마스터 프로세스에 보냅니다

• nginx 마스터 프로세스가 신호를 받습니다. 그런 다음 몇 가지 처리를 수행한 다음 작업자 프로세스에 로그 파일을 다시 열도록 요청합니다

• 작업자 프로세스는 새 로그 파일을 열고 이전 로그 파일을 닫습니다

사실 우리가 실제로 해야 할 유일한 작업은 처음 두 가지 사항입니다!

테스트 환경 만들기

시스템에 docker가 설치되어 있다고 가정하고 여기서는 nginx 컨테이너를 직접 실행합니다.

$ docker run -d \
 -p 80:80 \
 -v $(pwd)/logs/nginx:/var/log/nginx \
 --restart=always \
 --name=mynginx \
 nginx:1.11.3

nginx의 로그를 현재 디렉터리의 로그 디렉터리에 바인딩하고 마운트했습니다.

test.sh 파일에 다음 콘텐츠를 저장합니다.

#!/bin/bash
for ((i=1;i<=100000;i++))
do
 curl http://localhost > /dev/null
 sleep 1
done

그런 다음 이 스크립트를 실행하여 연속 로그 레코드 생성을 시뮬레이션합니다.

롤링 로그를 생성하는 스크립트

다음 내용으로rotatelog.sh 파일을 생성합니다.

#!/bin/bash
getdatestring()
{
 tz=&#39;asia/chongqing&#39; date "+%y%m%d%h%m"
}
datestring=$(getdatestring)
mv /var/log/nginx/access.log /var/log/nginx/access.${datestring}.log
mv /var/log/nginx/error.log /var/log/nginx/error.${datestring}.log
kill -usr1 `cat /var/run/nginx.pid`

getdatestring 함수는 현재 시간을 가져와서 "201807241310"과 같은 문자열 형식으로 지정합니다. 파일 이름을 지정할 시간입니다. 시간대는 여기서 tz='asia/chongqing'을 통해 지정됩니다. 기본 형식은 UTC 시간이므로 사용하기 이상합니다(실시간으로 +8시간을 알아내야 함). 다음 두 개의 mv 명령은 로그 파일의 이름을 바꾸는 데 사용됩니다. 마지막으로 kill 명령을 통해 usr1 신호를 nginx 마스터 프로세스로 보냅니다.

다음 명령을 통해 Rotatelog.sh 파일에 실행 권한을 추가하고 이를 $(pwd)/logs/nginx 디렉터리에 복사합니다.

$ chmod +x rotatelog.sh
$ sudo cp rotatelog.sh $(pwd)/logs/nginx

롤링 작업을 정기적으로 수행합니다.

우리 nginx는 컨테이너에서 실행되므로 컨테이너의 nginx 마스터 프로세스에 usr1 신호를 보냅니다. 따라서 docker exec 명령을 통해 mynginx 컨테이너에서 Rotatelog.sh 스크립트를 실행해야 합니다.

$ docker exec mynginx bash /var/log/nginx/rotatelog.sh

위를 실행합니다. 명령을 한 번만 실행하면 예약된 대로 새 로그 파일 배치가 생성됩니다.

$ docker exec mynginx bash /var/log/nginx/rotatelog.sh

执行一次上面的命令,会如期产生一批新的日志文件:

Docker에서 nginx 로그 파일을 스크롤하는 방법

下面我们把这个命令配置在定时任务中,让它每天早上 1 点钟执行一次。执行 crontab -e 命令,并在文件的末尾添加下面的行:

* 1 * * * docker exec mynginx bash /var/log/nginx/rotatelog.sh

Docker에서 nginx 로그 파일을 스크롤하는 방법 다음으로 예약된 작업에서 이 명령을 구성하고 매일 아침 1시에 한 번 실행되도록 합니다. crontab -e 명령을 실행하고 파일 끝에 다음 줄을 추가합니다:

🎜* 1 * * * docker exec mynginx bash /var/log/nginx/rotatelog.sh🎜🎜🎜🎜

저장하고 종료하세요. 아래 그림은 작성자의 테스트 중 5분마다 스크롤한 효과입니다.

Docker에서 nginx 로그 파일을 스크롤하는 방법

호스트에서 직접 로그 파일을 mv하면 어떨까요?

바인딩을 통해 마운트된 데이터 볼륨의 내용이 호스트에서 볼 때와 컨테이너에서 볼 때 동일하기 때문에 이론적으로 가능합니다. 그러나 실제로 이 작업을 수행하면 권한 문제가 발생할 가능성이 높습니다. 호스트 머신에서는 일반적으로 일반 사용자를 사용하지만 컨테이너에 생성된 로그 파일의 소유자는 특수 사용자가 되며 일반적으로 다른 사용자에게는 쓰기 및 실행 권한이 부여되지 않습니다.


Docker에서 nginx 로그 파일을 스크롤하는 방법

물론입니다. , 호스트 시스템에서 루트 사용자를 사용하는 경우 문제가 없습니다.

호스트 컴퓨터에서 신호를 보낼 수 있나요?

사실 이 질문의 전체 이름은 다음과 같아야 합니다. 호스트에서 도커 컨테이너의 nginx 마스터 프로세스로 신호를 보낼 수 있습니까?

답은 그렇습니다.

다음 명령을 통해 컨테이너의 프로세스 1번(nginx 마스터)에 usr1 신호를 보낼 수 있습니다.

$ docker container kill mynginx -s usr

(이 방법은 프로세스 1번에만 신호를 보낼 수 있습니다):

Docker에서 nginx 로그 파일을 스크롤하는 방법

위의 두 가지를 결합하여 질문으로 docker에서 nginx 로그를 스크롤하는 다른 방법을 작성할 수 있습니다. 이 방법은 docker exec 명령을 통해 컨테이너에서 명령을 실행할 필요가 없지만 호스트 시스템에서 모든 작업을 완료합니다.

•먼저 컨테이너 데이터 볼륨에 있는 로그 파일의 이름을 바꿉니다
• 컨테이너 usr1 신호

위 내용은 Docker에서 nginx 로그 파일을 스크롤하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제