Рубрики
Без рубрики

Dockerizing приложение Flask-Mysql с докером

Также опубликовано в моем блоге. Вы так много слышали о Docker и его преимуществах, и теперь стремитесь … С тегом Python, Docker, MySQL, колба.

Также опубликовано в моем блоге.

Вы так много слышали о Docker и его преимуществах, и теперь стремитесь использовать его в своем новом веб -приложении – но с чего начать? В этом уроке мы проведем пример приема существующего простого веб-приложения на основе Flask и MySQL, а также запустить его с Docker и Docker-Compose. Код доступен здесь:

Ставшамир/Docker-Tutorial

Код для создания приложения Docker с учебником MySQL

Для контейнера считается наилучшей практикой иметь только одну ответственность и один процесс, поэтому для нашего приложения нам понадобятся как минимум два контейнера – один для запуска самого приложения, и один для запуска базы данных. Как мы координируем эти контейнеры? Здесь входит Docker-Compose. Из Официальные документы :

Compose-это инструмент для определения и запуска мультиконтражных приложений Docker. С помощью Compose вы используете файл YAML для настройки услуг вашего приложения. Затем, с одной командой, вы создаете и запускаете все службы из вашей конфигурации.

Давайте начнем!

Если у вас их еще нет, установите Docker и Docker-Compose Анкет Начнем со следующего макета проекта:

dockerize/
├── app
│   └── app.py
└── db
    └── init.sql
  • app.py – Содержит приложение Flask, которое подключается к базе данных и обнажает одну конечную точку API REST
  • init.sql – Сценарий SQL для инициализации базы данных до первого раздачи приложения.

Создание изображения Docker для нашего приложения

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

# Use an official Python runtime as an image
FROM python:3.6

# The EXPOSE instruction indicates the ports on which a container 
# will listen for connections
# Since Flask apps listen to port 5000  by default, we expose it
EXPOSE 5000

# Sets the working directory for following COPY and CMD instructions
# Notice we haven't created a directory by this name - this instruction 
# creates a directory with this name if it doesn't exist
WORKDIR /app

# Install any needed packages specified in requirements.txt
COPY requirements.txt /app
RUN pip install -r requirements.txt

# Run app.py when the container launches
COPY app.py /app
CMD python app.py

То, что это делает, просто как описано в файле – основывайте изображение на изображении Python 3.6, разоблачить порт 5000 (для колбы), создать рабочий каталог, на который будут скопированы рабочие каталог. запустить приложение.

Нам нужны наши зависимости (Flask и MySQL-Connector), чтобы установить и доставить с изображением, поэтому нам необходимо создать вышеупомянутые файлы reditions.txt:

Flask
mysql-connector

Теперь мы можем создать изображение Docker для нашего приложения, но мы все еще не можем его использовать, поскольку это зависит от MySQL, который, как и в том числе с помощью хорошей практики, будет находиться в другом контейнере. Мы будем использовать Docker-Compose для облегчения оркестровки двух независимых контейнеров в одно рабочее приложение.

Создание Docker-Compose.yml

Итак, давайте создадим новый файл, Docker-compose.yml, в корневом каталоге нашего проекта:

version: "2"
services:
  app:
    build: ./app
    links:
      - db
    ports:
      - "5000:5000"

Мы используем две службы, один – это контейнер, который выставляет API REST (приложение), а один содержит базу данных (DB).

  • сборка : Определяет каталог, который содержит DockerFile, содержащий инструкции по созданию этой услуги
  • Ссылки : Связывает эту службу с другим контейнером. Это также позволит нам использовать имя службы, а не находить IP -контейнер в базе данных и выразить зависимость, которая определит порядок запуска контейнера
  • порты : Картирование <Хост>: <Контейнер> порты
  db:
    image: mysql:5.7
    ports:
      - "32000:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - ./db:/docker-entrypoint-initdb.d/:ro
  • изображение : Как от инструкции от Dockerfile. Вместо того, чтобы писать новый Dockerfile, мы используем существующее изображение из репозитория. Важно указать версию – если ваш установлен клиент MySQL не может возникнуть проблем с той же версией.
  • среда : Добавить переменные среды. Указанная переменная требуется для этого изображения, и, как следует из его имени, настраивает пароль для пользователя root MySQL в этом контейнере. Здесь указано больше переменных.
  • порты : Поскольку у меня уже есть запуск экземпляра MySQL на моем хосте, используя этот порт, я намечу его с другим. Обратите внимание, что отображение происходит только от хоста в контейнер, поэтому наш контейнер службы приложений по -прежнему будет использовать порт 3306 для подключения к базе данных.
  • тома : Поскольку мы хотим, чтобы контейнер был инициализирован с помощью нашей схемы, мы подводем каталог, содержащий наш init.sql Скрипт к точке входа для этого контейнера, который по спецификации изображения запускает все сценарии .SQL в данном каталоге.

Теперь мы готовы начать приложение Dockerized! Но прежде чем мы это сделаем, давайте посмотрим на код, подключающийся к базе данных (app.py):

config = {
        'user': 'root',
        'password': 'root',
        'host': 'db',
        'port': '3306',
        'database': 'knights'
    }
connection = mysql.connector.connect(**config)

Мы подключаемся как root с паролем, настроенным в файле Docker-Compose. Обратите внимание, что мы явно определяем хост (который по умолчанию по умолчанию), так как служба SQL на самом деле находится в другом контейнере, чем тот, который использует этот код. Мы можем (и должны) использовать имя «DB», так как это имя сервиса, на которое мы определили и связали ранее, а порт составляет 3306, а не 32000, поскольку этот код не работает на хосте.

Запуск приложения

Чтобы запустить наше приложение Dockerized, мы выполним следующую команду из терминала:

$ docker-compose up

Вы можете увидеть созданное изображение, пакеты, установленные в соответствии с требованиями .txt и т. Д. Если все пошло правильно, вы увидите следующую строку:

app_1  |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

Мы можем выяснить, что все работает, как и ожидалось, вводя этот URL -адрес в браузере или используя Curl, и получая следующий ответ:

{"favorite_colors": [{"Lancelot": "blue"}, {"Galahad": "yellow"}]}

Вы можете получить доступ к базе данных напрямую, используя клиент MySQL и следующую команду (убедитесь, что ваш клиент такая же версия MySQL, указанная в Docker-compose.yml):

$ mysql --host=127.0.0.1 --port=32000 -u root -p

Обязательно указать IP -IP -хост, так как Когда «LocalHost» по умолчанию используется MySQL игнорирует параметр порта Анкет

Вывод

Мы узнали, как докеризовать простой флянт-Mysql, используя Docker-Compose. Теперь это приложение может использоваться без утомительной предварительной фигурации на каждом хосте с докером и докером, и оно заключается в среде хоста!

Оригинал: “https://dev.to/stavshamir/dockerizing-a-flask-mysql-app-with-docker-compose-kj2”