<postgresql>
- 오픈 소스 데이터베이스
- 무료 사용 가능
- 장고에서는 기본 데이터베이스로 postgresql 사용을 권장함
- 원하는 docker 이미지 찾기
- 이전 강의에 썼던 파일 백업하기
$ mkdir backup
$ sudo mv ./* ./backup/
그냥 다 지우고 싶은 경우
sudo rm -rf ./*
- 이전 강의에 썼던 컨테이너 정리하기
sudo docker rm -f 컨테이너ID
$ sudo docker volume prune # 사용하지 않는 볼륨 삭제
$ sudo docker system prune -a # 사용되지 않는 모든 것들 삭제
- 컨테이너 생성
docker-compose.yml
vi docker-compose.yml
version: '3.8'
volumes:
postgres: {} # postgresql에서 사용 할 볼륨 지정
services:
postgres:
container_name: postgres
image: postgres:14.5
volumes:
- postgres:/var/lib/postgresql/data/
environment: # postgresql 컨테이너에서 사용할 환경변수 지정해주기
- POSTGRES_USER=user # 데이터베이스 사용자 지정
- POSTGRES_PASSWORD=P@ssw0rd # 사용자 비밀번호 지정
- POSTGRES_DB=django # 데이터베이스 이름 지정
restart: always
컨테이너가 잘 생성됐는지 확인하기
- 컨테이너 빌드 & 실행
sudo docker compose up --build -d
- 로그 확인
sudo docker compose logs
<gunicorn>
- gunicorn이란?
- 장고 프로젝트를 실행할 때 사용되는 runserver랑 같음 = 배포용 런서버
- 런서버는 개발용이라 장고 공식 문서에서는 런서버를 배포용으로 사용하지 말 것을 권장함
- 런서버는 싱글 스레드에서 동작하지만 gunicorn은 멀티 스레드로 동작하도록 설정 가능함 -> 더 많은 요청을 효율적으로 처리할 수 있음
- 런서버에 비해 속도, 안정성 측면에서 더 좋음
- 장고 프로젝트 컨테이너 생성
소스코드 다운받기
$ mkdir backend # 백엔드 폴더 생성
$ cd backend/ # 백엔드 폴더로 이동(여기서 계속 작업 예정)
$ git clone git@github.com:goodminjeong/drf_project.git ./django # 프로젝트를 현재 경로의 django 폴더에 클론하겠다
장고 프로젝트 배포하기 전 설정할 것들
- backend 폴더에서 명령어 입력할 것
- settings.py
~/backend$ vi django/drf_project/settings.py
ALLOWED_HOSTS = ['*']
STATIC_ROOT = BASE_DIR / "static"
# 이미 이렇게 설정되어 있으면 안 바꿔도 됨
- timezone
sudo ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
backend/Dockerfile
- backed 폴더에 만들어주기
~/backend$ vi Dockerfile
# python 3.11.3버전 이미지를 사용해 빌드(프로젝트 개발 시 사용한 파이썬 버전이랑 최대한 맞추기)
FROM python:3.11.3
# .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
# gunicorn을 사용하기 위한 패키지 설치
RUN pip install gunicorn
docker-compose.yml
- ubuntu 폴더에 만들어주기
vi docker-compose.yml
- 이전에 작성된 거 지우기(커서를 맨 윗 줄에 두고 숫자dd 하면 숫자 줄만큼 지워짐)
version: '3.8'
services:
backend:
container_name: backend
build: ./backend/
entrypoint: sh -c "python manage.py collectstatic --no-input && python manage.py migrate && gunicorn drf_project.wsgi --workers=5 -b 0.0.0.0:8000"
ports:
- 80:8000
volumes:
- ./backend/django/:/app/
- /etc/localtime:/etc/localtime:ro # host의 timezone 설정을 컨테이너에 적용
# ro 은 읽기 전용(read only) 속성으로 볼륨을 설정하는 것을 의미함
restart: always
entrypoint 명령어 파헤치기
- sh -c : 컨테이너에서 뒤에 작성한 명령어를 실행시킬 수 있도록 함
- && : 특정 명령어를 실행한 이후 다음 명령어를 실행시킴
- python manage.py collectstatic --no-input : 배포를 위해 static 파일을 모아줌
- python manage.py migrate : 장고에 연결된 db를 migrate 해줌
- gunicorn project_name.wsgi --workers=5 -b 0.0.0.0:8000 : gunicorn을 사용해 장고 프로젝트를 실행시킴
- project_name : 프로젝트 이름 = setting.py 파일이 들어있는 폴더명
- --workers=5 : 장고를 실행시킬 process 개수 입력. 일반적으로 cpu 코어 개수 * 2 +1만큼 지정함
- -b 0.0.0.0:8000 : 8000번 포트로 실행시킴
컨테이너가 잘 작동되는지 확인하기
- 컨테이너 빌드 & 실행
sudo docker compose up --build -d
- 로그 확인
sudo docker compose logs
- 웹브라우저에서 접속해보기
<nginx>
- nginx란?
- client의 request 요청을 처리해주는 web server
- reverse proxy, 로드밸런싱, 캐싱 등의 기능 지원
- client의 요청을 nginx가 받은 후 service(django) 데이터를 넘겨주는 역할을 함
- nginx를 쓰면 로드밸런싱을 통해 트래픽 분산이 가능함
- SSL 기능을 사용해서 데이터를 더 안전하게 전달할 수 있음
- reverse proxy 기능을 통해 client에서 서버에 직접적으로 접근하는 걸 막아줌
- 콘텐츠를 캐싱해서 동일한 요청에 대해 더 빠른 속도로 처리할 수 있음
- 컨테이너 만들기
docker-compose.yml
version: '3.8'
services:
nginx:
container_name : nginx
image: nginx:1.23.2
ports:
- "80:80" # http 포트포워딩
- "443:443" # https 포트포워딩
restart: always
컨테이너가 잘 동작하는지 확인하기
- 컨테이너 빌드 & 실행
sudo docker compose up --build -d
- 로그 확인
sudo docker compose logs
- 웹브라우저에서 접속해보기