Docker compose로 Nginx + Flask(uwsgi로 실행) 환경을 배포하는 방법을 정리합니다.
전체소스 : https://github.com/kjcaway/nginx_flask_test
먼저 패키지 구조는 아래와 같습니다.
├── 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 배포 환경 구성하였으니 이제 개발만 하면 되겠으무니다...ㅋ
'개발 이야기 > Python' 카테고리의 다른 글
Selenium 네이버 로그인 + Beautifulsoup 나의 메일 리스트 (1) | 2019.08.04 |
---|---|
Python으로 웹 크롤링(Crawling ) (0) | 2019.07.19 |
Python Script 작성시 argument 여러개 받기 (0) | 2019.07.16 |
Selenium으로 웹브라우저 테스트 자동화 (1) | 2019.03.16 |
Python_bson을 json으로 바꾸는 방법 (0) | 2019.02.14 |