앞서 장고 컨테이너를 생성하면서 도커파일에 CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"] 를 입력했다.
하지만 django 공식문서에서는 배포환경에서 runserver를 사용하지말라고되어있다. (django는 Web framework 이지, Web server가 아니다.)
Replace runserver to gunicorn command
django container안에 gunicorn을 설치한다. (Gunicorn은 Nginx와 django를 연결시켜주는 인터페이스정도의 역할을 수행한다.)
gunicorn 이란?
gunicorn은 WSGI의 일종이다. 그렇다면 WSGI란 무엇인가? CGI의 일종이다. 그럼 CGI는 무엇인가?
- CGI (Common Gateway Interface)
웹의 역사를 살펴보면 웹은 원래 정적인 정보의 나열이 전부였다. 단순정보의 나열뿐이었던 단방향의 웹은 점점 동적인 웹으로 변화하고 그 과정에서 사용자들의 입력 데이터를 처리할 로직이 필요했다. 이를 처리하기 위해 개발자들은 각자 자신들이 사용하던 언어를 사용했는데 언어가 다르니 규격도 제각각이었다. 하지만 이를 공통적인 형태로 주고받기위해 만든 것이 CGI다.
예를들어 회원가입정보 리스트를 다시 조회하기위해선 html 만으로는 할 수 없다. 서버 내부에서 데이터를 저장하고 조회하는 일련의 기능이 있어야하는데 사용자의 http request가 webserver를 통해 서버내부로 들어오고 CGI를 통해 일관된 형태로 해석되어 응용프로그램에 전달되어 사전에 작성해둔 로직에 따라 다시 html을 그려내어 web server의 http response를 통해 사용자에게 돌아가는 것이다.
- WSGI (Web Server Gateway Interface)
이는 파이썬을 위해 만들어진 것으로 파이썬 스크립트가 웹 서버와 통신하기 위해 만들어진 인터페이스다. 웹서버의 요청을 해석하여 파이썬 응용프로그램에 던지는 역할을 수행한다.
즉, gunicorn 이나 uWSGI는 nginx나 Apache같은 웹서버로 들어오는 HttpRequest를 Python이 이해할 수 있게 던져주는 역할을 한다고 보면 될 것이다.
1. Gunicorn library 설치
pip install gunicorn
2. pip freeze > requirements.txt
3. requirements.txt git push
4. Dockerfile
FROM python:3.9.0 //파이썬이 깔려진 환경을 베이스 이미지로 할 것임
WORKDIR /home/
RUN git clone [github address]
WORKDIR /home/[깃헙클론하면서 생긴 폴더]/
RUN pip install -r requirements.txt //이 파일안의 모든거 설치
RUN pip install gunicorn
RUN echo "씨크릿키 써주기" > .env // 실행을 위해 임시로 써준다. 추후 해결할 것
RUN python manage.py migrate //migrate를 통해 DB와 연동
EXPOSE 8000 //8000 포트 노출시켜 통신할 수 있도록
CMD ["gunicorn", "[어떤프로젝트에서 가져올지].wsgi", "--bind", "0.0.0.0:8000"]
5. Docker Image 생성
6. Create Container
생성후 확인해보면 결과물이 나타나긴하지만 망가져있다 (base.css 등 static file들을 가져오지 못한다.)
해결을 위해 앞단에 Nginx를 연결해줄 것이다.
'웹 프로그래밍' 카테고리의 다른 글
[배포해보기 (9)] Static 의 이해 (0) | 2021.06.29 |
---|---|
[배포해보기 (8)] Docker Network의 이해 및 구현 (0) | 2021.06.28 |
[배포해보기 (6)] Django container 생성 (0) | 2021.06.27 |
[배포해보기 (4)] Port의 이해, Nginx 컨테이너 생성 (0) | 2021.06.27 |
[배포해보기 (3)] Portainer로 Docker Container를 GUI로 생성하기 (0) | 2021.06.21 |