안녕하세요🙏 개발자 재민콩입니다.
오늘은 Docker를 활용한 Django + Postgresql + nginx 로컬 서버 세팅을 진행해 보겠습니다.
이전 포스트인 Django Rest framework API 개발을 먼저 해보시면 이어서 진행할 수 있습니다👍
[Django] REST framework + Postgresql API 개발
[Django] REST framework + Postgresql API 개발
안녕하세요🙏 개발자 재민콩 입니다. 오늘은 Python Django REST framework를 활용한 API 개발을 진행해 보겠습니다. 데이터베이스는 Postgresql을 사용했습니다. 먼저 해야 할 일들을 정리해 보겠습니다. c
jmbean.tistory.com
먼저 해야 할 일들을 정리해 보겠습니다.
- conda python 가상환경 설정
- docker 설치
- docker-compose command
- docker 파일 추가
- 서비스 빌드
- 컨테이너 생성 및 시작
1. conda python 가상환경 설정
// conda 가상 개발환경에 접속
$ conda activate api
// 파이썬 웹 서버 게이트웨이 인터페이스(WSGI) HTTP 서버이고, nginx와 같이 사용
$ pip install gunicorn
2. docker 설치
Home - Docker
Learn how Atomist will help Docker meet the challenge of securing secure software supply chains for development teams.
www.docker.com
3. docker-compose command
docker에서 자주 사용하는 docker-compose 명령어입니다.
build | 서비스 구축 또는 재구축 |
up | 컨테이너 생성 및 시작(-d 를 사용하여 주로 백그라운드에서 실행) |
down | 컨테이너, 네트워크 중지 및 제거 |
rm | 중지된 서비스 컨테이너 제거 |
ps | 현재 동작 중인 컨테이너 목록 |
exec | 실행 중인 컨테이너에서 명령을 실행 |
4. docker 파일 추가
- docker-compose.yml
- Dockerfile
- nginx.conf
먼저 제일 root directory 경로에 docker-compose.yml 파일을 생성합니다.
version: '1'
services:
web:
image: web
# 해당 서비스의 이미지를 빌드하기 위한 경로 지정
build:
context: .
dockerfile: ./api/Dockerfile
# 볼륨 설정을 위해 쓰임
# 마운트(mount)가 필요한 호스트의 경로와 컨테이너의 경로를 명시해줌
volumes:
- ./api:/app
working_dir: /app
expose:
- 8000
# 서비스 간 의존 관계를 지정하기 위해서 사용
# 웹 애플리케이션이 올라오기 전 데이터베이스가 먼저 올라오도록 설정함
depends_on:
- db
command: bash -c "
python manage.py migrate &&
gunicorn api.wsgi:application --bind 0.0.0.0:8000"
db:
image: postgres:14.5
volumes:
- /usr/local/var/postgres:/var/lib/postgresql/data
# 기존에 백업해둔 data가 있을경우 경로 연결
- ./api/data:/var/lib/postgresql/dump
ports:
- "5432:5432"
nginx:
image: nginx:latest
volumes:
- ./api/static:/static
- ./nginx:/etc/nginx/conf.d
ports:
- 80:80
depends_on:
- web
django 프로젝트 안쪽에 Dockerfile 생성
From python:3.8.13
ENV PYTHONUNBUFFERED=0
WORKDIR /app
ADD ./api/requirements.txt /app/
#ADD ./entrypoint.sh /app/
COPY ./api/api /app/api
RUN apt-get update && apt-get -y dist-upgrade
RUN apt install -y netcat
RUN pip install --upgrade pip \
&& pip install -r requirements.txt
ADD ./api/static /app/static
WORKDIR /app/static
# Replace shell with bash so we can source files
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
# make sure apt is up to date
RUN apt-get update --fix-missing
RUN apt-get install -y curl
RUN apt-get install -y build-essential libssl-dev
WORKDIR /app
먼저 제일 root directory 경로에 nginx 폴더 생성 후 그 안쪽에 nginx.conf 생성
upstream web {
server web:8000;
}
server {
listen 80;
location / {
proxy_pass http://web;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
proxy_redirect off;
}
location /static/ {
alias /static/;
}
}
5. 서비스 빌드
docker app를 실행하고 docker 계정으로 로그인 한 뒤 build를 진행합니다.
Dockerfile 파일에 있는 내용으로 서비스를 구축합니다.
$ docker-compose build
6. 컨테이너 생성 및 시작
$ docker-compose up -d
// db, nginx, web 모두 running 중인지 확인합니다.
$ docker-compose ps
이제 주소창에 localhost 으로 접속하여 확인합니다. 저는 django api를 사용하였으므로 localhost/admin으로 접속합니다.
접속은 잘 됐지만 Django로 Postgresql superuser를 생성해야 합니다.
docker-compose exec를 통해 web의 working directory에 접근할 수 있습니다.
$ docker-compose exec web python manage.py createsuperuser
추가로 로컬에 백업해둔 기존 Postgresql을 import 하려면 docker 내부로 접근한 뒤 백업해둔 sql 파일을 실행하면 됩니다.
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
94491557a119 nginx:latest "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 0.0.0.0:80->80/tcp api-nginx-1
37ef6b66a487 web "bash -c ' python ma…" 8 minutes ago Up 8 minutes 8000/tcp api-web-1
1727ad79d0ac postgres:14.5 "docker-entrypoint.s…" 8 minutes ago Up 8 minutes 0.0.0.0:5432->5432/tcp api-db-1
$ docker exec -it 1727ad79d0ac /bin/bash
// docker-compose.yml 에서 volumes에서 연결해둔 경로 사용
$ psql -U [username] < /var/lib/postgresql/dump/backup.sql
여기까지 완료하면 Django + Postgresql + nginx 로컬 서버 세팅이 완료됐습니다👊