웹사이트 검색

Debian 10에서 Docker를 사용하여 Flask 애플리케이션 Docker화


이 페이지에서

  1. 전제 조건
  2. 시작하기\n
  3. 필수 종속성 설치\n
  4. 도커 설치
  5. Flask 디렉토리 구조 설정
  6. Flask를 배포하도록 Docker 구성\n
  7. 템플릿 파일 배포\n
  8. 결론

Docker는 컨테이너를 사용하여 애플리케이션을 더 쉽게 생성, 배포 및 실행할 수 있도록 설계된 오픈 소스 도구입니다. 컨테이너는 애플리케이션이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 코드와 모든 종속성을 패키지화하는 소프트웨어 패키지입니다.

Flask는 널리 사용되는 Python 웹 프레임워크입니다. 특정 도구나 라이브러리가 필요하지 않기 때문에 마이크로프레임워크로 분류됩니다. 다른 프레임워크에 비해 가볍고 고도로 구조화되어 있습니다.

이 튜토리얼에서는 Debian 10 서버에서 Docker를 사용하여 Flask 애플리케이션을 배포하는 방법을 설명합니다.

전제 조건

  • Debian 10을 실행하는 서버.\n
  • 서버에 루트 암호가 구성되어 있습니다.\n

시작하기

시작하기 전에 시스템 패키지를 최신 버전으로 업데이트하는 것이 좋습니다. 다음 명령을 사용하여 모든 패키지를 업데이트할 수 있습니다.

apt-get update -y
apt-get upgrade -y

모든 패키지가 업데이트되면 시스템을 다시 시작하여 변경 사항을 적용하십시오.

필수 종속성 설치

다음으로 시스템에 Nginx 웹 서버 및 기타 종속 항목을 설치해야 합니다. 다음 명령을 사용하여 모두 설치할 수 있습니다.

apt-get install nginx apt-transport-https ca-certificates curl gnupg2 software-properties-common curl -y

모든 패키지가 설치되면 다음 단계로 진행할 수 있습니다.

도커 설치

기본적으로 최신 버전의 Docker는 Debian 10 리포지토리에서 사용할 수 없습니다. 따라서 Docker 공식 저장소에서 설치하는 것이 좋습니다.

먼저 다음 명령을 사용하여 GPG 키를 다운로드하고 추가합니다.

wget https://download.docker.com/linux/debian/gpg apt-key add gpg

다음으로 다음 명령을 사용하여 Docker 리포지토리를 추가합니다.

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian buster stable"

다음으로 리포지토리를 업데이트하고 다음 명령을 사용하여 Docker를 설치합니다.

apt-get update -y
apt-get install docker-ce -y

설치가 성공적으로 완료되면 다음 명령을 사용하여 Docker의 상태를 확인합니다.

systemctl status docker

다음 출력이 표시되어야 합니다.

? docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2020-04-19 06:26:25 UTC; 1min 8s ago
     Docs: https://docs.docker.com
 Main PID: 8883 (dockerd)
    Tasks: 10
   Memory: 46.6M
   CGroup: /system.slice/docker.service
           ??8883 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.413828757Z" level=warning msg="Your kernel does not support swap memory limit
Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.413876690Z" level=warning msg="Your kernel does not support cgroup rt period"
Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.413889604Z" level=warning msg="Your kernel does not support cgroup rt runtime
Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.414115814Z" level=info msg="Loading containers: start."
Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.788332166Z" level=info msg="Default bridge (docker0) is assigned with an IP a
Apr 19 06:26:24 debian10 dockerd[8883]: time="2020-04-19T06:26:24.972022325Z" level=info msg="Loading containers: done."
Apr 19 06:26:25 debian10 dockerd[8883]: time="2020-04-19T06:26:25.010940205Z" level=info msg="Docker daemon" commit=afacb8b7f0 graphdriver(s)=o
Apr 19 06:26:25 debian10 dockerd[8883]: time="2020-04-19T06:26:25.011145541Z" level=info msg="Daemon has completed initialization"
Apr 19 06:26:25 debian10 systemd[1]: Started Docker Application Container Engine.
Apr 19 06:26:25 debian10 dockerd[8883]: time="2020-04-19T06:26:25.074603639Z" level=info msg="API listen on /var/run/docker.sock"

이 시점에서 Docker가 설치되어 실행 중입니다. 이제 다음 단계를 진행할 수 있습니다.

플라스크 디렉토리 구조 설정

다음으로 Flask 애플리케이션을 보관할 디렉터리 구조를 만들어야 합니다.

/var/www/ 디렉토리 안에 flask라는 디렉토리를 생성해 보겠습니다.

mkdir -p /var/www/flask

다음으로 디렉터리를 플라스크로 변경하고 플라스크에 대한 디렉터리 구조를 생성합니다.

cd /var/www/flask
mkdir -p app/static
mkdir -p app/templates

정적 디렉토리는 이미지, CSSJavaScript 파일을 저장하는 데 사용되며 템플릿 디렉토리는 프로젝트의 HTML 템플릿을 저장하는 데 사용됩니다.

다음으로 앱 디렉토리 내에 __init__.py 파일을 만들어야 합니다.

nano app/__init__.py

다음 내용을 추가하여 Flask 인스턴스를 만들고 views.py 파일에서 논리를 가져옵니다.

from flask import Flask
app = Flask(__name__)
from app import views

파일을 저장하고 닫은 다음 앱 디렉터리에 views.py 파일을 만듭니다.

nano app/views.py

다음 줄을 추가하십시오

from app import app
@app.route('/')
def home():
   return "hello world!"

파일을 저장하고 닫은 후 다음 명령을 사용하여 uwsgi.ini 파일을 만듭니다.

nano uwsgi.ini

이 파일에는 아래와 같이 애플리케이션에 대한 uWSGI 구성이 포함됩니다.

[uwsgi]
module = main
callable = app
master = true

완료되면 파일을 저장하고 닫습니다. uWSGI는 프로토콜이자 애플리케이션 서버인 Nginx용 배포 옵션입니다.

다음으로 응용 프로그램 패키지에서 app이라는 Flask 인스턴스를 가져오려면 main.py 파일을 만들어야 합니다. 다음 명령으로 만들 수 있습니다.

nano main.py

다음 줄을 추가합니다.

from app import app

완료되면 파일을 저장하고 닫습니다. 다음으로 pip 패키지 관리자가 Docker 배포에 설치할 종속성을 지정하기 위한 requirements.txt 파일을 만듭니다.

nano requirements.txt

최신 버전의 Flask와 일치하는 다음 줄을 추가합니다.

Flask==1.1.2

완료되면 파일을 저장하고 닫습니다.

이 시점에서 Flask 애플리케이션이 성공적으로 구성되었습니다. 이제 다음 단계를 진행할 수 있습니다.

Flask를 배포하도록 Docker 구성

다음으로 플라스크 애플리케이션을 빌드하고 배포하기 위해 Dockerfile을 생성해야 합니다.

먼저 다음 명령을 사용하여 Dockerfile을 만듭니다.

cd /var/www/flask
nano Dockerfile

다음 줄을 추가합니다.

FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7
RUN apk --update add bash nano
ENV STATIC_URL /static
ENV STATIC_PATH /var/www/app/static
COPY ./requirements.txt /var/www/requirements.txt
RUN pip install -r /var/www/requirements.txt

완료되면 파일을 저장하고 닫습니다. 다음으로 start.sh 스크립트를 만들어 Dockerfile에서 이미지를 빌드하고 결과 Docker 이미지에서 컨테이너를 만듭니다.

nano start.sh

다음 줄을 추가합니다.

#!/bin/bash
app="docker.test"
docker build -t ${app} .
docker run -d -p 56733:80 \
  --name=${app} \
  -v $PWD:/app ${app}

완료되면 파일을 저장하고 닫습니다.

참고: 포트 56733이 비어 있고 사용 가능한지 확인하십시오.

마지막으로 다음 명령을 사용하여 스크립트를 실행합니다.

bash start.sh

이렇게 하면 아래와 같이 Docker 이미지가 생성되고 결과 이미지에서 컨테이너가 빌드됩니다.

Sending build context to Docker daemon  9.728kB
Step 1/6 : FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7
python3.6-alpine3.7: Pulling from tiangolo/uwsgi-nginx-flask
48ecbb6b270e: Pull complete 
692f29ee68fa: Pull complete 
f75fc7ac1098: Pull complete 
c30e40bb471c: Pull complete 
Successfully built f5de17e1ce82
Successfully tagged docker.test:latest
22cd2bd23c9190cf2900fa1d7c55e4765a266e68c74dc1e6858872e9ebe7bdcd

이제 다음 명령을 사용하여 실행 중인 컨테이너를 나열할 수 있습니다.

docker ps

다음과 같은 결과가 표시되어야 합니다.

CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                            NAMES
22cd2bd23c91        docker.test         "/entrypoint.sh /sta…"   About a minute ago   Up About a minute   443/tcp, 0.0.0.0:56733->80/tcp   docker.test

URL http://your-server-ip:56733을 방문하여 Docker 컨테이너를 확인할 수도 있습니다. 다음 화면이 표시됩니다.

템플릿 파일 배포

정적 및 동적 콘텐츠를 제공하기 위해 템플릿 파일을 배포할 수도 있습니다. 다음 명령을 사용하여 애플리케이션의 홈 페이지 템플릿을 만들 수 있습니다.

nano app/templates/home.html

다음 코드를 추가합니다.

<!doctype html>

<html lang="en-us">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="x-ua-compatible" content="ie=edge">
    <title>Welcome Flask</title>
  </head>

  <body>
    <h1>Home Page</h1>
    <p>This is the home page of our flask application.</p>
  </body>
</html>

완료되면 파일을 저장하고 닫습니다. 다음으로 새로 만든 파일을 제공하도록 views.py 파일을 수정해야 합니다.

nano app/views.py

아래와 같이 파일을 업데이트합니다.

from flask import render_template

from app import app

@app.route('/')
def home():
   return "hello world!"

@app.route('/template')
def template():
    return render_template('home.html')

파일을 저장하고 닫습니다. 그런 다음 변경 사항을 적용하려면 Docker 컨테이너를 다시 시작해야 합니다.

다음 명령을 사용하여 docker.test라는 Docker 컨테이너를 다시 시작할 수 있습니다.

docker stop docker.test
docker start docker.test

이제 웹 브라우저를 열고 URL http://your-server-ip:56733/template을 입력합니다. 다음 화면에서 새로 만든 템플릿을 볼 수 있습니다.

결론

축하합니다! Debian 10 서버에서 Docker를 사용하여 Flask 애플리케이션을 성공적으로 배포했습니다. 이제 최소한의 재구성으로 여러 서버 간에 애플리케이션을 복제할 수 있습니다. 궁금한 점이 있으면 언제든지 문의해 주세요.