티스토리 뷰

DevOps

[NBP] Python Flask API docker image build

김한성 2020. 8. 19. 01:40

□ 회사 사내 플랫폼이 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
댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31