본문 바로가기
App Programming/AWS

[AWS] 도커 컨테이너 배포

by goatlab 2024. 6. 11.
728x90
반응형
SMALL

파일 구조 확인

 

mv flaskapp myapp
mkdir flaskapp
mv myapp flaskapp
sudo apt install tree
tree ./

 

라이브러리 버전 확인

 

pyenv activate py3_11_9
pip list | grep -E 'scikit-learn|Flask|gunicorn|psycopg2'

 

requirements 작성

 

flaskapp 디렉토리에서 requirements를 작성한다.

 

vim requirements.txt
scikit-learn==1.5.0
flask==3.0.3
psycopg2==2.9.9

 

Dockerfile 파일 생성

 

마찬가지로, flaskapp 디렉토리에서 Dockerfile를 생성한다.

 

 vim Dockerfile
FROM python:3.11.9

WORKDIR /usr/src/app

COPY . .

RUN python -m pip install --upgrade pip
RUN pip install -r requirements.txt

WORKDIR ./myapp

CMD python main.py

EXPOSE 5000

 

docker0 IP 주소 확인

 

ifconfig

 

host 값을 docker0 IP로 변경한다.

 

vim main.py
import numpy as np
from sklearn.linear_model import LinearRegression
import psycopg2
from flask import Flask, request, jsonify

app = Flask(__name__)
np.random.seed(0)

X = np.random.rand(10, 1)
y = 2 * X + 1 + 0.1 * np.random.randn(10, 1)
model = LinearRegression()
model.fit(X, y)

@app.route('/')
def welcome():
    return 'HELLO, ML API SERVER'

@app.route('/predict', methods=['POST'])
def predict():
    data = request.json
    new_X = data['input']
    new_X_val = float(new_X[0])
    input_X = np.array(new_X_val).reshape(1, -1)
    y_pred = model.predict(input_X)
    y_pred_list = y_pred.tolist()
    y_pred_val = round(y_pred_list[0][0], 5)
    conn = psycopg2.connect(dbname='ml', user='postgres', password='postgres', host='172.17.0.1', port=5432)
    cur = conn.cursor()
    query = "INSERT INTO pred_result (input, output) VALUES (%s, %s)"
    values = (new_X_val, y_pred_val)
    cur.execute(query, values)
    conn.commit()
    cur.close()
    conn.close()
    res = jsonify({'input': new_X_val, 'predicted_output': y_pred_val})
    return res

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

 

도커 이미지 빌드

 

 docker image build . -t flaskapi01

docker image ls

 

인바운드 규칙

 

 

컨테이너 실행

 

 docker container run -d -p 80:5000 flaskapi01

 

"Error starting userland proxy: listen tcp4 0.0.0.0:80: bind: address already in use." 에러 발생시 포트가 할당된 것을 확인하여 kill을 수행한다.

 

sudo lsof -i :80
sudo kill -9 PID

 

cmd에서 API 요청을 테스트한다.

 

# window
curl -d "{""input"":[""0.6""]}" -H "Content-Type: application/json" -X POST http://퍼블릭 IP/predict

# mac
curl -d '{"input":["0.6"]}' -H "Content-Type: application/json" -X POST http://퍼블릭 IP/predict
728x90
반응형
LIST

'App Programming > AWS' 카테고리의 다른 글

[AWS] 도커 컴포즈 배포  (0) 2024.06.11
[AWS] 도커 컨테이너 nginx 배포  (0) 2024.06.11
[AWS] Flask에 PostgreSQL 적용  (0) 2024.05.31
[AWS] PostgreSQL 설치  (0) 2024.05.31
[AWS] 도커 설치  (0) 2024.05.30