docker로 nginx를 실행하고 logrotate 설정하는 방법을 확인해 보겠습니다. nginx alpine 이미지에는 logrotate가 없지만, 호스트에 logrotate가 있다면 docker volume을 통해서 log 파일을 logrotate를 실행할 수 있습니다. 이렇게 구성하게 되면 호스트가 변경되면 logrotate를 다시 설정해야 하는 번거로움이 생깁니다. 그래서 nginx docker 컨테이너 안에서 logrotate를 실행하는 구조로 만드는 것이 더 좋다고 생각합니다.

Dockerfile 생성

logrotate가 포함된 nginx 이미지를 만들기 위해서 Dockerfile을 생성해보겠습니다.

logrotate.conf

먼저 logrotate 설정 파일을 하나 준비합니다. /logs/*.log는 docker 컨테이너 안의 경로입니다. 옵션 정보는 검색하면 많이 나오기 때문에 생략합니다.

/logs/*.log {
    daily
    rotate 3
    missingok
    copytruncate
    dateext
    sharedscripts
    postrotate
        [ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
    endscript
}

nginx.conf

docker nginx에 있는 기본 conf을 참고해서 심플하게 생성한 nginx.conf 파일입니다. nginx실행시 /logs 디렉토리 밑에 로그 파일이 생성되도록 했습니다.

user  nginx;
worker_processes  auto;

events {
    worker_connections  1024;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    keepalive_timeout  60;

    server {
      listen 80;

      access_log /logs/access.log;
      error_log /logs/error.log;

      location / {
        root   /usr/share/nginx/html;
        index  index.html;
      }
    }
}

script.sh

nginx 실행시 cron을 통해서 logrotate도 실행될 수 있도록 shell script 파일도 하나 생성합니다.

#! /bin/sh

crond
nginx -g 'daemon off;'

Dockerfile

nginx alpine에는 logrotate가 없기 때문에 docker 이미지 생성 시 먼저 설치하고 앞서 생성한 logrotate, nginx.conf 파일을 이미지에 포함시킵니다.

FROM nginx:1.19.6-alpine

# Install logrotate
RUN apk add --no-cache logrotate

COPY ./nginx.conf /etc/nginx/nginx.conf
COPY ./logrotate.conf /etc/logrotate.conf

COPY ./script.sh /script.sh
RUN chmod +x /script.sh

ENTRYPOINT ["/script.sh"]

Docker 이미지 생성

Dockerfile에 있는 경로에서 아래 커맨드를 입력하면 sample-nginx 이름의 docker 이미지가 생성됩니다.

> docker build --tag sample-nginx .		# 도커이미지 생성
> docker images					# 생성된 이미지 확인

실행

sample-nginx라는 이름으로 docker 이미지를 생성했으니 nginx를 실행해 보겠습니다.

docker run

docker run 명령을 통해서 직접 실행할 수 있습니다. run 명령으로 실행하게 되면 호스트가 변경되었거나 컨테이너 삭제 후 다시 실행할 경우에 실행했던 명령어를 기억하지 못해 불편할 수 있습니다.

> docker run -d \
     --name sample-nginx \
     -p 80:80 \
     -p 443:443 \
     --restart=always \
     --env TZ=Asia/Seoul \
     -v ~/volumes/nginx/logs:/logs \
     sample-nginx

docker-compose

docker run으로 간단하게 실행해볼 수도 있지만, 실행 정보를 좀 더 구조적으로 확인하고 실행하려면 docker-compose를 이용하는 게 좋습니다. 아래 내용으로 docker-compose.yml이라는 파일을 만들면 docker-compose 명령어로 실행할 수 있습니다.

version: '3.8'
services:
  nginx:
    build: .
    container_name: sample-nginx
    image: sample-nginx
    volumes:
      - "~/volumes/nginx/logs:/logs"
    restart: always
    ports:
      - "80:80"
      - "443:443"
    environment:
      TZ: Asia/Seoul

아래는 자주 사용하는 docker-compose 명령어입니다.

> docker-compose up 			# 실행
> docker-compose up -d 			# detach 모드 실행
> docker-compose up --no-deps	        # 연결된 다른 서비스 제외하고 시작
> docker-compose up --build		# 컨테이너를 시작하기 전에 이미지를 빌드한다.

> docker-compose stop 			# 컨테이너 정지
> docker-compose pause			# 컨테이너 일시정지
> docker-compose restart 		# 컨테이너 재시작
> docker-compose rm			# 컨테이너 삭제
> docker-compose down			# 컨테이너 제거(네트워크, 볼륨 전체)

> docker-compose ps			# 실행중인 컨테이너 확인
> docker-compose logs			# 컨테이너 로그 확인

docker-compose up -d를 입력해서 docker-compose를 실행하고 http://localhost로 접속하면 Welcome to nginx! 페이지를 확인할 수 있습니다.

Logrotate 적용 확인

logrotate가 잘 적용되었는지 확인하려면 컨테이너로 접속해서 확인해 볼 수 있습니다. 아래 명령어로 실행 중인 컨테이너 안을 확인할 수 있습니다.

> docker exec -it <CONTAINER_ID> /bin/sh

접속한 후에 logrotate 명령어로 이상 없이 실행 가능한지 확인할 수 있습니다.

> logrotate -v /etc/logrotate.d/nginx
> cat /var/lib/logrotate.status

끝.

댓글남기기