Docker + Flask 컨테이너 띄우기(트러블슈팅 포함)

Atmosphere·2025년 8월 27일

docker

목록 보기
5/5

👌목표:
flask를 사용한 flaskApp.py를 Dockerfile을 이용해 이미지화해서 컨테이너로 띄우기

1. flask 기본 코드

from flask import Flask
from urllib.parse import quote as url_quote

app = Flask(__name__)

@app.route('/')
def hello():
    return 'hello flask world'

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

2. Dockerfile 작성

FROM python:3.9

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

COPY . /app

WORKDIR /app

CMD [ "python","flaskApp.py"]

이때 다른 dockerfile과는 다르게 requirements.txt라는걸 넣는데,
requirements.txt에는 이렇게 입력하자.

Flask==2.0.3
Werkzeug==2.0.3

이렇게 입력하는게 생각보다 중요하다(이유는 밑에서)

3. docker 이미지만들고 컨테이너로 띄우기

docker build -t flask-app .
도커 이미지를 빌드한다.

docker run -d -p 3000:3000 flask-app
도커 컨테이너를 실행한다.
-d : 백그라운드에서
-p : 포트포워딩
3000:3000 호스트포트:컨테이너포트

잘 뜨는걸 확인할 수 있다.

트러블슈팅

error1. ImportError: cannot import name 'url_quote' from 'werkzeug.urls'

진심 이거 때문에 1시간 정도 썼다.
Flask와 Werkzeug의 버전 차이 문제로 인식하고 스택오버플로우랑 레딧 참고해서 링크
했는데도 계속 같은 오류가 나길래 gpt한테 물어봤더니
pip install flask==2.0.3 werkzeug==2.0.3로 다운그레이드 필요
라고 알려줬다.
근데? 이렇게 해도 안됬다.
그리고 docker ps -a해보니 세상에

docker run으로 생성된 컨테이너가 exited된채 한가득! 무한 제공 이벤트!^^

그래서 docker container prune으로 exited된 컨테이너 다 지워줬다.

다시 docker run해서 띄워보니 문제 해결!

error2. ERR_EMPTY_RESPONSE

근데? 두번째 문제 발생.
페이지가 로드가 안됬다. (뭐에요)

이유를 찾아보니

Flask를 기본 설정으로 실행하면 127.0.0.1(로컬 루프백) 에서만 바인딩돼서
도커 컨테이너 밖에서는 접근할 수 없다.

app.run(host="0.0.0.0", port=3000)
이렇게 수정해줬더니 잘 됬다.

마무리

다음에 계속~

profile
작게, 빠르게, 지속가능하게

0개의 댓글