Докеризация приложения Flask с использованием Docker в Debian 10
На этой странице
- Предпосылки
- Начало работы
- Установите необходимые зависимости
- Установить Docker
- Настройка структуры каталогов Flask
- Настройте Docker для развертывания Flask
- Развертывание файлов шаблонов
- Заключение
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. Теперь вы можете реплицировать приложение на разные серверы с минимальной реконфигурацией. Не стесняйтесь спрашивать меня, если у вас есть какие-либо вопросы.