Docker를 이용한 Flask + nginx + uWSGI 환경 구축하기.

이번에는 Ubuntu에서 Docker를 이용해서 간단한 Python 웹 서버 환경을 구축해보도록하겠습니다.

도커를 설치하지않으셨다면 Ubuntu 20.04 Docker 설치하기. 글을 참조해서 설치 해주시면 되겠습니다.

아무래도 Docker로 이용해서 웹 서버환경을 구축하게되면 얻는 이점은 image or 컨테이너를 어디에서나 사용할 수 있도록 만든다는점에서 좋을것 같습니다.

Flask + nginx + uWSGI + MariaDB

Ubuntu에 서비스로 다 올릴수도있지만 이런걸 편하게 하기위해 도커를 사용하는것이기 때문에 개념만 잘 알고계시면 됩니다.

Flask : RESTful API를 빌드하기위한 최소한의 Python 프레임 워크입니다. 사용하기 쉽지만 Flask의 내장 서버는 기본적으로 한 번에 하나의 요청 만 제공합니다. 따라서프로덕션 배포에 자체적으로 적합하지 않습니다 .

nginx :로드 밸런싱, SSL 구성 등과 같은 이점을 제공하는 매우 안정적인 웹 서버

uWSGI : 여러 작업자가 한 번에 여러 요청을 처리하도록 포크 할 수있는 고도로 구성 가능한 WSGI 서버 (웹 서버 게이트웨이 인터페이스).

출처 : https://hackernoon.com/a-guide-to-scaling-machine-learning-models-in-production-aa8831163846

Docker Image

앞서 말씀드린 서비스들의 이미지를 하나씩 사용하게 되면 이미지가 4개나 필요하게 됩니다.
하지만 hub.docker.com에는 이미 잘 정리된 이미지가 있기때문에 이 포스팅에서는 만들어진 이미지를 사용하도록 하겠습니다.

각 이미지에대한 상세한 설명은 이미지별 링크에서 자세한 사용법을 확인하실 수 있습니다.

1개의 웹서버 이미지 – https://hub.docker.com/r/tiangolo/uwsgi-nginx-flask


1개의 공식 DB 이미지를 사용해서 구축하겠습니다.
https://hub.docker.com/_/mariadb

한번씩은 다 보셨다 생각하고 진행하겠습니다 ㅎㅎ

Docker Image 생성하기

간단한 코드로 만들어보겠습니다.

기본적으로 run.py 는 도커이미지에 있기때문에 제외하고
전체적인 파일리스트는 아래와같습니다 pycache는 무시
dalso_docker의 하위폴더에 있는것입니다.

첫번째는 이미지를 합치기위한 dockerfile

dockerfile

FROM 은 받아올 이미지
RUN 은 받아올 이미지에서 실행할 명령어 – 필요한 python 플러그인
ENV 는 환경셋팅 static의 기본경로
WORKDIR 은 실행할 경로입니다.

FROM tiangolo/uwsgi-nginx-flask:python3.8

RUN pip install flask

ENV STATIC_PATH /app/main/static

WORKDIR /app


__init__.py

from flask import Flask, render_template

app = Flask(__name__)
# main service reservation search


@app.route("/")
def main():
    return render_template('main.html')

main.html

출처 : https://github.com/KW-Webproject/petland/tree/master/templates

static

출처 : https://github.com/KW-Webproject/petland/tree/master/static

이제 위 트리의 맨 상위폴더 아래로 가서 아래 명령어를 통해 이미지를 새로 빌드해줍니다.

docker build –network=host -t dalso_flask .

처음 빌드하게되면 위와같이 본 이미지를 받는데 시간이 어느정도 소요되고 portainer를 보면 이미지가 생성된걸 확인할 수 있습니다.

컨테이너 생성

이제 이 이미지를 가지고 컨테이너를 직접 생성해보겠습니다.

docker run --name dalso_web -v /home/dalso/dalso_docker/main:/app/main -e TZ=Asia/Seoul -p 80:80 dalso_flask

옵션은 아래 차근차근 설명드리겠습니다.

–name dalso_web : 컨테이너의 이름입니다
-v /[경로]:/app/main : [경로]는 실제 flask의 소스와 템플릿,static등 위치입니다.
실제 사용될 경로와 컨테이너 내부의 볼륨을 매칭시켜줌으로써 경로안의 파일이 수정되면 컨테이너 내부의 파일도 동시에 수정됩니다
-e TZ=Asia/Seoul : 환경변수로 타임존을 서울로 변경합니다 //해도되고안해도됨
-p 80:80 : host포트와 컨테이너 포트를 매칭시켜줍니다. 호스트의 80번 포트로 통신이 오면 컨테이너의 80번포트로 갑니다.
dalso_flask : 도커를 생성할 이미지이름입니다.

여기서 80번이 web port

이렇게 컨테이너를 생성하고 나면 portainer에서도 확인이 가능합니다.

그리고 80번 포트로 접근하게되면

아래처럼 웹이 완성됩니다.

 

————————————————–

사이트 리뉴얼중입니다~

서버(Linux, ESXi), NAS(헤놀로지, ESXi 및 IT관련 정보, 기타 등등을 공유하는 커뮤니티 SVRFORUM을 새로 만들었습니다.
많은 가입(?) 부탁드립니다~
https://svrforum.com

이전글들은 모두 상단 메뉴의 Blog 글 모음에있습니다!

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

홈서버 IT 커뮤니티 SVRFORUM
Link