본문 바로가기
Docker

Docker 활용하여 Django + Nginx + Mysql 배포하기

by Shark_상어 2023. 3. 18.
728x90

필자는 배포 경험이 그렇게 많지 않아서 배포에 대한 두려움이 많았었고 도커를 통해 배포를 해보자 라는

 

생각으로 열심히 구글 서치를 통해 배포에 성공하게 되었다.

 

이 경험을 정리 겸 공유 하고자 글을 쓴다. (이 글은 docker, mysql WorkBench 설치, 기존 Django 앱, 모델, url, view 등 각자 작성 되 있다는 가정 이다.)

1.  Django 어플리케이션 만들기

첫번째 과정은 간단한 장고 어플리케이션을 만들어보겠다.

 

만약 이미 제작한 어플리케이션이 있으신 분은 이 단계를 건너 뛰어도 된다.

 

먼저 디렉토리를 하나 만들고 해당 프로젝트의 가상환경을 만들어주고 장고를 받아주자.

 

가상환경 만들기
가상환경으로 이동
django 설치

이렇게 까지 했다면 venv 폴더가 존재 하는 디렉토리에 Django 라는 폴더를 하나 만들어주자.

Django 폴더 안에 venv 폴더를 이동 시켜주자. (docker-compose파일을 Django 폴더와 동일한 루트에 생성 하기 위해!)

 

이후에 프로젝트를 생성 해주자

배포의 첫단계는 마무리 되었다.

이제는 각자의 app, model, urls 정의 해준다. (각자 프로젝트 마다 성격이 다 다르므로 생략!)

 

/프로젝트이름/settins.py 파일에 설정 몇줄만 추가 하겠다.

 

1.첫번째

ALLOWED_HOSTS = ['0.0.0.0', 'testdocker']

2.  두 번쨰

장고와 mysql 데이터베이스르 연결하려면 mysqlclient이 필요하다. 다음과 같이 mysqlclient를 설치해주자

 

데이터베이스 부분을 주석처리 하고~

 다음과 같이 정의 하였다~

위 코드에서 NAME: django 는 데이터베이스 이름을 의미한다. MySQL의 기본 포트는 3306 이다.

 

 

2.  Mysql 설치 및 WorkBench 사용하기

https://reliablecho-programming.tistory.com/45

 

[django] 2. Mysql 연동과 테이블 생성 + 모델 만들기

장고의 개발 환경이 준비되었다면 이제 데이터베이스를 연동할 순서다. 장고를 설치하면 sqlite3이 자동으로 연동이 되지만 이번 프로젝트에서는 MySQL을 연동하는 작업을 한다. Mysql 연동과 테이

reliablecho-programming.tistory.com

이 링크를 통해 WorkBench를 설치하는 방식을 참 하기 바란다.

 

3.  Nginx 설정 파일

 

자 이제 Django 폴더안에 nginx라는 폴더을 만들어주고 default.conf라는 파일을 하나 생성해주자.

 

default.conf는 Nginx의 동작을 을 설정하는 파일이다.

 

생성한 default.conf에 아래 내용을 붙여넣어주도록 하자.

 

설정에 대한 자세한 내용은 나중에 다루도록 하겠다.

 

만약 아직 Nginx 즉 WebServer가 어떤 일 하는지 모른다면 아래 포스팅을 참고하자.

https://cocook.tistory.com/87

 

[Web] WAS와 Web Server 차이

3줄 정리 1. 웹서버는 정적페이지, WAS는 동적페이지 응답 2. 둘다 함께 배포하는 이유는 각자 잘하는 걸 하기 위함 3. 장고는 꼭 Webserver와 배포하자 장고 배포와 관련된 글을 보면 WS(Web Server, 웹서

cocook.tistory.com

upstream testdocker {
  server web:8000;
}

server {
 
  client_max_body_size 16M;
 
  # static 파일을 제공해야할 경우
  #location /static/ {
  #  autoindex on;
  #  alias /code/staticfiles/;
  #}
 
  # media 파일 제공
  #location /media/ {
  #  autoindex on;
  #  alias /code/media/;
  #}
 
  # 프록시 설정, nginx 뒤에 WAS가 있을 경우
  location / {
    proxy_pass http://testdocker/;
  }

  # 포트 설정
  listen 80;
  server_name localhost;
}

 

static 파일 관련한 내용은 다음 포스팅때 언급 하겠다.

우선 위 사진과 같이 설정 파일을 만들어주자.

 

4. DockerFile 작성하기

Django 라는 폴더 밑에 DockerFile를 만들어주자.

 

# 아래 적힌 이미지를 베이스 이미지로 한다.
FROM python:3.8
ENV PYTHONUNBUFFERED 1

# 업데이트 진행 및 vim 설치
RUN apt-get -y update
RUN apt-get -y install vim

# /srv/code 디렉터리를 만든다.
RUN mkdir /srv/code

# 모든 파일들을 /srv/code 에 넣는다.
ADD . /srv/code

# /srv/code 에서 작동 한다.

WORKDIR /srv/code

#/srv/code 에 requirements.txt 파일을 넣어준다.
ADD requirements.txt /srv/code/

# pip 업그레이드
RUN python3 -m pip install --upgrade pip

# requirements.txt를 설치 한다.
RUN pip install -r requirements.txt


# start.sh 실행 권한을 준다.
RUN ["chmod", "+x", "start.sh"]

# start.sh 실행
ENTRYPOINT ["sh","./start.sh"]

위와 같이 파일내용을 채워주면 된다.

이제 위에 나온 start.sh를 만들어주자

 

start.sh 또한 같은 위치에 생성해주면 된다.

 

#!/bin/sh

echo "==> Migration 파일 생성"
yes | python manage.py makemigrations --settings=프로젝트이름.settings

echo "==> Migrate 실행"
python manage.py migrate --settings=프로젝트이름.settings --fake-initial

echo "==> 패키지 다운로드"
pip install -r /srv/code/requirements.txt

echo "==> 배포!"
gunicorn -b 0.0.0.0:8000 --env DJANGO_SETTINGS_MODULE=프로젝트이름.settings drfproject.wsgi:application

 

5.docker-compose.yml 작성하기

 

필자 기준으로 말하면 Django 폴더가 있는 디렉토리에 docker-compose.yml 파일을 생성한다.

version: "3"

services:
  nginx: #nginx라는 이름으로 container 실행
    image: nginx:latest #베이스 이미지가 nginx:latest
    ports: #해당 컨테이너의 포트를 호스트(배포할 서버) 포트와 연결
      - "80:80"
     #컨테이너 디렉토리와 호스트 디렉토리를 연결 시켜준다.
    volumes:
      - ./DJANGO/nginx:/etc/nginx/conf.d #niginx 설정파일이 있는 위치
   
    depends_on: #컨테이너 의존관계를 의미한다.
      - web #아래 적혀있음
  db:
    image: mysql # 베이스이미지가 mysql
    container_name: main.mysql # 컨테이너 이름
    restart: always
    command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci --default-authentication-plugin=mysql_native_password
    environment:
      MYSQL_ROOT_PASSWORD: "0000"
      MYSQL_DATABASE: "django"
      MYSQL_USER: "django"
      MYSQL_PASSWORD: "django"
    ports:
        - "7001:3306"
  web:
    build: ./DJANGO
    container_name: main.django
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - ./DJANGO:/srv/code
    ports:
      - "7003:8000"
    depends_on:
      - db

 

6.배포 하기

 

먼저 깃허브에 repository를 만들어주고 깃허브에 올린 후 배포할 서버에서 pull 해주도록 하겠다.

배포할 서버는 AWS EC2를 사용할 것이고 EC2 인스턴스를 여는 과정과 github에 올리는 방법은 다른 분들의 글을 참고하길 바란다.

https://mine-it-record.tistory.com/115

 

[AWS]아마존 웹 서비스_EC2 인스턴스 시작하기

AWS의 EC2 인스턴스를 시작해보자 회원가입과 로그인 절차는 이미 다 해놨다는 가정하에 진행해도록 한다. EC2가 무엇일까...? 라는 설명에 대해서도 각설한다. AWS Management Console 위 URL로 들어가 로

mine-it-record.tistory.com

 

서버를 열었으면 아래 명령어들을 통해 docker, git 등을 받아주고 작성한 코드를 깃허브에서 당겨오자. 아래 깃허브에서 clone해서 사용해도 된다.

 

EC2 콘솔 창을 열어 아래와 같이 명령어를 입력한다. (참고로 필자는 우분투을 선택했다.)

sudo apt update
sudo apt install -y docker git

sudo systemctl enable docker.service
sudo systemctl start docker.service
sudo systemctl status docker.service

#docker-compose 다운로드
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
#권한 변경
sudo chmod +x /usr/local/bin/docker-compose
#심볼릭 링크 생성
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

git clone 본인 깃허브 주소
cd 본인 레퍼지토리 이름

 

마지막 명령어 sudo docker-compose up -d 으로 백그라운드로 실행시켜주자

 

실행 되었다면 공개주소로 이동하면 짠하고 배포 성공이다.

 

1. static 파일이 깨져 있을 것이다. 이건 나중에 포스팅으로 말씀 드릴 예정이다.

 

728x90