계속해서 Docker에 관심이 갔었고 이번 기회에 Docker 환경에서 Django 실행까지 가이드를 작성해보려고 한다.
도커를 사용하는 이유
Docker는 애플리케이션과 그 종속성을 컨테이너라는 격리된 환경에 패키징하여 개발, 테스트, 배포 등의 과정에서 발생할 수 있는 환경 차이를 최소화한다. 이를 통해 개발 환경 구성을 간소화하고, 프로젝트의 일관성과 이식성을 높일 수 있다.
사전 설정
Docker Desktop 다운
https://www.docker.com/products/docker-desktop/
Dockerhub Access Tokens 발급
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
여기에서 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가 정상적으로 구동되고 있으면, 기본 환영 페이지가 표시된다.
'Develop > Django' 카테고리의 다른 글
Django에서 SSH 터널링(EC2)으로 RDS 연동하기 (0) | 2023.05.05 |
---|---|
Django (페이징 뷰) 검색 페이지 기능 구현하기 (0) | 2023.03.24 |
Django View에서 HTML 태그 넣어보기 - 8 (0) | 2023.02.27 |
Django URL reverse / URL name - 7 (0) | 2023.02.27 |
Django 리다이렉트(Redirect) - 6 (0) | 2023.02.26 |