[PROJECT] Docker_Logging Project

초이지수·2022년 6월 2일
0

PROJECT

목록 보기
7/9
post-thumbnail
post-custom-banner

본 프로젝트는 AWS EC2 환경에서 진행하였습니다.

Logging Project 및 인턴 생활 회고록


🐳 Logging Project (Docker)

Client ip 와 Request_time 정보를 가져와 PostgreSQL 에 저장하는 로직을 구현하는 프로젝트 입니다!

  1. Django, PostgreSQL 연결해
  2. 웹 화면에 Client ip 띄우기 (Django)

🙆🏻‍♀️ 1. Django, PostgreSQL 연결하기


🐋 1. 폴더 한 개 생성

mkdir 


🐋 2. 폴더 내부에 Dockerfile 생성

FROM python:3
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

🐋 3. 폴더 내부에 requirements.txt 생성

Dockerfile에서 requirements.txt 파일에 선언된 버전으로 인식하여 설치된다!

Django>=3.0,<4.0
psycopg2-binary>=2.8

🐋 4. 폴더 내부에 docker-compose.yml 생성

version: "3.9"
   
services:
  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

🐋 5. 권한 설정

리눅스에서 Docker를 실행하는 경우, 컨테이너가 root로 실행되기 때문에 생성된 파일은 root에게 소유권이 있다.

권한 설정 해야함!

$ whoami
$ sudo chown -R 'whoami해서나온이름' .

새로운 사용자 만드는 법

#사용자 생성
useradd django
passwd django

#권한 조정
chown -R django:django .

PostgreSQL 권한 문제있을 경우

$ docker exit -it --username --dbname

🐋 6. Docker compose

Docker compose 로 Django, PostgreSQL 컨테이너 띄우기

$ docker-compose run web django-admin startproject composeexample .

🐋 7. settings.py 편집

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': '알아서 비밀번호 설정하기',
        'HOST': 'db',
        'PORT': 5432,
    }
} run web django-admin startproject composeexample .

🐋 8. docker-compose up / docker-compose down


🙆🏻‍♀️ 2. 웹 화면에 Client ip 띄우기 (Django 사용)

🐋 1. 장고 App 만들기

$ docker-compose exec web python manage.py startapp logs

🐋 2. models.py 작성 & migration

  • models.py
    from django.db import models
    
    class Log(models.Model):
        ip_address  = models.CharField(max_length=50, blank=True)
        access_time = models.DateTimeField(auto_now_add=True)
        
        class Meta:
            db_table = "logs"

$ docker-compose exec web python manage.py makemigrations
$ docker-compose exec web python manage.py migrate

🐋 3. views.py 작성

requsest.META에 들어있는 정보 key:value 값이라 META의 [’REMOTE_ADDR’] 확인하면 ip 확인 가능하다.

  • views.py
from django.http import JsonResponse
from django.views import View
from logs.models import Log
from datetime import datetime

class LogView(View):
    def get(self, request):
        ip_address = request.META['REMOTE_ADDR']

        access_time = datetime.now()

        Log.objects.create(
            ip_address = ip_address,
            access_time = access_time
        )

        logs = Log.objects.all()

        log_list = [{
            'ip_address' : log.ip_address,
            'access_time' : log.access_time
        }for log in logs]

        return JsonResponse({'result':log_list}, status=200)

💡 프로젝트 결과!

profile
닫혀 있어서 벽인 줄 알고 있지만, 사실은 문이다.
post-custom-banner

0개의 댓글