티스토리 뷰
□ 회사 사내 플랫폼이 K8S 기반으로 되어있는데, Flask 기반 APP을 올려야해서 K8S 올리기 전 docker로 먼저 테스트를 진행할겸 Flask 기반 API 서버를 docker image화해 build하여 container로 띄워보는 방법을 공유하고자 합니다. 구성파일은 간단합니다. 소스코드가 들어가있는 app.py / docker build를 위해 Dockerfile / python library 패키지를 관리하는 requirements.txt 이며, tree 구조로 표현하면 다음과 같습니다.
.
├── app.py
├── Dockerfile
└── requirements.txt
0 directories, 3 files
□ app.py
▶ 5000 port로 실행하며 parmas 값 msg, file을 받아 화면에 json 형태로 출력하는 간단한 소스코드입니다.
#flask
from flask import Flask
app = Flask(__name__)
@app.route("/predict", methods=["GET","POST"])
def predict():
data = {"success": False}
# get the request parameters
params = flask.request.json
if (params == None):
params = flask.request.args
# if parameters are found, echo the msg parameter
if (params != None):
#view & model work
data["data"] = params.get("msg")
data["file_name"] = params.get("file")
data["success"] = True
return flask.jsonify(data)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=int("5000"), debug=True)
□ Dockerfile
▶ 각각 명령어의 대한 설명은 아래 주석으로 상세하게 적어놓았습니다.
# 파이썬 이미지를 기반으로 함
FROM python:3.7-slim
# Docker 이미지 내부에서 RUN, CMD, ENTRYPOINT의 명령이 실행될 디렉토리를 설정 (작업 폴더 설정)
WORKDIR /app
# 현재 디렉터리에 있는 파일들을 이미지 내부 /app 디렉터리에 복사함
COPY . /app
# requirements.txt 파일을 기반으로 파이썬 패키지들을 실행함
RUN pip install -r requirements.txt
# 80포트를 외부로 노출함
EXPOSE 5000
# 환경변수를 설정함
ENV NAME World
# 쉘을 사용하지 않고 컨테이너가 시작되었을 때 아래 명령을 실행함 'python app.py'가 실행
CMD ["python", "app.py"]
□ requirements.txt
requests
flask
□ docker build
▶ 현재 NBP VM을 하나 생성하여 진행하였으며, 서버에 docker가 설치되어 있다는 가정하의 아래 과정을 진행하시면 됩니다.
sudo docker build -t flask_api_test:1.0 .
■ flask_api_test라는 이름으로 현재 디렉토리를 빌드하는 명령어 입니다.
■ 마지막에 '.' 현재 디렉토리라는것을 명시합니다.
■ docker build -t <이미지이름>:<태그><경로> 형식입니다.
■ tag를 생략할 경우 자동으로 lastest 가 붙습니다.
■ -t 옵션: 이미지 명칭과 tag를 지정하는 옵션입니다.
□ docker image 확인
▶ 위의 docker build를 하게되면 아래처럼 이미지가 정상적으로 생성됩니다.
[hskim@hskim-docker-test docker-flask-tutorial]$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
flask_api_test 1.0 30d6d0721668 12 seconds ago 169MB
python 3.7-slim 87b1022604d5 13 days ago 155MB
□ docker image 실행
▶ 위의 app.py에서 Flask port가 5000번 / 외부 포트 80과 연결하겠다는 의미입니다.
▶ 현재 NBP 사용하고 있으므로 80 Port Open을 해야합니다.
sudo docker run -p 80:5000 flask_api_test:1.0
□ 확인
▶ 서버 즉, VM에 도메인을 사용하지 않고 공인아이피를 사용했으므로 아래와 같이 외부에서 TEST를 진행할 수 있습니다.
http://공인아이피/predict?msg=test1&file=test2
▶ 서버 로그도 정상적으로 찍히는걸 볼 수 있습니다.
[hskim@hskim-docker-test docker-flask-tutorial]$ sudo docker run -p 80:5000 flask_api_test:1.0
* Serving Flask app "app" (lazy loading)
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: on
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 141-676-146
1.1.1.1 - - [03/Jun/2020 05:05:40] "GET /predict?msg=test1&file=test2 HTTP/1.1" 200 -
'DevOps' 카테고리의 다른 글
[GCP] 메타데이터 / SSH 접속 (0) | 2020.10.31 |
---|---|
[NBP] K8S Dashboard(ingress) 구성 (0) | 2020.10.30 |
Docker UUID Error (0) | 2020.06.15 |
Spring boot Thread Pools 에러 (0) | 2020.06.03 |
[NBP Cloud] jupyterhub install (1) | 2020.05.27 |