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

Задача приложения Python

Обзор Python’s один из наиболее популярных языков программирования с широким разнообразием … Tagged с Docker, Python, DevOps.

Обзор

Python является одним из наиболее популярных языков программирования с широким спектром применений, от строительства бэкендов до создания нейронной сети. Тем не менее, поддержание соответствия вашей среды Python между проектами может быть болью, как видно из вышеизложенного.

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

Обратите внимание, что весь код, упомянутый в этой статье, исходит из этой GitHub Repo Анкет Это живое приложение, и хотя код в этом конкретном выпуске – не Производство готово, он все еще может пройти все через Docker.

Что такое Docker?

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

Это означает, что нам не нужно запускать python -m venv Каждый раз, когда мы строим новый проект, так что до тех пор, пока мы настраиваем Dockerfile и Docker-compose.yml файл.

Изображения, контейнеры и сочинение

Круто, так как это с дороги, нам нужно обзор какой -нибудь быстрый словар.

Сначала это изображения Docker. Изображение в Docker, в основном неизменное «снижение» приложения. Он включает в себя инструкции, чтобы запустить приложение в новом контейнере и может быть построено с помощью других изображений. Неизменность важна, поскольку она позволяет нам иметь несколько версий одного и того же приложения, не имея версии изображения.

Во -вторых, это контейнеры Docker. Контейнер Docker – это экземпляр приложения, которое мы запускаем на основе нашего изображения. Это аналогично воспроизведению вышеупомянутого «снимка» и не может быть разделен. Однако мы можем развернуть столько контейнеров Docker определенного изображения, сколько мы хотим, что очень удобно для баз данных и аналогичных сервисов!

Установка Docker

Если у вас его еще нет, вам нужно установить Docker Desktop . Если у вас это уже есть, и вы знаете, как пройти через это, то вы можете пропустить Следующий раздел Анкет

Я также кратко рассмотрю некоторые команды, которые вы можете запустить с помощью Docker CLI.

  docker image ls

Docker Image LS Перечисляет все изображения, доступные в настоящее время на вашем компьютере.

  docker container ls

Контейнер Docker LS Списки все в настоящее время запускаются/активные контейнеры.

  docker container ls -a

Контейнер Docker LS -A перечисляет все контейнеры, независимо от того, были ли они начаты или они активны. -a Флаг короткий для --все

  docker container rm  [...other containers you want to remove]

контейнер Docker RM Удаляет перечисленные контейнеры. Обратите внимание, что вам нужны либо первые 3 символа контейнера Идентификатор/Имя контейнера и контейнер не могут работать перед удалением контейнера.

  docker [COMMAND] --help

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

Настройка Docker Env

С учетом сказанного, чтобы создать Docker Env, нам нужна пара вещей.

  1. Нам нужно сделать изображение нашего приложения для Docker, чтобы использовать
  2. Нам нужно каким -то образом координировать все базы данных что наше приложение использует

Для первого пункта это то, что за Dockerfile для. A Dockerfile это файл, который определяет аргументы командной строки, необходимые для настройки и запуска приложения. На английском языке это файл, который указывает минимум, необходимый для настройки и запуска приложения.

Ниже приведен пример Dockerfile :

FROM python:3.8

WORKDIR /src

COPY ./requirements.txt .

RUN pip install -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["flask", "run", "--host", "0.0.0.0"]

Что в Dockerfile

Итак, краткий обзор того, что все:

Первая строка указывает, что мы основываем изображение нашего приложения с Python 3.8 Изображение

  • Поскольку мы можем создать наше изображение с других изображений, мы в полной мере пользуемся преимуществами этого
  • Дополнительные изображения можно найти в Dockerhub
  • Мы указываем, какой тег/версию мы хотим с помощью толстой кишки с тегом, так что здесь Python: 3.8 указывает Python в 3.8 ярлык

Вторая строка устанавливает рабочий каталог для контейнера. Это важно, так как именно это будет жить.

Третья строка копий Требования.txt Файл в наш рабочий каталог. Мы могли бы скопировать все сразу Но на самом деле есть важная причина, по которой мы не будем объяснены дальше.

Четвертая строка запускает любую команду, которую мы перечислили. Итак, здесь он устанавливает наши пакеты Python из Требования.txt файл.

  • Мы делаем это отдельно, когда Docker кэширует любые внешние пакеты, которые нам могут понадобиться, в зависимости от изменений в Требования.txt (или package.json для npm)
  • Если бы мы этого не делали, то Docker просто в конечном итоге сбрасывал кэшированные пакеты каждый раз, тратя много времени, которое можно было бы сэкономить

Пятая строка копирует остальные файлы из каталога нашего приложения в рабочий каталог. Если бы мы хотели, мы могли бы также добавить его в другую подкатанок, и это будет выглядеть так:

COPY . ./my-subdirectory

Шестая строка раскрывает для нас порт для доступа к контейнеру. Так что это был бы порт 5000 здесь.

Последняя строка содержит команду по умолчанию для выполнения при запуске контейнера. Обратите внимание, что каждая часть команды находится в массиве.

  • Обратите внимание, что этот массив строк является предпочтительным способом сделать это, и что мы должен Обернуть каждую команду фрагмент должен быть заверен в двойные цитаты (“), так как он проанализирован как массив JSON

Docker Compose

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

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

Вот где Docker-Compose Приходит (и Kubernetes, когда вы масштабируете, но это другая тема). Вместо того, чтобы вручную начинать и создавать контейнеры служб, от которых зависит ваше приложение, вы можете использовать Docker-compose.yml Файл для автоматизации больших частей этого.

Проверьте следующую ссылку на пример Docker-compose.yml Файл Анкет

К сожалению, это не будет полным руководством по созданию файла Docker Compose, но я рассмотрю детали.

Итак, в файле у нас есть ниже (плюс или минус некоторые комментарии):

version: '3.5' # Docker compose version
services:
  app:
    build:
      context: .
    # Binding the current working directory to the new container
    volumes:
      - .:/
    # The working directory in the app Dockerfile
    working_dir: ''
    command: ''
    links:
      - app-redis
    # ENV configuration
    env_file: .env
    # Additional app secrets
    environment:
      APP_TOKEN: /run/secrets/app_token
    secrets:
      - app_token
    ports:
      - '5000:5000'
  app-redis:
    image: redis:5
    ports:
      - '6379:6379'
# App secret registration
secrets:
  app_token:
    file: app_token.txt

Вообще говоря, в файле Compose есть три основные части:

  • Версия Docker Compose мы хотим
    • Указание версии Docker Compose важно, так как определенные свойства недоступны в других версиях, проверьте Docker Compose V3 Docs для большего
  • регистрация услуг
  • Зарегистрирование секретов контейнера

В разделе для регистрации наших услуг у нас есть ниже:

  • Настройка нашего контейнера приложения Python
    • Связывание Наш контейнер на другой сервис (Redis)
    • Привязывание нашего рабочего каталога, чтобы мы могли прожить обновление контейнера
    • Добавление файла .env
    • Добавление нашего App Secret
    • разоблачение портов и команды начала
  • Настройка контейнера Redis
    • добавление изображения для создания контейнера из
    • разоблачение портов

Обратите внимание, что Ссылки Собственность, чтобы явно сказать, что app-redis Сервис является зависимостью для нашего приложения Python. Это означает, что мы получаем доступ к нашей базе данных в нашем приложении Flask, чем обычно, но мы доберемся до этого.

Требуемые обновления нашего приложения Python

Теперь, когда у нас есть Docker-compose.yml Файл, мы не можем получить доступ к нашему экземпляру Redis так же, как мы можем думать. Поэтому вместо использования Localhost Чтобы получить доступ к нашему приложению Python на наш экземпляр Redis, нам нужно обновить его, чтобы он использовал имя службы, а также так:

# Fetch.py
# Std lib imports
import os
import json
from pathlib import Path

## Lib Imports
import redis
import requests
from dotenv import load_dotenv

# Global Module Var
isDocker = os.getenv('IS_DOCKER')

cacheHost = 'app-redis'
# ...Extra code
red_cache = redis.Redis(host = cacheHost, port = 6379)
# ...Rest of the module's implementation

Довольно быстро и легко, и с этим мы можем запустить Docker-Compose Up Внутри нашего каталога приложений и запустите приложение Flask.

Вывод

Таким образом, мы суммировали, как быстро докеризировать приложение Python. Это включало ниже:

  1. Создание Dockerfile с:
    • изображение, на котором мы основываем приложение
    • Содержимое, которое мы копируем
    • Любые команды терминала, которые мы хотим запустить
    • команда запуска
    • порт для разоблачения
  2. Создание Docker-compose.yml Файл, который имел:

    • Версия Docker Compose
    • Список услуг, которые будут созданы и запускаются
    • Указанные услуги должны будут указать, связаны ли они друг с другом
    • Кроме того, у сервиса с нашим приложением Python была дополнительная .env и секретная настройка
    • Любые секреты, которые мы хотели в нашем приложении

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

Оригинал: “https://dev.to/wilsonj806/dockerizing-a-python-app-2ee”