venv & docker setting for Flask API

venv

여러 프로젝트를 하나의 장비에서 실행할때 각 프로젝트마다 사용하는 패키지들의 버젼이 달라서 충돌이 생길수 있는데 그런 일을 미연에 방지하기 위해서 각 프로젝트 마다 virtual environment, venv를 설정하고 충돌없이 사용할수 있도록합니다. 아래 명령어를 통해서 venv를 하나 생성해주세요.

$ python3 -m venv ./venv

그러면 venv폴더에 독립된 개발환경이 저장이 됩니다. 생성만 한다고 해서 바로 실행되는건 아니에요. 아래 명령어로 활성화를 시켜줍니다.

$ source ./venv/bin/activate

그러면 프롬프트 앞에 (venv)라고 뜰거에요. 이제 이 상태에서 개발 진행하시고 venv를 비활성화 시키고 싶으시면 deactivate명령어로 venv에서 빠져나오시면 됩니다.

(venv) $ deactivate

Flask

이제 해당 venv에 Flask를 설치해보도록 하겠습니다.

pip install Flask

버젼을 확인해볼까요?

$ Flask --version
Python 3.13.0
Flask 3.0.3
Werkzeug 3.1.3

Docker

우선 Flask App을 하나 만들어서 app.py로 저장합니다.

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, World!"

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

requirements.txt라는 파일을 만들어서 그안에 아래와 같이 저장합니다.

Flask==3.0.3

Dockerfile이라는 파일을 만들어서 아래와 같이 명령을 나열합니다.

FROM python:3-slim-buster

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["flask", "run", "--host=0.0.0.0"]

Command line에 아래의 명령어를 입력해서 Docker Image를 build합니다.

(venv)$ docker build -t cms .

Docker이미지가 잘 생성이 되었는지 확인해볼까요?

(venv)$ docker image ls
REPOSITORY                    TAG                            IMAGE ID       CREATED          SIZE
cms                           latest                         8fcfeb378ee4   12 minutes ago   151MB

만들어진 이미지를 한번 실행해 볼게요. 나중에 실행을 취소할때 편리하도록 컨테이너에 cms라는 이름을 주고 실행을 하도록 하겠습니다.

(venv)$ docker run --name cms -d -p 5000:5000 cms
7e672b644d6470c14ff5fed1b53e0420662941a1ee2b5218193ef1c1dd32b147

docker ps를 통해서 실행이 잘 되었는지 확인해보실 수 있습니다.

(venv)$ docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                    NAMES
0c873bfa10db   cms       "flask run --host=0.…"   4 seconds ago   Up 3 seconds   0.0.0.0:5000->5000/tcp   cms

브라우저를 열고 http://localhost:5000/ 를 입력해서 확인해볼게요

컨테이너를 실행중지하시려면 아까 부여한 이름으로 docker stop을 하시면 됩니다.

(venv)$ docker stop cms
cms
(venv)$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES