Debian 10에서 Docker를 사용하여 Flask 애플리케이션 Docker화
이 페이지에서
- 전제 조건
- 시작하기\n
- 필수 종속성 설치\n
- 도커 설치
- Flask 디렉토리 구조 설정
- Flask를 배포하도록 Docker 구성\n
- 템플릿 파일 배포\n
- 결론
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
정적 디렉토리는 이미지, CSS 및 JavaScript 파일을 저장하는 데 사용되며 템플릿 디렉토리는 프로젝트의 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 애플리케이션을 성공적으로 배포했습니다. 이제 최소한의 재구성으로 여러 서버 간에 애플리케이션을 복제할 수 있습니다. 궁금한 점이 있으면 언제든지 문의해 주세요.