[Docker] Django를 이용해, 기초부터 CI/CD 까지

2024. 10. 17. 16:52· Django/인프라
목차
  1. Docker 기초 이해
  2. 왜 도커 인가?
  3. 이미지와 컨테이너의 개념
  4. Docker 설치
  5. Docker 명령어
  6. 이미지 다운로드
  7. Docker와 Django 프로젝트 설정
  8. Dockerfile 작성
  9. Docker 이미지 빌드
  10. Docker를 이용해 Django 실행
  11. Docker Compose 생성
  12. 마이그레이션 및 슈퍼유저
  13. 슈퍼유저 생성
  14. Docker를 활용한 개발환경 최적화
  15. docker-compose.override.yml
  16. Docker를 이용한 배포 준비
  17. Nginx와 Gunicorn 설정
  18. dockerfile & docker-compose 업데이트
  19. Docker Hub에 이미지 푸시
  20. Docker Hub 로그인
  21. Docker 이미지 태그 추가 & 푸시
  22. AWS에 ECS에 Docker 배포
  23. CI/CD 파이프라인 구축
  24. CI/CD 개념 및 워크 플로우
  25. GItHub Actions 설정 파일 작성
반응형

Docker 기초 이해

왜 도커 인가?

 

[Docker] 도커의 필요성과 장점

처음 도커를 접했을 때, 처음에는 너무 어려워서 배워야 하나 라는 생각을 하기도 했지만, 개발 공부를 하고 오픈톡방에서 다양한 정보를 접하면서 도커를 사용하는 사람이 많고 인기를 끌고 있

jongseoung.tistory.com

 

 

이미지와 컨테이너의 개념

이미지: 실행 가능한 컨테이너의 청사진(도면)으로 OS, 애플리케이션, 라이브러리 등의 모든 정보가 포함되어 있다.

  • Docker 이미지는 여러 레이어로 구성되는데, 레이어는 캐시로 관리 되기 때문에 같은 레이어를 재사용하여 효율성을 높인다.

컨테이너: 이미지를 기반으로 실행되는 인스턴스, 컨테이너는 이미지의 복사본처럼 동작하며 독립된 환경에서 실행

 

 

Docker 설치

공식 사이트에서 맥북용 도커를 다운로드 합니다. (본인에 맞게 설치)

설치가 완료 되면, 터미널을 열고 Docker가 설치되었는지 확인해 봅니다.

docker --version

 

Docker 명령어

이미지 다운로드

아래의 명령어를 이용해서, 이미지를 다운로드 받고 컨테이너를 실행 & 중지 해보자.

sleep를 넣어준 이유는 파이썬 인터프리터를 실행한후, 어떤 명령이 주어지지 않으면 자동으로 종료하기 때문이다.

docker pull python:3.11.6-slim  # Python 이미지 다운로드
docker run -it python:3.11.6-slim  # Python 환경의 컨테이너 실행
docker run -d python:3.11.6-slim sleep 3600 # Python 환경의 컨테이너를 백그라운드에서 1시간동안 실행
docker ps  # 실행 중인 컨테이너 확인
docker stop <CONTAINER_ID>  # Django 서버가 포함된 컨테이너 중지

상호작용 모드로 실행

백그라운드에서 실행 & 중지

 

 

Docker와 Django 프로젝트 설정

Dockerfile 작성

# dockerfile

FROM python:3.11.6-slim

ENV PYTHONUNBUFFERED=1

WORKDIR /app

COPY requirements/ requirements/
RUN pip install -r requirements/prod.txt

COPY . .

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

 

Docker 이미지 빌드

docker build -t django-app .

Docker를 이용해 Django 실행

docker run -p 8000:8000 django-app

아래처럼 에러가 발생하는데, 프로젝트에서 sqlite3가 아니라 postgresql을 사용했고 DB가 실행되지않아 5432 포트로 연결이 안된다는 말이다.

 

 

Docker Compose 생성

docker-compose는 여러 컨테이너를 조합해 하나의 애플리케이션 스택으로 정의하고 관리한다.

데이터 베이스, 캐시, 웹 서버등 다중 서비스가 필요한 경우 docker-compose.yml을 생성해 줘야한다.

version: '3'
services:
  db:
    image: postgres
    ports:
      - "5432:5432"
    expose:
      - "5432"
    environment:
      POSTGRES_DB: todolist
      POSTGRES_USER: jongseoung
      POSTGRES_PASSWORD: postgres
    container_name: POSTGRES_DB
    
  web:
    build: .
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    command: python manage.py runserver 0.0.0.0:8000
    depends_on:
      - db
    restart: always
    container_name: Backend

이제 아래의 명령어를 이용해 이미지 파일과 컨테이너를 빌드 해준다.

docker-compose 파일이 변경된다면, 아래의 명령어를 사용해주면 된다.

docker-compose up --build

 

만약 docker-compose의 변화 없이 서비스를 시작, 중지는 아래 명령어를 사용하면 된다.

-d 옵션을 붙여서 백그라운드에서 사용 가능하다, docker-compose up -d 처럼

docker-compose up
docker-compose down

 

마이그레이션 및 슈퍼유저

마이그레이션

현재 Django는 마이그레이션이 안되어있다. docker에 Django 서버가 실행중일때, 아래의 명렁어를 이용하여 마이그레이션을 할 수 있다.

docker exec -it <WEB_CONTAINER_ID> python manage.py migrate

슈퍼유저 생성

아래는 Django 서버가 실행중일때, 슈퍼 유저를 생성하는 명령어이다.

docker exec -it <WEB_CONTAINER_ID> python manage.py createsuperuser

 

 

Docker를 활용한 개발환경 최적화

docker-compose.override.yml

docker-compose.override.yml은 기본 docker-compose.yml 파일을 확장하여 개발 환경에 필요한 설정을 추가한다.

version: '3'

services:
  web:
    command: >
      sh -c "python manage.py migrate && 
             python manage.py runserver 0.0.0.0:8000"
    volumes:
      - .:/app
    environment:
      - DEBUG=True
    ports:
      - "8000:8000"

command: 컨테이너가 실행될 때마다 마이그레이션을 자동으로 실행하고, Django 서버를 연다.

volumes: 로컬의 파일이 변경되면 컨테이너에 바로 반영되도록 마운트한다.

환경 변수 설정: DEBUG=True로 개발모드에서 서버가 실행되도록 설정하였다.

 

이제 서버를 다운 했다가 다시 열어보면 마이그레이 되는것을 확인할 수 있다.

 

 

Docker를 이용한 배포 준비

Nginx와 Gunicorn 설정

Gunicorn 설치

Gunicorn은 WSGI 서버로, Django 애플리케이션을 서비스할 때 사용된다. Gunicorn을 requirements에 추가하고 재 빌드 해주면 된다. 

이미 빌드 과정에서 pip install -r 을 해주기 때문이다.

 

Nginx 설정 파일 작성

이 설정은 Nginx가 리버스 프록시로 동작하여 80번 포트로 들어오면 Gunicorn 서버로 요청을 전달하도록 한다.

events { }

http {
    upstream django {
        server web:8000;  # Django 웹 서버와 연결 (컨테이너 이름 사용)
    }

    server {
        listen 80;
        server_name localhost;

        location / {
            proxy_pass http://django;  # 모든 요청을 Django 서버로 프록시
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }

        location /static/ {
            alias /app/static/;  # 정적 파일 경로를 Nginx가 직접 서빙
        }
    }
}

dockerfile & docker-compose 업데이트

dockerfile

FROM python:3.11.6-slim as base

# 필수 패키지 설치 (apt 패키지와 pip 설치를 함께)
RUN apt-get update && \
    apt-get install -y gcc libpq-dev && \
    pip install --upgrade pip && \
    pip install psycopg2-binary

# Python 버퍼링 비활성화 (로그 실시간 출력)
ENV PYTHONUNBUFFERED=1

# 작업 디렉터리 설정
WORKDIR /app

# requirements 파일 복사 및 패키지 설치
COPY requirements/ requirements/
RUN pip install -r requirements/prod.txt

# 소스 코드 복사
COPY . .

# Production stage (Gunicorn 실행)
FROM base as production

# 포트 노출
EXPOSE 8000

# 컨테이너 실행 명령어
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "myproject.wsgi:application"]

 

docker-compose

version: '3'
services:
  db:
    image: postgres
    ports:
      - "5432:5432"
    expose:
      - "5432"
    environment:
      POSTGRES_DB: todolist
      POSTGRES_USER: jongseoung
      POSTGRES_PASSWORD: postgres
    container_name: POSTGRES_DB
    
  web:
    build: .
    volumes:
      - .:/app
    ports:
      - "8000:8000"
    depends_on:
      - db
    restart: always
    container_name: Backend

  nginx:
    image: nginx
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "80:80"
    depends_on:
      - web
    container_name: Nginx
    command: /bin/sh -c "rm /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"

 

이제 docker-compose up --build를 이용해 모든 서비스를 재 실행해주고, localhost:80번 포트로 들어가게 되면 Django로 연결된다.

 

이후, 불필요한 이미지와 컨테이너를 정리해준다.

docker system prune -f

 

 

Docker Hub에 이미지 푸시

Docker Hub에 이미지를 푸시하면 클라우드 서비스에서 쉽게 가지고와 실행할 수 있다.

Docker Hub 로그인

docker login

로그인을 하면 username과 password를 입력해야하는데, 아래의 주소에서 계정을 만들어주면 된다.

 

Docker: Accelerated Container Application Development

Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.

www.docker.com

 

Docker 이미지 태그 추가 & 푸시

docker tag django-app dockerhub-username/django-app
docker push dockerhub-username/django-app

아래처럼 docker hub에서 image가 푸시 된것을 확인할 수 있다.

 

AWS에 ECS에 Docker 배포

CI/CD 파이프라인 구축

CI/CD 개념 및 워크 플로우

GItHub Actions 설정 파일 작성

name: CI/CD Pipeline

on:
  push:
    branches:
      - main  # main 브랜치에 푸시될 때 실행

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest

    steps:
      # 1. 리포지토리 체크아웃
      - name: Check out repository
        uses: actions/checkout@v3

      # 2. Docker 로그인
      - name: Log in to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}

      # 3. Docker 이미지 빌드
      - name: Build Docker image
        run: docker build -t your-dockerhub-username/django-app:latest .

      # 4. Docker 이미지 푸시
      - name: Push Docker image
        run: docker push your-dockerhub-username/django-app:latest

      # 5. 배포 (선택: ECS 또는 Cloud Run 트리거)
      - name: Deploy to Cloud Run (Optional)
        env:
          PROJECT_ID: ${{ secrets.GCP_PROJECT_ID }}
          SERVICE_NAME: django-app
        run: |
          gcloud auth activate-service-account --key-file ${{ secrets.GCP_KEY }}
          gcloud run deploy $SERVICE_NAME --image=gcr.io/$PROJECT_ID/django-app:latest --region=us-central1 --platform=managed
반응형
저작자표시 (새창열림)

'Django > 인프라' 카테고리의 다른 글

docker 파일 별 용도 및 이미지 빌드 & 실행 방법  (0) 2025.01.11
[Docker] 도커의 필요성과 장점  (1) 2024.10.17
[AWS] Micro Service Architecture  (0) 2024.10.17
[AWS] CloudFront  (0) 2024.10.15
[AWS] 스토리지 클래스와 Lifecycle  (0) 2024.10.14
  1. Docker 기초 이해
  2. 왜 도커 인가?
  3. 이미지와 컨테이너의 개념
  4. Docker 설치
  5. Docker 명령어
  6. 이미지 다운로드
  7. Docker와 Django 프로젝트 설정
  8. Dockerfile 작성
  9. Docker 이미지 빌드
  10. Docker를 이용해 Django 실행
  11. Docker Compose 생성
  12. 마이그레이션 및 슈퍼유저
  13. 슈퍼유저 생성
  14. Docker를 활용한 개발환경 최적화
  15. docker-compose.override.yml
  16. Docker를 이용한 배포 준비
  17. Nginx와 Gunicorn 설정
  18. dockerfile & docker-compose 업데이트
  19. Docker Hub에 이미지 푸시
  20. Docker Hub 로그인
  21. Docker 이미지 태그 추가 & 푸시
  22. AWS에 ECS에 Docker 배포
  23. CI/CD 파이프라인 구축
  24. CI/CD 개념 및 워크 플로우
  25. GItHub Actions 설정 파일 작성
'Django/인프라' 카테고리의 다른 글
  • docker 파일 별 용도 및 이미지 빌드 & 실행 방법
  • [Docker] 도커의 필요성과 장점
  • [AWS] Micro Service Architecture
  • [AWS] CloudFront
Jong_seoung
Jong_seoung
기록하자, 머리는 생각하는 곳이지 저장장치가 아니다.
반응형
Jong_seoung
Today_developStory
Jong_seoung
전체
오늘
어제

블로그 메뉴

  • Home
  • Git Hub
  • 분류 전체보기 (351)
    • Theory (16)
    • Java (3)
      • 알고리즘 (2)
      • 문법 (0)
    • Spring (7)
      • 스프링 입문 (6)
      • PickTalk (0)
      • 에러처리 (1)
    • Python (80)
      • 알고리즘 - 이론 (17)
      • 알고리즘 - 내장함수, 라이브러리 등등 (3)
      • 알고리즘 - 백준 (53)
      • 나도코딩 정리 (2)
      • 기타 (5)
    • Django (159)
      • DRF (105)
      • 인프라 (46)
      • DataBases (2)
      • API Docs (6)
    • FrontEnd (22)
      • htmx (2)
      • React (8)
      • 자바스크립트 (12)
    • GIT (16)
    • 기타 (8)
      • 정리 (2)
      • Flutter (1)
      • 마이크로프로세서 - ATmega128 (2)
      • 개발환경 세팅 (3)
    • 자격증 (37)
      • 정보처리기사 (19)
      • SQLD자격증 (18)

인기 글

최근 글

태그

  • alarm
  • BFS
  • CSRF
  • Django
  • django channels
  • django sse
  • django tutorial
  • django 배포
  • django 스웨거 적용
  • Django 이미지 저장

최근 댓글

hELLO · Designed By 정상우.v4.3.0
Jong_seoung
[Docker] Django를 이용해, 기초부터 CI/CD 까지
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.