개발로 자기계발
article thumbnail
728x90

계속해서 Docker에 관심이 갔었고 이번 기회에 Docker 환경에서 Django 실행까지 가이드를 작성해보려고 한다.

 

도커를 사용하는 이유

Docker는 애플리케이션과 그 종속성을 컨테이너라는 격리된 환경에 패키징하여 개발, 테스트, 배포 등의 과정에서 발생할 수 있는 환경 차이를 최소화한다. 이를 통해 개발 환경 구성을 간소화하고, 프로젝트의 일관성과 이식성을 높일 수 있다.

 

사전 설정

Docker Desktop 다운

https://www.docker.com/products/docker-desktop/

 

Download Docker Desktop | Docker

Docker Desktop is available to download for free on Mac, Windows, or Linux operating systems. Get started with Docker today!

www.docker.com

 

Dockerhub Access Tokens 발급

https://hub.docker.com/

 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

Account Settings -> General

 

Github repository 생성 후 Dockhub 등록

seok_dockerhub: 도커 허브에 가입하는 데 사용하는 사용자 이름

seok_dockerhub_token: 도커 허브 엑세스 토큰

 

환경 구성

프로젝트에 필요한 패키지 정리

프로젝트에서 필요한 패키지와 개발 환경에서만 필요한 패키지를 각각 requirements.txt와 requirements.dev.txt에 명시

이를 통해 개발 및 프로덕션 환경에서 필요한 패키지를 분리하여 관리할 수 있다.

requirements.txt

# Django의 버전이 최소 3.2.4 이상이고, 3.3 미만인 모든 버전과 호환
Django>=3.2.4,<3.3
# Django REST framework의 버전이 최소 3.12.4 이상이고, 3.13 미만인 모든 버전과 호환
djangorestframework>=3.12.4,<3.13


requirements.dev.txt

flake8은 Python 코드를 정적으로 분석하여 스타일 가이드 준수 및 문법 오류를 확인하는 도구
(코드 품질을 향상하는 데 도움이 되므로 개발 환경에서 사용)

flake8>=3.9.2,<3.10

 

.flake8

[flake8]
exclude =
    migrations,
    __pycache__,
    manage.py,
    settings.py

 

.gitignore 파일 생성

프로젝트에서 저장소에 포함시키지 않을 파일과 디렉터리를 지정한다. 이를 통해 불필요한 파일이 버전 관리에 포함되지 않도록 한다.

https://www.toptal.com/developers/gitignore

 

gitignore.io

Create useful .gitignore files for your project

www.toptal.com

여기에서 default 설정으로 파일을 만들 수도 있고, 파일 내에서 직접 지정할 수 있다.

 

.dockerignore 파일 생성

도커 빌드 시 무시할 파일과 디렉터리를 지정한다. 이를 통해 빌드 과정에서 불필요한 파일이 이미지에 포함되지 않도록 한다.

# Git
.git
.gitignore

# Docker
.docker

# Python
.idea
app/__pyache__/
app/*__pyache__/
app/*/*/__pyache__/
app/*/*/*/__pyache__/
.env/
.venv/
venv/

 

Dockerfile 생성

프로젝트에 사용할 도커 이미지를 생성하기 위한 설정 파일을 작성한다. Dockerfile을 통해 이미지를 구성하고 필요한 패키지를 설치하며, 작업 디렉터리와 사용자를 설정한다. 이를 통해 프로젝트의 실행 환경을 일관성 있게 관리할 수 있다.

# Alpine Linux 3.13에서 Python 3.9 이미지를 기반
FROM python:3.9-alpine3.13

# 이미지를 생성한 사람의 정보를 포함하는 레이블을 추가
LABEL maintainer="seokcoding.com"

# Python 출력 버퍼링을 비활성화
ENV PYTHONUNBUFFERED 1

# 로컬 파일 시스템에서 requirements.txt 파일을 /tmp 디렉토리로 복사
COPY ./requirements.txt /tmp/requirements.txt
# 로컬 파일 시스템에서 requirements.dev.txt 파일을 /tmp 디렉토리로 복사
COPY ./requirements.dev.txt /tmp/requirements.dev.txt

# 로컬 파일 시스템에서 애플리케이션 코드를 /app 디렉토리로 복사
COPY ./app /app

# 이미지 내부의 작업 디렉토리를 /app으로 설정
WORKDIR /app

# 8000번 포트를 노출
EXPOSE 8000

# 이미지를 빌드 할 때 'DEV' 인자가 전달되지 않으면, 기본적으로 false로 설정
ARG DEV=false

# 가상 환경을 만들고, pip를 업그레이드하고, 필요한 패키지를 설치하며, 
# 임시 디렉토리를 삭제하고, django-user라는 사용자를 추가
RUN python -m venv /py && \
    /py/bin/pip install --upgrade pip && \
    /py/bin/pip install -r /tmp/requirements.txt && \
    if [ $DEV = "true" ]; \
      # 개발용 패키지 설치 명령문
      then /py/bin/pip install -r /tmp/requirements.dev.txt ; \
    fi && \
    rm -rf /tmp && \
    adduser \
        --disabled-password \
        --no-create-home \
        django-user

# PATH 환경 변수를 설정하여 가상 환경에 설치된 pip를 사용할 수 있도록 한다.
ENV PATH="/py/bin:$PATH"

# django-user 사용자로 전환
USER django-user

 

docker-compose.yml 파일 생성

Docker Compose를 이용하여 앱 서비스를 정의한다.

version: "3.9"

services:
  app:
    # 현재 디렉토리를 빌드 컨텍스트로 사용하여 Docker 이미지를 빌드
    build:
      context: .
      # Dockerfile에 'DEV' 인자를 전달하는 데 사용
      # Dockerfile에서 빌드 과정 중에 'DEV' 변수를 true로 설정
      args:
        - DEV=true
    # 호스트의 8000번 포트를 컨테이너의 8000번 포트로 매핑
    ports:
      - "8000:8000"
    volumes:
      # 현재 디렉토리의 app 디렉토리를 컨테이너의 /app 디렉토리와 공유
      - ./app:/app
    # 컨테이너가 시작될 때 실행할 명령어를 설정
    command: >
      sh -c "python manage.py runserver 0.0.0.0:8000"

 

도커 이미지 빌드

이제 작성한 설정 파일을 이용하여 도커 이미지를 빌드하고 컨테이너를 실행한다.

터미널에서 다음 명령어를 입력, 이 명령어는 docker-compose.yml 파일에 정의된 서비스를 빌드한다.

docker-compose build

처음 실행할 때는 도커 이미지를 빌드해야 하므로 시간이 다소 걸릴 수 있다.

 

코드 스타일 검사 수행 및 개선

docker-compose run --rm app sh -c "flake8"

* docker-compose run --rm은 서비스를 실행하고 종료 후 컨테이너를 삭제한다.

* 여기서 app 서비스에 대해 명령어 sh -c "flake8"를 실행하고, 실행이 끝나면 컨테이너를 삭제

 

장고 프로젝트 생성

터미널에서 다음 명령어를 입력, app 폴더 안에 (app, manage.py, db.sqlite 3)가 생성된다.

docker-compose run --rm app sh -c "django-admin startproject app ."

 

도커 컨테이너 실행 및 애플리케이션 확인

docker-compose up

이제 브라우저에서 http://localhost:8000으로 접속하여 애플리케이션을 확인할 수 있다.

Django가 정상적으로 구동되고 있으면, 기본 환영 페이지가 표시된다.

최종 프로젝트 구성

728x90
SMALL
profile

개발로 자기계발

@김잠봉

틀린부분이나 조언이 있다면 언제든 환영입니다:-)