Обзор
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, нам нужна пара вещей.
- Нам нужно сделать изображение нашего приложения для Docker, чтобы использовать
- Нам нужно каким -то образом координировать все базы данных что наше приложение использует
Для первого пункта это то, что за 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. Это включало ниже:
- Создание Dockerfile с:
- изображение, на котором мы основываем приложение
- Содержимое, которое мы копируем
- Любые команды терминала, которые мы хотим запустить
- команда запуска
- порт для разоблачения
Создание
Docker-compose.yml
Файл, который имел:- Версия Docker Compose
- Список услуг, которые будут созданы и запускаются
- Указанные услуги должны будут указать, связаны ли они друг с другом
- Кроме того, у сервиса с нашим приложением Python была дополнительная .env и секретная настройка
- Любые секреты, которые мы хотели в нашем приложении
Конечным результатом является приложение, зависимости которых выполняются Docker а не локальная машина. Это приводит к среде разработки, которая работает и настроена последовательно каждый раз.
Оригинал: “https://dev.to/wilsonj806/dockerizing-a-python-app-2ee”