본문 바로가기
개발 이야기/Python

Docker compose로 Nginx + Flask + uwsgi 배포

by 농개 2019. 10. 19.

Docker compose로 Nginx + Flask(uwsgi로 실행) 환경을 배포하는 방법을 정리합니다.

전체소스 : https://github.com/kjcaway/nginx_flask_test

 

kjcaway/nginx_flask_test

nginx + flask docker compose test. Contribute to kjcaway/nginx_flask_test development by creating an account on GitHub.

github.com

 

먼저 패키지 구조는 아래와 같습니다.

├── docker-compose.yml
├── flask
│   ├── Dockerfile
│   ├── src
│   │   ├── run.py
│   │   └── webapp
│   │       ├── __init__.py
│   │       └── main.py
│   └── uwsgi.ini
├── nginx
│   ├── Dockerfile
│   └── default.conf

flask와 nginx 각각 따로 구성 했습니다. 

 

01. Flask 도커 이미지 작성

./flask/src/run.py 와 ./flask/src/webapp/main.py 

## run.py
from webapp import app

if __name__ == '__main__':
  app.run(host='0.0.0.0', port=5000)


## main.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return "Hello World!"

간단하게 결과만 확인 할 용도로 작성해봤습니다.

 

그리고 아래와 같이 uwsgi.ini 파일을 작성해주세요. 

[uwsgi]
chdir=/www/src
socket=:5000
wsgi-file=/www/src/run.py
callable=app
master=true
processes=4
threads=2

여러 옵션이 있는데... 중요한건 wsgi-file을 flask app 진입점인 run.py로 설정했고(경로가 저런건 Dockerfile을 참조)

callable 모듈을 webapp에서 가져온 app으로 설정했습니다.

socket:5000으로 설정했습니다. (만약 nginx와 같이 배포하지 않는다면 http-socket으로 변경해주면 되겠습니다)

 

 

그리고 Dockerfile을 작성합시다.

FROM python:3.5

ADD . /www
WORKDIR /www

RUN python -m pip install --upgrade pip 
RUN pip3 install Flask
RUN pip3 install uwsgi

CMD uwsgi uwsgi.ini

docker hub를 통해 python 3.5 이미지를 가져와서 특정 경로에 소스파일을 추가하고

pip3을 통해 필요한 패키지를 설치 했습니다. 그리고 uwsgi 실행.

 

 

그리고 이미지를 빌드해봅시다.

## Dockerfile이 있는 경로에서...
> docker build -t flask:test .

 

 

02. Nginx 이미지 작성

default.conf를 아래와 같이 작성했습니다.

upstream flask_uwsgi {
    server flask:5000;           // flask는 container 명
}

server {
    listen 80;
    server_name 127.0.0.1;

    location / {
      include uwsgi_params;
      uwsgi_pass flask_uwsgi;		// http://127.0.0.1 로 요청시 flask 컨테이너로 proxy pass
    }

}

그리고 Dockerfile을 작성해줍니다.

FROM nginx:1.17.4

COPY default.conf /etc/nginx/conf.d/default.conf

CMD ["nginx", "-g", "daemon off;"]

마찬가지로 Dockerfile이 있는 경로에서 이미지 빌드.

> docker build -t nginx:test .

 

03. Docker compose 파일 작성

version: '3'
services:
  flask:
      container_name: flask
      image: "flask:test"
      ports:
       - "5000:5000"
      networks:
      - backend
  nginx:
      container_name: nginx
      image: "nginx:test"
      ports:
       - "80:80"
      networks:
       - backend

networks:
  backend:
    driver: bridge

 

실행 해봅시다.

> docker-compose up
Creating network "nginx_flask_test_backend" with driver "bridge"
Creating flask ... done
Creating nginx ... done
Attaching to nginx, flask
flask    | [uWSGI] getting INI configuration from uwsgi.ini
flask    | *** Starting uWSGI 2.0.18 (64bit) on [Sat Oct 19 07:42:18 2019] ***
flask    | compiled with version: 8.3.0 on 19 October 2019 05:11:53
...(중략)



> docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
182057a7f921        nginx:test          "nginx -g 'daemon of…"   4 minutes ago       Up 4 minutes        0.0.0.0:80->80/tcp       nginx
6984ed41d699        flask:test          "/bin/sh -c 'uwsgi u…"   4 minutes ago       Up 4 minutes        0.0.0.0:5000->5000/tcp   flask

 

 

그리고 웹 화면에서 url으로 요청해봅시다.

잘 되네요.

 

uwsgi 설정..

nginx 설정..

구글링해보면 이것저것 너무 다른게 많아서 몇시간 삽질 했네요...ㅜ

Docker stack 배포 환경 구성하였으니 이제 개발만 하면 되겠으무니다...ㅋ