Django 어플리케이션 컨테이너화

buchu·2023년 11월 11일

로컬 설정

장고 프로젝트 시작하기

장고 설치

# 가상환경 생성
python -m venv <가상환경명>

# 가상환경 열기
.\<가상환경명>\Scripts\activate

# 가상환경에 django 패키지 설치
pip install django

장고 프로젝트 시작하기

django-admin.exe startproject <프로젝트명> .
python manage.py startapp <앱명>

서버 코딩

  • 코드
    # toy_swarm/settings.py
    
    ...
    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'logger',
    ]
    ...
    # logger/models.py
    
    from django.db import models
    
    class Message(models.Model):
        content = models.TextField()
        timestamp = models.DateTimeField(auto_now=True)
    
        def __str__(self):
            return self.content
    # logger/views.py
    
    from django.http import JsonResponse, HttpResponse
    from django.views.decorators.csrf import csrf_exempt
    from django.views.decorators.http import require_POST
    from .models import Message
    import json
    
    def index(request):
        return HttpResponse('Hi! This is index page.')
    
    @csrf_exempt
    @require_POST
    def log_message(request):
        try:
            data = json.loads(request.body.decode('utf-8'))
            message_content = data.get('message')
            if message_content:
                message = Message(content=message_content)
                message.save()
                return JsonResponse({'message': 'Message logged successfully'})
            else:
                return JsonResponse({'error': 'Invalid message data'}, status=400)
        except json.JSONDecodeError:
            return JsonResponse({'error': 'Invalid JSON data'}, status=400)
    # logger/urls.py
    
    from django.urls import path
    from . import views
    
    urlpatterns = [
        path('', views.index, name='index'),
        path('log', views.log_message, name='logger'),
    ]
    # toy_swarm/urls.py
    
    from django.contrib import admin
    from django.urls import path, include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', include('logger.urls')),
    ]

모델 변경 사항 적용

python manage.py makemigration
python manage.py migrate

requirements.txt 생성

python -m pip freeze > requirements.txt

로컬에서 장고 어플리케이션 동작시키기

클라이언트 코딩

  • 코드
    # client.py
    
    import requests
    import json
    
    url = "http://localhost:8000/log"
    
    message_data = {
        "message": "This is a log message."
    }
    
    response = requests.post(url, 
                             data=json.dumps(message_data), 
                             headers={"Content-Type": "application/json"})
    
    print(response.text)

생성한 서버 동작시키기

python manage.py runserver

도커 파일 및 도커 스택 생성

FROM python:3.8

COPY . /app
WORKDIR /app
RUN python3 -m venv venv && . venv/bin/activate
RUN pip3 install -r requirements.txt
WORKDIR /app/toy_swarm

ENTRYPOINT ["python3", "manage.py", "runserver", "0.0.0.0:8000", "--noreload"]
EXPOSE 8000
version: '3.7'

services:
  logger:
    image: shgpwls374/logger
    deploy:
      replicas: 3
    ports: 
      - 8000:8000

로컬에서 컨테이너 실행

  • 결과 Untitled

가상머신 설정

8000번 포트 인바운드 허용

컨테이너 빌드 테스트

docker build -t logger .
docker run -d --name logger -p 8000:8000 logger

컨테이너 오케스트레이션

git clone https://github.com/nohhyejin1/toy_swarm
docker login
docker build -t logger .
docker tag logger shgpwls374/logger
docker push shgpwls374/logger
docker stack deploy -c docker-stack.yml logger

컨테이너 롤링 업데이트

git pull
docker build -t logger .
docker tag logger shgpwls374/logger
docker push shgpwls374/logger
docker service update shgpwls374/logger logger_logger

0개의 댓글