TIL(22/11/18)

김규현·2022년 11월 20일
0

📝 오늘 배운 것

  • docker timeattack 테스트

📌 문제

👉 github에서 project를 clone하여 배포하기

# backend 디렉토리 안 django 디렉토리를 생성하여 프로젝트를 담음
git clone https://github.com/sparta-course/221118_timeattack.git ./backend/django

👉 django의 runserver 명령어를 사용해 배포해주세요

1. 먼저 django 프로젝트의 컨테이너에 이미지를 build 하기 위해 Dockerfile부터 작성한다.
(Dockerfile은 django 프로젝트가 위치하는 경로에서 작성! ./backend/Dockerfile)

# python 3.10.8버전 이미지를 사용해 빌드
FROM python:3.10.8

# .pyc 파일을 생성하지 않도록 설정합니다.
ENV PYTHONDONTWRITEBYTECODE 1

# 파이썬 로그가 버퍼링 없이 즉각적으로 출력하도록 설정합니다.
ENV PYTHONUNBUFFERED 1

# /app/ 디렉토리를 생성합니다.
RUN mkdir /app/

# /app/ 경로를 작업 디렉토리로 설정합니다.
WORKDIR /app/

# requirments.txt를 작업 디렉토리(/app/) 경로로 복사합니다.
COPY ./django/requirements.txt .

# 프로젝트 실행에 필요한 패키지들을 설치합니다.
RUN pip install --no-cache-dir -r requirements.txt

2. 컨테이너를 생성하기 위해 docker-compose.yml 작성

version: '3.8'

services:
  backend:
    container_name: backend
    build: ./backend/
    entrypoint: sh -c "python manage.py collectstatic --no-input && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
    ports:
      - '80:8000'
    volumes:
      - ./backend/django/:/app/ # host에 clone한 프로젝트를 컨테이너에 생성한 app 디렉토리로 bind mount
      - /etc/localtime:/etc/localtime:ro 
    restart: always

👉 postgresql을 연동한 후 배포해주세요

1. postgresql을 사용하기 위해 ./backend/Dockerfile에서 psycopg2 추가

# ./backend/Dockerfile

RUN pip install psycopg2

2. postgres 컨테이너를 생성하고, backend(django)와 연동하기 위해 docker-compose.yml 작성

services에 postgres 컨테이너를 추가하고, image는 postgres의 14.5 버전 사용, 데이터가 유실되지 않도록 docker volume 방식으로 volumes에 postgres 볼륨을 생성하고, /var/lib/postgresql/data/경로로 마운트했다.
환경 변수로 user,password를 받아 db를 django에 연결해준다음 db가 먼저 생성되어야 하기 때문에 depends_on으로 postgres를 지정하여 postgres 컨테이너가 먼저 생성되로록 설정

version: '3.8'

volumes:
  postgres: {}

services:
  postgres:
    container_name: postgres
    image: postgres:14.5
    volumes:
      - postgres:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=P@ssw0rd
      - POSTGRES_DB=django
    restart: always

  backend:
    container_name: backend
    build: ./backend/
    entrypoint: sh -c "python manage.py collectstatic --no-input && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
    ports:
      - '80:8000'
    volumes:
      - ./backend/django/:/app/
      - /etc/localtime:/etc/localtime:ro
    environment: # django에서 사용할 설정들을 지정해줍니다.
      - DEBUG=1
      - POSTGRES_DB=django
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=P@ssw0rd
      - POSTGRES_HOST=postgres
      - POSTGRES_PORT=5432
    depends_on:
      - postgres
    restart: always

👉 nginx를 연동한 후 배포해주세요

1. nginx 컨테이너를 생성하기 전 nginx에서 80번 포트로 들어오는 요청을 django 컨테이너로 보내기 위해 nginx 설정파일을 먼저 작성한다.

# ./nginx/default.conf
server {
  listen 80;
  server_name _; # 모든 도메인 혹은 ip로 들어오는 요청에 대해 처리해 줍니다.

  location / { # nginx로 요청이 들어왔을 때
    proxy_pass http://backend:8000/; # backend 컨테이너의 8000번 포트로 전달합니다.
  }

  location /static/ { # 브라우저에서 /static/ 경로로 요청이 들어왔을 때
    alias /static/; # /static/ 경로에 있는 파일들을 보여줍니다.
  }

  location /media/ { # 브라우저에서 /media/ 경로로 요청이 들어왔을 때
    alias /media/; # /media/ 경로에 있는 파일들을 보여줍니다.
  }
}

2. nginx 컨테이너를 생성하고 backend 컨테이너와 연동하기 위해 docker-compose.yml 작성

nginx 1.23.2 버전 이미지를 사용하여 nginx 컨테이너를 생성하고, nginx에서 django의 media와 static을 바로 사용할 수 있도록 bind mount 방식으로 볼륨을 잡아준 다음 nginx의 default.conf에서 들어오는 요청을 backend 컨테이너의 8000번 포트로 전달해주었기 때문에 백엔드 컨테이너에서는 ports를 없애고, nginx 컨테이너에서 80:80 443:443 포트를 추가하여 backend 컨테이너가 생성되고 난 후 생성되도록 depends_on 설정

version: '3.8'

volumes:
  postgres: {}
  django_media: {}
  django_static: {}

services:
  postgres:
    container_name: postgres
    image: postgres:14.5
    volumes:
      - postgres:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=P@ssw0rd
      - POSTGRES_DB=django
    restart: always

  backend:
    container_name: backend
    build: ./backend/
    entrypoint: sh -c "python manage.py collectstatic --no-input && python manage.py migrate && python manage.py runserver 0.0.0.0:8000"
    volumes:
      - ./backend/django/:/app/
      - /etc/localtime:/etc/localtime:ro
      - django_media:/app/media/ # nginx에서 media를 사용할 수 있도록 volume을 지정해줍니다.
      - django_static:/app/static/ # nginx에서 static을 사용할 수 있도록 volume을 지정해줍니다.
    environment: 
      - DEBUG=1
      - POSTGRES_DB=django
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=P@ssw0rd
      - POSTGRES_HOST=postgres
      - POSTGRES_PORT=5432
    depends_on:
      - postgres
    restart: always

  nginx:
    container_name : nginx
    image: nginx:1.23.2
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - django_media:/media/ # django의 media를 사용할 수 있도록 volume을 지정해줍니다.
      - django_static:/static/ # django의 static 사용할 수 있도록 volume을 지정해줍니다.
    depends_on:
      - backend
    restart: always

👉 gunicorn을 사용하여 배포해주세요

1. Dockerfile에 gunicorn을 설치하는 명령어 추가

django 프로젝트에서 runserver 명령어로 서버를 실행하지 않고, gunicorn으로 서버를 실행하기 위해 gunicorn 설치

# ./backend/Dockerfile
RUN pip install psycopg2 gunicorn

2.docker-compose.yml에서 backend 컨테이너의 entrypoint 명령어 수정

python manage.py runserver 명령어를 -> gunicorn 프로젝트이름.wsgi --workers=5 -b 0.0.0.0:8000 으로 수정하여 gunicorn으로 서버를 실행

version: '3.8'

volumes:
  postgres: {}
  django_media: {}
  django_static: {}

services:
  postgres:
    container_name: postgres
    image: postgres:14.5
    volumes:
      - postgres:/var/lib/postgresql/data/
    environment:
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=P@ssw0rd
      - POSTGRES_DB=django
    restart: always

  backend:
    container_name: backend
    build: ./backend/
    entrypoint: sh -c "python manage.py collectstatic --no-input && python manage.py migrate && gunicorn timeattack.wsgi --workers=5 -b 0.0.0.0:8000"
    volumes:
      - ./backend/django/:/app/
      - /etc/localtime:/etc/localtime:ro
      - django_media:/app/media/ # nginx에서 media를 사용할 수 있도록 volume을 지정해줍니다.
      - django_static:/app/static/ # nginx에서 static을 사용할 수 있도록 volume을 지정해줍니다.
    environment: 
      - DEBUG=1
      - POSTGRES_DB=django
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=P@ssw0rd
      - POSTGRES_HOST=postgres
      - POSTGRES_PORT=5432
    depends_on:
      - postgres
    restart: always

  nginx:
    container_name : nginx
    image: nginx:1.23.2
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
      - django_media:/media/ 
      - django_static:/static/ 
    depends_on:
      - backend
    restart: always
profile
웹개발 회고록

0개의 댓글