EC2 Flask서버를 Docker 컨테이너로 동작 시키기

남지방·2024년 1월 12일

Backend/AWS/Platform

목록 보기
1/2

매우 간단하지만, 자주 하게되는 작업이니 명령어를 한번 정리해보고자 한다.
EC2 - Flask로 동작하던 서버를 EC2 - 도커 컨테이너 - Flask로 한 단계 추가하는 방법을 정리했다.
현재 세팅하고자 하는 서버는 AI서비스를 위한 Inference서버 이다.

1. Flask App 코드 작성

EC2위에 바로 동작중인 Flask 서버를 컨테이너로 만들고자 하면, 이미 이러한 코드는 작성되어 있을거다.

'''app.py'''
from flask import Flask, request, jsonify
#import your modules

app = Flask(__name__)

#pre-processing codes

def process(input):
	#main work
    return output

#API 엔드포인트
@app.rout('/app', methods=['POST'])
def run():
	input = request.get_json()
    if '''input is proper :'''
    	return process(input)
	else :
    	return '''error'''

if __name__ == '__main__':
	app.run(host='0.0.0.0', debug=True)

2. 동작확인

컨테이너를 띄우기 이전에 flask서버는 잘 동작하는지 확인해보자.

  • Inference에는 보통 다양한 외부 모듈들이 필요하다 이들을 requirments.txt로 정리해두자
'''requirements.txt'''
torch>=1.9.1
flask
...
  • 이 환경이 정상적으로 동작하는지는 anaconda 환경을 하나 만들어보면 테스트해 볼 수 있다.
(base) $conda create -n tmp_env python==3.8
(base) $conda activate tmp_env
(tmp_env) $pip install -r requirements.txt
  • arguments를 입력 받는 경우를 생각하여, 다음 커맨드를 통해 서버가 동작 하는지 확인하자.
(tmp_env) $python app.py --optionA 5 --optionB ./dir1/dir2/ --optionC True

3. Dockerfile 작성

독립적으로 동작이 가능한 app.py 파일이 포함된 디렉토리에 Dockerfile을 작성해야 한다. 2의 과정을 파일로 옮긴다고 생각하면 된다.

'''Dockerfile'''
FROM python:3.8

# Copy function code
COPY . /app

# Install the function's dependencies using file requirements.txt
# from your project folder.

COPY requirements.txt  .
RUN  pip3 install -r requirements.txt

WORKDIR /app

# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "python","pp.py","--optionA","5","--optionB","./dir1/dir2/","--optionC","True"]

4. 빌드

같은 디렉토리에서 빌드를 한다. 이 과정을 통해 이미지를 만든다.

$docker build -t [image_name] .

잘 빌드 되었다면,

$docker images

를 통해, 빌드한 이미지를 찾아볼 수 있다.

(4-1. 로컬에서 동작시켜 보기)

$docker run -d -p 0.0.0.0:[port]:[port]/tcp --name [container_name] [image_name]

이 커맨드가 성공적으로 동작했다면,

$docker ps

를 통해 컨테이너 상황을 조회해볼 수 있으며, flask 서버가 정상적으로 동작 해야 한다.

5. 도커 이미지 Push & Pull

로컬에서 만든 이미지를 EC2로 옮기자. AWS의 ECR을 사용할 수 있으나, 간단하게는 도커허브를 이용해볼 수 있다.

$docker push [your_docker_id]/[project_name]:[image_version]

이제 Pull 하기 위해서 EC2 위에서 입력한 커맨드 (세팅부터 동작까지)를 나열할텐데, 구체적으로 뭘 하는지 각 줄의 역할이 기억이 안나 다음에 시간날때 정리해보겠다.

sudo apt update
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo usermod -aG docker $USER
newgrp docker
docker login
docker pull [dockerhub_id]/[image_name]:[version]

동작 시키고 싶다면,
go to 4-1.

profile
금쪽같은 ML 모델계의 오은영 박사님을 꿈꿉니다.

0개의 댓글