Розгортання Python Flask додатка з Docker та AWS Elastic Beanstalk

pic

Чому варто використовувати Docker? 🤔

Strapi — це система керування контентом (CMS) без голови з відкритим кодом. Використовувати Strapi я почав, коли захотів створити дуже кастомізований вебсайт, який було б важко побудувати за допомогою традиційних CMS, таких як WordPress чи Wix. І водночас я хотів, щоб бізнес-користувачі могли вільно змінювати контент на сайті.

Результат?

Гарно кастомізований UI + Повний контроль над контентом

Strapi має багато корисних посібників, але вони не описали, як розгорнути застосунок на AWS Elastic Beanstalk. Тому я створив покрокову інструкцію, як можна розгорнути Strapi на Elastic Beanstalk за допомогою Docker. Сподіваюся, це допоможе!

Перш ніж почати... 🤚

  1. Встановіть EB CLI, дотримуючись інструкцій тут
  2. У вас повинна бути встановлена та запущена Docker. Якщо ні, перейдіть сюди
  3. Звісно, вам потрібно мати проект Strapi. Якщо ні, перейдіть сюди

Крок 1: Додаємо Dockerfile 🐳

Давайте додамо Dockerfile до вашого проекту Strapi. Ви можете використовувати конфігурацію, наведену нижче. Зверніть увагу, що ви, можливо, захочете змінити NODE_ENV залежно від того, в якому середовищі ви хочете його розгорнути. У цьому прикладі ми розгортаємо в середовищі staging.

Крок 2: Ініціалізація та тестування локально ✅

Запустіть eb init -p docker і ви повинні побачити створену папку .elasticbeanstalk з файлом config.yml всередині. Ви можете запустити eb init -i, щоб змінити будь-які інші поля.

(Опційно) Запустіть eb local run --port 1337 і перейдіть за адресою http://localhost:1337, щоб перевірити, чи працює наш Docker контейнер як очікується. Зверніть увагу, що ця команда не підтримується на Windows.

pic

Strapi працює на localhost:1337

Крок 3: Розгортання на Elastic Beanstalk 🌱

Запустіть eb create і ви побачите таке:

Enter Environment Name:   
введіть ваше ім'я або виберіть за замовчуванням
Enter DNS CNAME prefix:   
виберіть за замовчуванням
Select a load balancer type:   
виберіть за замовчуванням
Would you like to enable Spot Fleet requests for this environment?  
(y/N):   
y
Enter a list of one or more valid EC2 instance types separated by commas (at least two instance types are recommended):   
t2.small, t2.medium

Переконайтесь, що вибрали мінімум t2.small як розмір EC2 інстансу для цього. t2.micro не підійде.

Перейдіть до вашої консолі AWS і ваш проект Strapi має бути успішно розгорнутий 🎉

Потрібно додати бази даних та плагіни до вашого проекту і не знаєте, як це зробити? Не соромтесь звертатися, я з радістю допоможу!
Контейнер — це ніби мініатюрна, легка віртуальна машина, яку можна вимкнути, коли завгодно, і знову запустити за допомогою вашого Docker-образу.

  1. Docker Hub: Docker Hub — це реєстр, де ви можете зберігати і ділитися своїми Docker-образами та отримувати доступ до образів, створених іншими користувачами. Зазначте, що Dockerfile не зберігаються на Docker Hub, тому творець образу повинен сказати вам, де його знайти (зазвичай у репозиторії GitHub), якщо хоче поділитися.

Ознайомтесь з офіційною документацією для більш глибокого розуміння.

Dockerизація вашого Flask додатку — покрокова інструкція

Тепер, коли ми розібралися з початковими налаштуваннями, ось покрокові інструкції для Dockerизації вашого Flask-додатку.

Крок 1: Створення Dockerfile

Я вирішив написати свій Dockerfile замість того, щоб використовувати офіційний попередньо зібраний образ Python, щоб я міг встановити лише ті пакунки, які мені потрібні для мого додатку.

  1. Створіть файл у вашому текстовому редакторі під назвою "Dockerfile" і збережіть його в кореневій директорії вашого додатку. Зверніть увагу, що розширення файлу не потрібне.

Ось швидке пояснення того, що означають команди в Dockerfile.

FROM
Це вказує на базовий образ, з якого ви починаєте. Я почав з Docker-образу, що містить Ubuntu. Це популярний образ Docker, тому він є гарною відправною точкою.

MAINTAINER
Це ви! Творець цього чудового Dockerfile.

RUN
RUN виконує будь-які команди, які ви йому надаєте. Тут ви вказуєте пакунки, які потрібно встановити. "apt-get" — це команда, специфічна для встановлення пакунків за допомогою Ubuntu. У цьому випадку я встановив Python і Pip.

Друга команда RUN у файлі посилається на документ під назвою "requirements.txt". Цей файл генерується після виконання:

pip freeze > requirements.txt

Ось невеликий фрагмент того, що я отримав, коли виконав це на своєму комп'ютері. Цей документ мав 229 рядків і містив список усіх пакунків, які я встановив на своєму комп'ютері, а не лише тих, що потрібні для мого додатку.

pic

Тому я видалив усі непотрібні пакунки для мого додатку і залишив ось цей дворядковий список.

pic

COPY . /app
Копіює всі файли з вашої поточної робочої директорії в папку /app в Docker-контейнері. Точка означає копіювати все. Ви також можете вибрати копіювання лише деяких файлів.

WORKDIR /app
Виконання команд з директорії /app.

EXPOSE 5000
EXPOSE вказує порти (в даному випадку 5000), на які контейнер повинен слухати для з'єднань.

ENTRYPOINT [“python”]
CMD [“application.py”]
Запускає application.py за допомогою Python.

Для більш детальної інформації, офіційна документація чудово пояснює це. Вище наведено лише дуже швидкий огляд.

Крок 2: Створення Docker-образу

Тепер ви будете використовувати ваш Dockerfile для створення Docker-образу. Існують різні способи це зробити, і офіційна документація надасть вам деталі. Ось кілька способів:

Створення з PATH
Переконайтеся, що ви запускаєте цю команду з тієї ж директорії, де знаходиться ваш Dockerfile.

docker build .

Точка означає поточну директорію, в якій знаходиться Dockerfile.

Створення з PATH і додавання тегу

docker build -t nadaa.taiyab/flask:latest .

Параметр “-t” вказує тег.
Прочитайте тут інформацію про тегування і зверніть увагу, що ви все ще використовуєте “.”, як у попередньому прикладі.

Тепер виконайте цю команду, щоб побачити Docker-образи, які є у вашому локальному репозиторії.

docker images

Ось приклад того, що ви повинні побачити на екрані:

pic

Налагодження вашого збірки

Якщо щось піде не так із збіркою, ви можете запустити звичайний образ Ubuntu та спробувати вручну встановити кожен пакунок з Dockerfile. Моя збірка не вдалася, коли я спробував використати мій файл "requirements.txt", що містив 200+ рядків. Тому я використав цей метод для відтворення помилки.

docker pull ubuntu:16.04docker run -it -v [full file path to your app files]:/app ubuntu:16.04 /bin/bash

Команда “docker pull” завантажує образ з Docker Hub.

Команда “docker run” запускає контейнер за допомогою образу ubuntu і відкриває командний рядок. Параметр “-v” монтує файли додатку до вашого контейнера (поясню це в наступному розділі).

Крок 3: Запуск Docker контейнера

Тепер ви будете використовувати “docker run” для запуску Docker контейнера за допомогою Docker образу.

docker run -p 5000:5000 nadaataiyab/pe-calculator:latest

Ця команда запустить Docker образ “nadaataiyab/pe-calculator:latest” і скопіює файли з папки, вказаної в вашому Dockerfile (не забувайте COPY . /app).

Параметр “-p” вказує, який порт на вашому хост-машині буде зіставлений з відповідним портом у контейнері. З якихось причин це працювало лише при вказанні 5000:5000.

Примітка: команда вище не дозволяє вам розробляти в реальному часі, оскільки зміни у ваших файлах на комп’ютері не будуть відображатися у файлах контейнера.

Ось що ви повинні зробити замість цього, якщо хочете розробляти в реальному часі:

docker run -p 5000:5000 -v [file path to the project files on your computer]:/app nadaataiyab/pe-calculator

Параметр “-v” монтує папку з вашого локального комп’ютера в контейнер. Це означає, що ви можете редагувати файли локально, а потім виконувати їх у контейнері в реальному часі, без необхідності знову збирати образ.

Щоб зупинити контейнер, натискайте “CTRL” + C.

Розгортання на AWS Elastic Beanstalk

pic

Тепер, коли ви Dockerизували ваш додаток, розгорнути його на AWS Elastic Beanstalk неймовірно легко. Без Docker я не зміг би розгорнути мій додаток, попри те, що прочитав документацію, намагався виконати туторіал і вивчав блоги. Я був вражений, коли розгортання спрацювало без жодних зусиль за допомогою Docker.

  1. Увійдіть в AWS і перейдіть до служби Elastic Beanstalk
  2. Створіть нове середовище і виберіть “Docker” як попередньо налаштовану платформу
  3. Завантажте архів з вашими файлами додатка, який, звісно, повинен включати Dockerfile. Створіть архів у кореневій директорії вашого додатка.

Зверніть увагу, що є кращі способи це зробити за допомогою інтерфейсу командного рядка AWS тощо. Однак цей метод є швидким і зручним.

Якщо ви отримаєте помилку пам'яті, можливо, вам потрібно буде використати більший екземпляр. t2.micro був занадто малим для мого додатка.

Після того, як ви успішно завантажите ваші файли на правильний розмір екземпляра, Elastic Beanstalk розгорне ваш додаток і зробить його доступним. Ось мої результати:

[

Калькулятор прогресивної частки

Цей інструмент обчислює потенційні виплати засновникам та співробітникам за схемою прогресивної частки.

Ідея полягає в тому, що...

pe-calculator.us-west-2.elasticbeanstalk.com

](http://pe-calculator.us-west-2.elasticbeanstalk.com/?source=post_page-----9f761b7f3dba--------------------------------)

Звісно, ви можете вказати й власну URL-адресу!

Висновки

Docker — це неймовірно потужний інструмент, і вам слід його спробувати!

Не соромтеся спробувати запустити мій додаток за допомогою Docker на вашому локальному комп'ютері.

Сподіваюся, що цей посібник був корисним для вас. Відгуки завжди вітаються.

Інші корисні ресурси та блоги

Контакти

LinkedIn | Github | Twitter

Перекладено з: Deploy a Python Flask app with Docker and AWS Elastic Beanstalk

Leave a Reply

Your email address will not be published. Required fields are marked *