소개
Docker 는 Flask 기반 웹 애플리케이션을 포함한 다양한 웹 애플리케이션 배포에 인기 있는 선택이 되었습니다. 이 튜토리얼에서는 Docker 를 사용하여 Flask 애플리케이션을 Docker 화하고 Docker 에서 프로덕션 모드로 실행하는 방법을 안내합니다. 이 문서를 마치면 Docker 를 활용하여 프로덕션 환경에서 Flask 앱을 배포하는 방법에 대한 확실한 이해를 얻게 될 것입니다.
Docker 이해
Docker 는 개발자가 컨테이너 환경에서 애플리케이션을 구축, 배포 및 실행할 수 있도록 지원하는 인기 있는 오픈소스 플랫폼입니다. 애플리케이션과 모든 종속성을 단일 컨테이너에 패키징하여 서로 다른 컴퓨팅 환경 간에 애플리케이션을 쉽게 이동할 수 있도록 합니다.
Docker 란 무엇인가요?
Docker 는 개발자가 컨테이너에서 애플리케이션을 구축, 배포 및 실행할 수 있도록 지원하는 소프트웨어 플랫폼입니다. 컨테이너는 애플리케이션 실행에 필요한 코드, 런타임, 시스템 도구 및 라이브러리 등 모든 것을 포함하는 경량, 독립적이고 실행 가능한 패키지입니다. 컨테이너는 서로 그리고 호스트 운영 체제와 격리되어 일관되고 안정적인 애플리케이션 배포를 보장합니다.
Docker 의 장점
- 이식성: Docker 컨테이너는 개발자의 랩톱에서 프로덕션 서버까지 다양한 컴퓨팅 환경에서 일관되게 실행될 수 있습니다. 이는 기반 인프라에 관계없이 애플리케이션이 동일한 방식으로 동작한다는 것을 보장합니다.
- 확장성: Docker 는 필요에 따라 컨테이너를 추가하거나 제거하여 수요에 따라 애플리케이션을 확장하거나 축소하기 쉽게 합니다.
- 효율성: Docker 컨테이너는 기존 가상 머신보다 경량이며 컴퓨팅 리소스를 더 효율적으로 사용할 수 있습니다.
- 일관성: Docker 는 애플리케이션과 그 종속성이 함께 패키징되어 "내 컴퓨터에서는 작동합니다"라는 문제를 해결하고 다양한 환경에서 일관된 동작을 보장합니다.
Docker 아키텍처
Docker 아키텍처는 다음과 같은 주요 구성 요소로 구성됩니다.
graph TD
A[Docker Client] --> B[Docker Daemon]
B --> C[Docker Images]
B --> D[Docker Containers]
B --> E[Docker Networking]
B --> F[Docker Storage]
- Docker Client: Docker 클라이언트는 Docker 와 상호 작용하기 위한 주요 사용자 인터페이스입니다. 사용자는 Docker 데몬에 컨테이너를 구축, 실행 및 관리하는 명령을 내릴 수 있습니다.
- Docker Daemon: Docker 데몬은 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체의 생성, 수정 및 삭제를 관리하는 백엔드 서비스입니다.
- Docker Images: Docker 이미지는 Docker 컨테이너를 만드는 설계도입니다. 애플리케이션 코드, 라이브러리, 종속성 및 애플리케이션 실행에 필요한 모든 파일을 포함합니다.
- Docker Containers: Docker 컨테이너는 Docker 이미지의 실행 인스턴스입니다. 격리되고 경량이며 휴대 가능한 환경으로 애플리케이션을 실행합니다.
- Docker Networking: Docker 는 컨테이너가 서로 그리고 외부 세계와 통신할 수 있도록 내장 네트워킹 기능을 제공합니다.
- Docker Storage: Docker 는 볼륨 및 바인드 마운트를 포함한 다양한 스토리지 옵션을 제공하여 컨테이너와 관련된 지속적인 데이터를 관리합니다.
Docker 아키텍처와 주요 구성 요소를 이해하는 것은 애플리케이션 개발 및 배포 프로세스에서 Docker 를 효과적으로 사용하고 관리하는 데 필수적입니다.
Flask 애플리케이션 Docker 화
이 섹션에서는 Docker 를 사용하여 Flask 애플리케이션을 컨테이너화하는 방법을 배웁니다.
Flask 애플리케이션 생성
먼저 간단한 Flask 애플리케이션을 생성해 보겠습니다. 새로운 디렉토리를 생성하고 터미널에서 해당 디렉토리로 이동합니다. 그런 다음 app.py라는 새 파일을 만들고 다음 내용으로 채웁니다.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return 'Hello, LabEx!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
이 Flask 애플리케이션은 "Hello, LabEx!"라는 메시지를 반환하는 단일 라우트를 가지고 있습니다.
Flask 애플리케이션 Docker 화
Flask 애플리케이션을 컨테이너화하려면 Dockerfile 을 생성해야 합니다. Dockerfile이라는 새 파일을 만들고 다음 내용으로 채웁니다.
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
Dockerfile 을 자세히 살펴보겠습니다.
FROM python:3.9-slim: 이는 이 경우 Python 3.9 이미지의 slim 버전인 Docker 컨테이너의 기본 이미지를 지정합니다.WORKDIR /app: 이는 컨테이너 내부의 작업 디렉토리를/app으로 설정합니다.COPY requirements.txt .: 이는requirements.txt파일을 컨테이너의 작업 디렉토리로 복사합니다.RUN pip install --no-cache-dir -r requirements.txt: 이는requirements.txt파일에 명시된 Python 종속성을 설치합니다.COPY . .: 이는 전체 애플리케이션 코드 (app.py포함) 를 컨테이너의 작업 디렉토리로 복사합니다.CMD ["python", "app.py"]: 이는 컨테이너가 시작될 때 실행할 명령을 지정하며, Python 인터프리터를 사용하여app.py스크립트를 실행하는 것입니다.
Docker 컨테이너 구축 및 실행
이제 Docker 이미지를 구축하고 컨테이너를 실행해 보겠습니다.
- Docker 이미지 구축:
docker build -t labex-flask-app . - Docker 컨테이너 실행:
docker run -p 5000:5000 labex-flask-app
-p 5000:5000 옵션은 호스트의 포트 5000 을 컨테이너의 포트 5000 으로 매핑하여 로컬 머신에서 Flask 애플리케이션에 액세스할 수 있도록 합니다.
컨테이너를 실행한 후 웹 브라우저를 열고 http://localhost:5000으로 이동하면 "Hello, LabEx!" 메시지가 표시됩니다.
축하합니다! Docker 를 사용하여 Flask 애플리케이션을 성공적으로 컨테이너화했습니다.
프로덕션 모드에서 Flask 앱 실행
Flask 애플리케이션을 프로덕션 환경에서 실행할 때는 내장 개발 서버 대신 프로덕션용 서버를 사용하는 것이 중요합니다. 이 섹션에서는 Docker 를 사용하여 Flask 애플리케이션을 프로덕션 모드로 실행하는 방법을 배웁니다.
프로덕션 서버 선택
Flask 애플리케이션을 실행하기 위해 사용할 수 있는 여러 프로덕션용 웹 서버가 있습니다. 예를 들어 Gunicorn, uWSGI, Waitress 등이 있습니다. 이 예제에서는 Python 애플리케이션에 널리 사용되는 인기 있는 웹 서버인 Gunicorn 을 사용합니다.
Dockerfile 수정
Gunicorn 을 사용하여 Flask 애플리케이션을 프로덕션 모드로 실행하려면 Dockerfile 을 업데이트해야 합니다. Dockerfile의 내용을 다음과 같이 바꿉니다.
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN pip install gunicorn
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
주요 변경 사항은 다음과 같습니다.
- Gunicorn 웹 서버를 설치하기 위해
RUN pip install gunicorn을 추가했습니다. CMD명령을 Gunicorn 을 사용하여 Flask 애플리케이션을 시작하도록 변경했습니다."gunicorn", "--bind", "0.0.0.0:5000", "app:app"명령은 Gunicorn 이 애플리케이션을0.0.0.0:5000주소에 바인딩하고app.py파일의app객체를 WSGI 애플리케이션으로 사용하도록 지시합니다.
프로덕션용 Docker 컨테이너 구축 및 실행
이제 Docker 이미지를 구축하고 프로덕션 모드로 컨테이너를 실행해 보겠습니다.
- Docker 이미지 구축:
docker build -t labex-flask-app-prod . - Docker 컨테이너 실행:
docker run -p 5000:5000 labex-flask-app-prod
이제 애플리케이션은 Gunicorn 을 사용하여 프로덕션 모드로 실행됩니다.
프로덕션 설정 확인
Flask 애플리케이션이 프로덕션 모드로 실행되는지 확인하려면 다음 명령을 사용하여 로그를 확인할 수 있습니다.
docker logs <container_id>
다음과 유사한 출력이 표시되어야 합니다.
[2023-04-11 12:34:56 +0000] [1] [INFO] Starting gunicorn 20.1.0
[2023-04-11 12:34:56 +0000] [1] [INFO] Listening at: http://0.0.0.0:5000 (1)
[2023-04-11 12:34:56 +0000] [1] [INFO] Using worker: sync
[2023-04-11 12:34:56 +0000] [8] [INFO] Booting worker with pid: 8
이것은 Flask 애플리케이션이 Gunicorn 웹 서버를 사용하여 프로덕션 모드로 실행됨을 확인시켜줍니다.
요약
이 튜토리얼에서는 Docker 를 사용하여 Flask 애플리케이션을 프로덕션 모드로 실행하는 필수 단계를 다뤘습니다. Dockerfile 생성 및 Docker 이미지 구축을 포함하여 Flask 앱을 Docker 화하는 과정을 살펴보았습니다. 또한, Docker 컨테이너 내에서 Flask 앱을 프로덕션 모드로 실행하여 안정적이고 확장 가능한 배포를 보장하는 방법에 대해 논의했습니다. 이 가이드에서 설명된 절차를 따르면 Docker 를 효과적으로 활용하여 Flask 기반 웹 애플리케이션을 프로덕션 환경에 배포할 수 있습니다.



