Django 프로젝트 생성하기

|

Django 프로젝트 생성하는 방법

Django에서 프로젝트 뼈대는 다음 명령어를 이용해서 만들 수 있습니다.

$ django-admin startproject mysite

위 명령어를 입력하면 현재 디렉토리에 mysite라는 이름의 디렉토리가 만들어지고 Django 프로젝트를 시작할 수 있게 됩니다.


프로젝트 구성

tree(Windows에서는 tree /f) 명령어를 이용하면 다음과 같은 디렉토리 구조가 만들어진 걸 확인할 수 있습니다.

C:.
└─mysite
    │  manage.py
    │
    └─mysite
            settings.py
            urls.py
            wsgi.py
            __init__.py


위에서 각 디렉토리 및 파일은 다음과 같은 역할을 합니다.

  • mysite : 가장 바깥쪽의 디렉토리인 mysite는 Django와 아무 관련이 없는 디렉토리이며 다른 이름으로 바꿔도 상관없습니다.
  • manage.py : Django의 다양한 명령어를 실행할 수 있게 해주는 커맨드라인 형태의 유틸리티입니다.
  • mysite : 하위에 있는 mysite 디렉토리에 실질적인 프로젝트 파일들이 위치합니다.
  • settings.py : 프로젝트의 환경 설정 파일입니다.
  • urls.py : 프로젝트 레벨의 URL 패턴을 정의하는 URLConf입니다.
  • wsgi.py : Apache 등과 같은 상용 웹 서버와 WSGI 규격으로 연동할 수 있게 해주는 파일입니다.
  • init.py : 이 디렉토리가 Python 패키지임을 알려주는 빈 파일입니다.


Django 어플리케이션 생성

하나의 프로젝트 안에는 여러 개의 어플리케이션을 만들 수 있습니다. 다음 명령어를 이용하여 ‘books’라는 어플리케이션을 생성할 수 있습니다.

$ cd mysite

$ python manage.py startapp books

위 명령어를 실행하면 프로젝트는 다음과 같은 구조가 됩니다.

C:.
└─mysite
    │  manage.py
    │
    ├─books
    │  │  admin.py
    │  │  apps.py
    │  │  models.py
    │  │  tests.py
    │  │  views.py
    │  │  __init__.py
    │  │
    │  └─migrations
    │          __init__.py
    │
    └─mysite
        │  settings.py
        │  urls.py
        │  wsgi.py
        │  __init__.py
        │
        └─__pycache__
                settings.cpython-35.pyc
                __init__.cpython-35.pyc


데이터베이스에 변경 사항 반영

다음 명령어로 데이터베이스에 변경 사항을 반영할 수 있습니다.

$ python manage.py migrate

Operations to perform:
  Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying auth.0009_alter_user_last_name_max_length... OK
  Applying auth.0010_auto_20180201_0911... OK
  Applying sessions.0001_initial... OK


Django 프로젝트 실행

$ python manage.py runserver

Django 웹 프레임워크

|

Django

Django는 파이썬으로 웹 서버를 쉽게 개발할 수 있는 기능을 제공하는 프레임워크(Framework)입니다. 2003년 로렌스 저널-월드 신문사의 내부 프로젝트로 시작했으며, 2005년 오픈소스화되었습니다.


Django 설치 방법

Django는 pip를 이용해서 간단히 설치할 수 있습니다.

$ pip install django


Django 버전 확인

다음 명령어로 현재 Django의 버전을 확인할 수 있습니다.

$ python -m django --version


Django 특징

MTV 패턴

Django는 MTV 패턴 구조로 되어 있습니다. MTV 패턴은 Modle-Template-View로 이루어져 있으며, MVC 패턴의 Model-View-Controller와 일치합니다. 주의할 점은 MTV 패턴에서 Template는 MVC 패턴에서의 View와 대응되며, MTV 패턴의 View는 MVC 패턴의 Controller와 대응됩니다.


ORM 지원

ORM(Object-Relational Mapping)은 데이터베이스 시스템과 데이터 모델을 쉽게 연결시켜주는 기능입니다. 직접 SQL문으로 쿼리를 작성하지 않더라도 데이터베이스로부터 값을 쉽게 가져올 수 있고, 데이터를 마치 객체를 다루듯이 사용할 수 있습니다.


Admin 화면 제공

Django로 제작한 웹 서버는 Admin 화면을 자동으로 제공합니다. Admin 화면을 통해 데이터들을 쉽게 관리할 수 있습니다.


Elegant URL 방식

웹 프로그래밍에서 URL 디자인은 필수적인 작업인데, Django에서는 Elegant URL 방식을 채택하여 각 URL 형태를 파이썬 함수나 클래스에 직접 연결할 수 있도록 하여 쉽게 개발할 수 있는 환경을 제공합니다.


자체 템플릿 시스템

Django는 내부적으로 확장이 가능하고 디자인이 쉬운 템플릿 시스템을 제공합니다. 이를 통해 디자인과 로직을 분리해서 개발할 수 있습니다.


Cache 시스템

동적인 페이지는 일반적으로 데이터베이스 쿼리를 실행하고 템플릿을 해석하여 관련 페이지를 렌더링해주는 작업이 필요합니다. 이는 서버에 큰 부하를 주게 되는데 Django에서는 Cache 시스템을 제공하여 서버의 부하를 줄여줄 수 있습니다.


자체 웹 서버 제공

Django는 자체적으로 웹 서버 기능을 제공하고 있어 개발 과정에서 손쉽게 테스트할 수 있습니다. 또한 디버깅 모드를 제공하여 에러를 쉽게 파악하고 수정할 수 있도록 상세한 메시지를 제공합니다.


소스 변경사항 자동 반영

Django는 소스에 변경사항이 있을 경우 자동으로 반영해줍니다. 따라서 웹 서버를 구동시킨 후 소스 수정을 하더라도 웹 서버 재실행을 할 필요가 없습니다.

Data Volume 사용하는 방법

|

Docker의 파일 시스템

Docker에서 컨테이너 내부의 파일들은 ‘Union File System’에 의해 컨테이너 내부에서 관리됩니다. 하지만 ‘Data Volume’을 사용하게 되면 호스트 PC의 파일 시스템에 파일을 저장할 수가 있습니다. 따라서 이 경우에는 docker commit 명령어를 이용하더라도 해당 파일은 이미지에 포함되지 않습니다.


Data Volume 설정 방법

볼륨을 연결하는 옵션은 -v <호스트 PC 디렉토리>:<컨테이너 디렉토리> 입니다. 아래 예제는 로컬 호스트 PC의 /home/snowdeer/Docker/data-volume/ 디렉토리를 snow-volume라는 이름의 컨테이너 내부의 /data 디렉토리로 연결할 수 있습니다.

$ docker run -i -t --name snow-volume -v /home/snowdeer/Docker/data-volume/:/data ubuntu /bin/bash

위 명령어를 실행하고 나서 bash 명령어로

$ cd /data

$ touch hello-snowdeer.txt

를 입력하고 나서 호스트 PC의 연결된 디렉토리를 살펴보면 컨테이너 내부에서 생성한 파일이 보이는 것을 확인할 수 있습니다.

이렇게 데이터 볼륨을 이용하면 여러 컨테이너들끼리 같은 파일 데이터를 공유할 수 있습니다. 또한 디렉토리 연결뿐만 아니라 다음과 같이 파일을 연결할 수도 있습니다.

$ docker run -i -t --name snow-volume -v /home/snowdeer/Docker/data-volume/hello.txt/:/data/hello.txt ubuntu /bin/bash


–volumes-from 옵션을 이용한 데이터 볼륨 연결

다음 명령어를 입력하면 위에서 생성한 ‘snow-volume’이라는 이미지의 데이터 볼륨을 새로 생성하는 컨테이너에 연결할 수 있습니다.

$ docker run -i -t --volumes-from snow-volume --name snow-volume2 ubuntu /bin/bash

Nginx 이미지 생성하기

|

nginx

nginx는 가볍고 실용적인 웹서버입니다. 웹서버, 리버스 프록시, 메일 프록시 등의 기능을 갖고 있습니다.


ngix 이미지 생성하기

nginx 이미지 생성용 Dockerfile은 여기에서 확인할 수 있습니다.

FROM ubuntu:latest

# Install Nginx.
RUN apt-get update
RUN apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
RUN chown -R www-data:www-data /var/lib/nginx

# Define mountable directories.
VOLUME ["/etc/nginx/sites-enabled", "/etc/nginx/certs", "/etc/nginx/conf.d", "/var/log/nginx", "/var/www/html"]

# Define working directory.
WORKDIR /etc/nginx

# Define default command.
CMD ["nginx"]

# Expose ports.
EXPOSE 80
EXPOSE 443

위와 같은 Dockerfile을 생성하고 해당 폴더에서 아래 명령어를 이용해서 nginx 이미지를 빌드할 수 있습니다.

$ docker build --tag snow-nginx:0.1 .

Sending build context to Docker daemon  2.048kB
Step 1/10 : FROM ubuntu:latest
latest: Pulling from library/ubuntu
1be7f2b886e8: Pull complete
6fbc4a21b806: Pull complete
c71a6f8e1378: Pull complete
4be3072e5a37: Pull complete
06c6d2f59700: Pull complete
Digest: sha256:e27e9d7f7f28d67aa9e2d7540bdc2b33254b452ee8e60f388875e5b7d9b2b696
Status: Downloaded newer image for ubuntu:latest
 ---> 0458a4468cbc
Step 2/10 : RUN apt-get update
 ---> Running in 5ff5327e54cb

...

Step 9/10 : EXPOSE 80
 ---> Running in da53118109a4
Removing intermediate container da53118109a4
 ---> 395dc7dc3371
Step 10/10 : EXPOSE 443
 ---> Running in 3f8c3f9a8895
Removing intermediate container 3f8c3f9a8895
 ---> a935dd536d8e
Successfully built a935dd536d8e
Successfully tagged snow-nginx:0.1


빌드된 이미지 확인은 docker images로 확인할 수 있습니다.

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
snow-nginx          0.1                 a935dd536d8e        58 seconds ago      208MB

Scratch 이미지 생성하기

|

Scratch 이미지 생성하기

Docker에서 아무 것도 들어있지 않은 비어있는 베이스 이미지를 scratch 이미지라고 합니다.

dev/null 장치를 이용해서 비어있는 tar 파일을 docker import하면 scratch 이미지가 생성됩니다.

$ tar cv --files-from /dev/null | sudo docker import - scratch

$ docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
scratch             latest              8a0ef0f0a9b8        6 seconds ago       0B


Scratch 이미지에 프로그램 추가하기

scratch 이미지는 비어있는 이미지이기 때문에 컨테이너 생성이 되지 않습니다. 여기에 프로그램을 하나 추가해보도록 하겠습니다.

아래의 코드와 같이 간단한 C++ 프로그램을 작성합니다.

#include 

using namespace std;

int main() {
    printf("Hello. SnowDeer.\n");
    
    return 0;
}
</pre>

scratch 이미지에는 아무 라이브러리도 없기 때문에 빌드할 때는 반드시 정적(static) 바이너리로 빌드해야합니다.

~~~
$ g++ hello.cpp -static -o hello
~~~


## Dockerfile 생성 그리고 Dockerfile을 아래와 같이 작성합니다.
FROM scratch
ADD ./hello /hello
CMD ["/hello"]
그런 다음 `docker build` 명령을 수행합니다. ~~~ $ docker build --tag hello:0.1 . Sending build context to Docker daemon 1.83MB Step 1/3 : FROM scratch ---> Step 2/3 : ADD ./hello /hello ---> Using cache ---> 0d32a1e91f48 Step 3/3 : CMD ["/hello"] ---> Running in 84a81208a7a9 Removing intermediate container 84a81208a7a9 ---> 13ea232f71c9 Successfully built 13ea232f71c9 Successfully tagged hello:0.1 ~~~ 이미지 생성 결과 확인은 다음과 같습니다. ~~~ $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE hello 0.1 13ea232f71c9 46 seconds ago 913kB scratch latest 8a0ef0f0a9b8 7 minutes ago 0B ~~~ 컨테이너로 실행을 해봅니다. ~~~ $ docker run --rm hello:0.1 Hello. SnowDeer. ~~~