Поиск по сайту:

Докеризация приложения Flask с использованием Docker в Debian 10


На этой странице

  1. Предпосылки
  2. Начало работы
  3. Установите необходимые зависимости
  4. Установить Docker
  5. Настройка структуры каталогов Flask
  6. Настройте Docker для развертывания Flask
  7. Развертывание файлов шаблонов
  8. Заключение

Docker — это инструмент с открытым исходным кодом, разработанный для упрощения создания, развертывания и запуска приложений с помощью контейнеров. Контейнер — это программный пакет, который упаковывает код и все его зависимости, чтобы приложение быстро и надежно запускалось из одной вычислительной среды в другую.

Flask — популярный веб-фреймворк Python. Он классифицируется как микрофреймворк, поскольку не требует специальных инструментов или библиотек. По сравнению с другими фреймворками он легкий и хорошо структурированный.

В этом руководстве мы объясним, как развернуть приложение Flask с помощью Docker на сервере Debian 10.

Предпосылки

  • Сервер под управлением Debian 10.
  • На вашем сервере настроен пароль root.

Начиная

Перед запуском рекомендуется обновить системный пакет до последней версии. Вы можете обновить все пакеты с помощью следующей команды:

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

Далее вам нужно будет создать структуру каталогов для хранения вашего приложения Flask.

Давайте создадим каталог с именем flask внутри каталога /var/www/:

mkdir -p /var/www/flask

Затем измените каталог на flask и создайте структуру каталогов для 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, который является одновременно и протоколом, и сервером приложений.

Затем вам нужно будет создать файл main.py для импорта экземпляра Flask с именем app из пакета приложения. Вы можете создать его с помощью следующей команды:

nano main.py

Добавьте следующую строку:

from app import app

Сохраните и закройте файл, когда закончите. Затем создайте файл requirements.txt для указания зависимостей, которые менеджер пакетов pip установит в ваше развертывание Docker:

nano requirements.txt

Добавьте следующую строку, соответствующую последней версии Flask:

Flask==1.1.2

Сохраните и закройте файл, когда закончите.

На данный момент ваше приложение Flask успешно настроено. Теперь вы можете перейти к следующему шагу.

Настройте Docker для развертывания Flask

Далее вам нужно будет создать 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

Вы также можете проверить контейнер Docker, посетив URL-адрес http://your-server-ip:56733. Вы должны увидеть следующий экран:

Развертывание файлов шаблонов

Вы также можете развернуть файлы шаблонов для обслуживания статического и динамического содержимого. Вы можете создать шаблон домашней страницы для своего приложения с помощью следующей команды:

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 с именем docker.test с помощью следующей команды:

docker stop docker.test
docker start docker.test

Теперь откройте веб-браузер и введите URL-адрес http://ваш-сервер-ip:56733/template. Вы должны увидеть только что созданный шаблон на следующем экране:

Заключение

Поздравляем! вы успешно развернули приложение Flask с помощью Docker на сервере Debian 10. Теперь вы можете реплицировать приложение на разные серверы с минимальной реконфигурацией. Не стесняйтесь спрашивать меня, если у вас есть какие-либо вопросы.