소개
이 튜토리얼에서는 Docker 컨테이너 내에서 Flask 애플리케이션을 실행하는 과정을 살펴봅니다. Docker 의 기본 사항을 다루고 Flask 애플리케이션을 구축한 후 Docker 를 활용하여 Flask 앱을 컨테이너화하여 얻을 수 있는 이점을 살펴볼 것입니다.
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 Registries]
- Docker Client: Docker 시스템과 상호 작용하는 사용자 인터페이스.
- Docker Daemon: 이미지, 컨테이너, 네트워크, 볼륨과 같은 Docker 객체를 관리하는 백그라운드 프로세스.
- Docker Images: Docker 컨테이너를 생성하기 위한 청사진.
- Docker Containers: Docker 이미지의 실행 가능한 인스턴스.
- Docker Registries: Docker 이미지를 저장하고 배포하는 저장소.
Docker 사용의 이점
- 일관된 환경: Docker 는 기본 인프라에 관계없이 애플리케이션이 동일한 방식으로 실행되도록 보장합니다.
- 확장성: Docker 컨테이너는 변화하는 수요를 충족하도록 쉽게 확장하거나 축소할 수 있습니다.
- 이식성: Docker 컨테이너는 Docker 가 설치된 모든 시스템에서 실행될 수 있으므로 애플리케이션을 다른 환경으로 쉽게 이동할 수 있습니다.
- 효율성: Docker 컨테이너는 경량이며 기존 가상 머신보다 적은 리소스를 사용합니다.
- 격리: Docker 컨테이너는 높은 수준의 격리를 제공하여 애플리케이션이 안전하고 일관된 환경에서 실행되도록 보장합니다.
Docker 시작하기
Docker 를 시작하려면 시스템에 Docker 엔진을 설치해야 합니다. 공식 웹사이트 (https://www.docker.com/get-started) 에서 Docker 를 다운로드하고 운영 체제에 대한 설치 지침을 따르세요.
Docker 를 설치한 후 Docker 컨테이너를 구축하고 실행할 수 있습니다. Ubuntu 이미지로 Docker 컨테이너를 실행하는 간단한 예는 다음과 같습니다.
docker run -it ubuntu
이 명령은 Docker 레지스트리에서 Ubuntu 이미지를 가져오고 새 컨테이너를 생성하며 컨테이너 내에서 대화형 쉘 세션을 시작합니다.
Flask 애플리케이션 구축
Flask 는 경량, 유연하고 사용하기 쉬운 인기 있는 Python 웹 프레임워크입니다. 이 섹션에서는 간단한 Flask 애플리케이션을 구축하는 과정을 단계별로 설명합니다.
개발 환경 설정
먼저 개발 환경을 설정합니다. 이 예제에서는 Python 3.9 와 Flask 2.0.2 를 사용합니다.
## Python 3.9 설치
sudo apt-get update
sudo apt-get install -y python3.9
## Flask 설치
pip3 install flask==2.0.2
Flask 애플리케이션 생성
이제 간단한 Flask 애플리케이션을 생성합니다. app.py라는 새 파일을 만들고 다음 코드를 추가합니다.
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, LabEx!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
이 예제에서는 flask 모듈에서 Flask 클래스를 가져오고 새로운 Flask 인스턴스를 생성하며 루트 URL(/) 에 대한 경로를 정의하여 "Hello, LabEx!" 문자열을 반환합니다. 마지막으로 app.run() 메서드를 사용하여 애플리케이션을 실행합니다.
Flask 애플리케이션 실행
Flask 애플리케이션을 실행하려면 터미널에서 다음 명령을 실행합니다.
python3 app.py
이렇게 하면 Flask 개발 서버가 시작되고 애플리케이션은 http://localhost:5000/에서 사용 가능해집니다.
기능 추가
추가적인 경로를 정의하고 비즈니스 로직을 추가하여 Flask 애플리케이션에 쉽게 기능을 추가할 수 있습니다. 예를 들어, 사용자 입력을 받아 처리하고 응답을 반환하는 경로를 만들 수 있습니다.
from flask import Flask, request
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello, LabEx!'
@app.route('/greet', methods=['POST'])
def greet():
name = request.form['name']
return f'Hello, {name}!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
이 예제에서는 name 매개변수가 포함된 POST 요청을 받는 새로운 경로 /greet를 추가했습니다. 그런 다음 애플리케이션은 제공된 이름으로 인사 메시지를 반환합니다.
Flask 앱 컨테이너화
이제 기본 Flask 애플리케이션이 준비되었습니다. Docker 를 사용하여 이를 컨테이너화해 보겠습니다. 애플리케이션을 컨테이너화하면 종속성과 함께 자체적으로 포함된 단위로 패키징하여 배포 및 확장을 용이하게 할 수 있습니다.
Dockerfile 생성
Flask 애플리케이션을 컨테이너화하려면 Dockerfile 이 필요합니다. Dockerfile 은 사용자가 이미지를 조립하기 위해 명령줄에서 호출할 수 있는 모든 명령을 포함하는 텍스트 문서입니다.
Dockerfile이라는 새 파일을 만들고 다음 내용을 추가합니다.
## 공식 Python 이미지를 기본 이미지로 사용
FROM python:3.9-slim
## 작업 디렉토리를 /app으로 설정
WORKDIR /app
## requirements 파일을 컨테이너로 복사
COPY requirements.txt .
## Python 종속성 설치
RUN pip install --no-cache-dir -r requirements.txt
## Flask 앱 코드를 컨테이너로 복사
COPY app.py .
## Flask 앱이 실행될 포트 노출
EXPOSE 5000
## Flask 앱 실행 명령 설정
CMD ["python", "app.py"]
이 Dockerfile 에서는 다음을 수행합니다.
- 공식 Python 3.9 slim 이미지를 기본 이미지로 사용합니다.
- 작업 디렉토리를
/app으로 설정합니다. requirements.txt파일을 컨테이너로 복사합니다.- Python 종속성을 설치합니다.
app.py파일을 컨테이너로 복사합니다.- Flask 앱을 위한 포트 5000 을 노출합니다.
- Flask 앱을 실행할 명령을 설정합니다.
Docker 이미지 빌드
이제 Flask 애플리케이션의 Docker 이미지를 빌드합니다. 터미널에서 다음 명령을 실행합니다.
docker build -t labex-flask-app .
이 명령은 현재 디렉터리의 Dockerfile 을 사용하여 태그가 labex-flask-app인 Docker 이미지를 빌드합니다.
Docker 컨테이너 실행
이미지 빌드 후 Flask 애플리케이션을 Docker 컨테이너에서 실행할 수 있습니다.
docker run -p 5000:5000 labex-flask-app
이 명령은 labex-flask-app 이미지를 기반으로 새 컨테이너를 시작하고 호스트의 포트 5000 을 컨테이너의 포트 5000 으로 매핑합니다.
이제 http://localhost:5000/에서 Flask 애플리케이션에 접근할 수 있습니다.
Docker 이미지 배포
Flask 애플리케이션을 컨테이너화한 후 Docker Hub 또는 프라이빗 레지스트리와 같은 컨테이너 레지스트리에 Docker 이미지를 배포하고 프로덕션 환경에 애플리케이션을 배포할 수 있습니다.
요약
이 튜토리얼을 마치면 Docker 를 사용하여 Flask 애플리케이션을 컨테이너화하는 방법에 대한 확실한 이해를 얻게 됩니다. Flask 앱의 Docker 이미지를 빌드하고 Docker 컨테이너에서 실행하며 Flask 개발 및 배포에 Docker 의 장점을 활용할 수 있게 됩니다.



