🧩 DevOps/Docker

[Docker] Docker에 Django App 배포하기

nayoungs 2022. 5. 12. 01:04
728x90

📌Index

 

장고(Django)란 파이썬으로 만들어진 무료 오픈소스 웹 애플리케이션

프레임워크(web application framework)이다. 풀 스택 프레임워크이며, Python을 통해 작성한다.

 

 

✔️ 환경 구성

tutorial에 따라 진행해보자

 

 

가상 환경 만들기

가상 환경을 사용하는 이유와 설명에 대해서는 여기에서 확인할 수 있다.

$ mkdir ~/python/hello-django
$ cd ~/python/hello-django

 

가상프로젝트/프로젝트를 생성

$ python3 -m venv venv

 

가상 환경 활성화

$ . venv/bin/activate

 

Django 설치

$ pip3 install Django

 

상태 보존해두기

freeze에 대한 설명은 여기에서 확인할 수 있다.

$ pip3 freeze > requirments.txt



 

✔️ Django Default Home Page 띄워보기

Django 프로젝트 만들기

여기서는 mysite가 프로젝트 이름이다.

$ django-admin startproject mysite

tree 확인

$ tree mysite
mysite
├── manage.py
└── mysite
    ├── __init__.py
    ├── asgi.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

 

프로젝트 실행

python manage.py runserver 0.0.0.0:3000
  • flask에서 flask run과 동일한 것으로 보면됨

 

접속 확인

Django는 default 포트가 8000번이고, 기본적으로 외부 접속은 허용하지 않는다 : curl로는 확인 가능하다

$ curl localhost:8080

<!doctype html>

<html lang="en-us" dir="ltr">
    <head>
        <meta charset="utf-8">
        <title>The install worked successfully! Congratulations!</title>
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <link rel="stylesheet" type="text/css" href="/static/admin/css/fonts.css">
        ...

외부에서 접속하려하면 아래와 같이 차단되어 Invalid HTTP_HOST 화면이 나타나는 것을 확인할 수 있다.

 

 

그렇다면 외부에서 접속을 허용(외부에 노출)하도록 해보자!

mysite 장고 프로젝트 안에, 동일한 이름 mysite 디렉토리를 확인할 수 있는데, 이것은 Django App이다.

기본적으로 프로젝트를 만들면, 프로젝트 이름과 동일한 App이 1개 생성되며 하나의 프로젝트 안에 여러개의 App을 만들 수 있다

mysite/settings.py

해당 파일에서 ALLOWD_HOSTS를 모든 호스트(*)로 설정하자

...
ALLOWED_HOSTS = ['*']
...
$ python3 manage.py runserver 0.0.0.0:8000

 

접속 확인

다음과 같이 docker testing page를 확인할 수 있다

 

 



 

✔️ Polls app 배포하기

polls tutorial에 따라 진행해보자

polls app 생성하기

$ python manage.py startapp polls
$ tree polls
polls
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views.py

 

여기를 참조하여 비어있는 polls/view.py 파일을 아래와 같이 작성한다.

polls/view.py

from django.shortcuts import render

# Create your views here.
from django.http import HttpResponse


def index(request):
    return HttpResponse("Hello, world. You're at the polls index.")

 

polls/urls.py라우팅 파일여기를 참조하여 생성 및 작성하자.

polls/urls.py

from django.urls import path

from . import views

urlpatterns = [
    path('', views.index, name='index'),
]
  • path 경로(여기서는 root)로 들어오면 index 함수를 실행하라는 뜻


최상위 URLconf 에서 polls.urls 모듈을 바라보게 설정하자

mysite/urls.py

주의: mysite 프로젝트 안의 mysite app 내부의 urls.py이다.

from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('polls/', include('polls.urls')),
    path('admin/', admin.site.urls),
]
$ python3 manage.py runserver 0.0.0.0:4000

 

접속 확인

Hello, world. You’re at the polls index.” 문구가 잘 뜨는 것을 확인할 수 있다!

 

image-20220512005558392

 

 

 

✔️  .dockerignore file이란?

 

dockerignore-file

.dockerignore file

COPYADD를 할 때, 제외할 파일을 지정할 수 있으며,Dockerfile과 동일한 위치에 생성한다.

파일명 .dockerignore가 중요하고, 아래와 같이 제외할 목록을 나열한다.

# comment
*/temp*
*/*/temp*
temp?

.dockerfile을 잘 사용하여, 들어가면 안되는 파일들이 제공되지 않도록 유의해야한다.



 

✔️  Django App으로 Docker 이미지 만들기

 

앞서 생성한 django app을 이용하여 진행해보자

이미지를 빌드하기 위한 Dockerfile을 다음과 같이 작성한다.

 

Dockerfile

FROM python:3.9-slim-buster
COPY . /app
WORKDIR /app
RUN python3 -m venv venv && . venv/bin/activate
RUN pip3 install -r requirements.txt
WORKDIR /app/mysite
CMD ["python3", "manage.py", "runserver", "0.0.0.0:8000"]
EXPOSE 8000

.dockerignore 파일 에 복사되지 않을 항목들을 정의한다.

 

.dockerignore

venv/
Dockerfile
.dockerignore

mydjango 이미지를 빌드하자

$ docker build -t mydjango .

이미지 mydjangodocker run 해보자

$ docker run -d -p 80:8000 mydjango

 

접속 확인

 

 

 

 

728x90