본문 바로가기
Study/AWS

Server Application 배포-EC2 활용

by 왕방개 2024. 5. 2.

1.Django APplication을 Docker Image 를  만들어서 EC2 배포

1)Django Application을 생성

 

=>가상 환경 생성 

python -m venv ./myvenv

 

=>활성화

myvenv/Scripts/activate

 

=>필요한 패키지 설치

django

djangorestframework

 

=>프로젝트 생성

django -admin startproject apiserver

cd apiserver

 

=>프로젝트 실행(제대로 설치됬는지)

python manage.py runserver

 

=>소스 코드 수정

-settings.py 파일을 수정

#배포를 할 때 정확한 IP를 모른다면 *로 설정
ALLOWED_HOSTS = ['*']

#사용할 Application 등록
INSTALLED_APPS = [
    "django.contrib.admin",
    "django.contrib.auth",
    "django.contrib.contenttypes",
    "django.contrib.sessions",
    "django.contrib.messages",
    "django.contrib.staticfiles",
    "rest_framework",
    "apiserver"
]


TIME_ZONE = "Asia/Seoul"

 

-요청을 처리하는 views.py 파일을 만들고 기본 요청이 온 경우 데이터를 리턴하는 함수를 작성

from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework import status()


@api_view(['GET'])
def index(request):
  data = {"result":"success","data":[
    {"id":"시모나", "name":"희정"},
    {"id":"군계", "name":"아담"}
  ]
  return Response(dat, status = status.HTTP_200_OK)

 

-urls.py 파일에 요청 URL과 처리 method 을 연결

from django.contrib import admin
from django.urls import path
from .views import index

urlpatterns = [
    path("admin/", admin.site.urls),
    path("",index),
    
]

 

-실행: 처음 실행할 때 세션 에러가 발생한 경우 아래 명령 수행

python manage.py makemigrations

python manage.py migrate

 

 

=>의존성 내보내기

pip freeze > requirements.txt

 

 

2)Dockerfile 를 이용해서 이미지를 생성

#기반 이미지
FROM python:3.8 as build

#실행할 명령어


#작업 디렉토리 설정
WORKDIR /usr/src/app

#파일을 복사
COPY requirements.txt ./

#패키지 설치
RUN pip install django
RUN pip install djangorestframework

#현재 디렉토리 모든 내용 기반 이미지 복사
COPY . .

#포트 개방
EXPOSE 80

#명령 수행
CMD ["python","manage.py","runserver","0.0.0.0:80"]

 

=>이미지 생성

docker build -t  이미지이름 Dockerfile 경로

 

=>이미지를 컨테이너로 만들어서 실행

docker run --name 컨테이너 이름 -dit -p 외부포트:내부포트 이미지이름

 

3)Git Action을 이용해서 DockerHub(public) 에 이미지를 배포

=>docker hub 에 접속해서 repository 생성

 

=>docker hub에서 access token 생성

 

 

=>폴더에 .github/workflows 폴더 생성후 docker.yml파일 생성

name: django docker

on:
  push:
    branches: ["main"]
  pull_request:
    branches: ["main"]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Set up Python 3.10
        uses: actions/setup-python@v4
        with:
          python-version: '3.10'

      - name: Install Dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{secrets.DOCKERHUB_USERNAME}}
          password: ${{secrets.DOCKERHUB_TOKEN}}
          
      - name: build and release to DockerHub
        env:
          NAME: $ {{ secrets.DOCKERHUB_USERNAME}}
          REPO: apiserver
        run: |
          docker build -t $REPO .
          docker tag %REPO:latest $NAME/$REPO:latest
          docker push $NAME/$REPO:latest

 

=>Git 에 Repository를 생성하고 환경 변수 등록

=>도커 허브에 이미지가 업로드 되었는지 확인

 

4)EC2 인스턴스에서 배포된 이미지를 실행

 

=>EC2 (linux)에 docker 다운받기


Docker 설치

패키지 업데이트: sudo apt-get update

패키지 설치: sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

Docker의 공식 GPG키를 추가

경고 발생: curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –

경고 발생하지 않음: curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

Docker의 공식 apt 저장소를 추가

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

echo   "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null


시스템 패키지 업데이트: sudo apt-get update

Docker 설치: sudo apt-get install docker-ce docker-ce-cli containerd.io

Docker 버전 확인: sudo docker version

Docker 서비스 등록 및 실행

sudo systemctl enable docker

sudo systemctl start docker

 

=>이미지 다운로드

sudo docker run -p 80:80 -d --rm byeoungkwon/apiserver
 
=> 퍼블릭 IP로 확인