Также опубликовано в моем блоге.
Вы так много слышали о 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 RESTinit.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”