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

Docker Development Workflow – Руководство с колбой и Postgres

Автор оригинала: FreeCodeCapm Team.

Тимоти КО

Докер, один из последних кразер, является удивительным и мощным инструментом для упаковки, доставки и эксплуатации приложений. Однако понимание и настройка Docker для вашего конкретного приложения могут занять немного времени. Так как Интернет наполнен концептуальными гидами, я не буду слишком глубоким концептуально о контейнерах. Вместо этого я объясню, что каждая строка я пишу означает, и как вы можете применить это к вашему конкретному приложению и конфигурации.

Почему докер?

Я являюсь частью некоммерческой прибыли студентов, называемый Hack4Faind в UIUC, где мы разрабатываем технические проекты для некоммерческих организаций, чтобы помочь им в дальнейшем их миссию. Каждый семестр у нас есть несколько проектных команд из 5-7 студенческих разработчиков программного обеспечения, с множеством уровней навыков, включая студентов, которые только закончили свой первый курс компьютерных наук в колледже.

Поскольку многие не прибыли часто просят для веб-приложений, я провел колбу котельной, чтобы позволить командам быстро получить свои службы API BackeND REST API. Обычные коммунальные функции, структура приложений, базы данных и соединения все снабжены вместе с документацией для настройки, лучших практик кодирования и шаги для развертывания Heroku.

Вопросы с окружающей средой и зависимостями развития

Однако, поскольку мы на борту новых студенческих разработчиков программного обеспечения каждый семестр, команды проведут много времени настройки и устранения неисправностей. У нас часто бывали несколько членов, развивающихся в разных операционных системах, и перевели на множество проблем (Windows, указываю на вас). Хотя многие из этих проблем были тривиальными, например, запуск правильной версии базы данных PostgreSQL с нужным пользователем/паролем, он потерял время, которое могло бы быть введено в сам продукт.

В дополнение к этому, я написал только документацию для пользователей MacOS только для инструкций Bash (у меня есть MAC), и по сути, и по существу, оставленные пользователи Windows и Linux. Я мог бы погрузить некоторые виртуальные машины и снова задокументировал настройку для каждой ОС, но почему я сделаю это, если есть докер?

Введите Docker

С докером все приложение можно выделить в контейнерах, которые можно портировать с машины на машину. Это обеспечивает последовательные среды и зависимости. Таким образом, вы можете «построить один раз, бежать где угодно», и разработчики теперь смогут устанавливать только один вещь – Docker – и запустите пару команд, чтобы получить приложение. Новички смогут быстро начать развиваться, не беспокоясь о своей среде. Непрофилы также смогут быстро внести изменения в будущем.

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

Краткий обзор компонентов Docker Core

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

Docker Images.

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

Контейнеры докера

Контейнеры Docker – это экземпляры документов докера. Они включают в себя операционную систему, код приложения, время выполнения, системные инструменты, системные библиотеки и так далее. Вы можете соединить несколько контейнеров докеров вместе, например, приложение Node.js в одном контейнере, который подключен к контейнеру базы данных Redis. Вы запустите контейнер докера с Докер начать Отказ

Docker Реестры

Реестр Docker – это место для вас для хранения и распространения изображений докера. Мы будем использовать Docker Images в качестве наших базовых изображений из DockerHub, бесплатный реестр, организованный докер.

Состав Pocker

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

Пример докера с колбой и postgres

Со всеми компонентами докера, давайте отправимся на создание среды разработки докеров с приложением Flask с использованием Postgres в качестве хранилища данных. Для оставшейся части этого поста в блоге я буду ссылаться на Колбу ботина , репозиторий, который я упоминал ранее для Hack4Fakt.

В этой конфигурации мы будем использовать Docker, чтобы построить два изображения:

  • приложение – приложение колбы подается в порту 5000
  • Postgres – База данных Postgres подается в порту 5432

Когда вы посмотрите на главный каталог, есть три файла, которые определяют эту конфигурацию:

  • Dockerfile – скрипт, состоящий из инструкций для настройки приложение контейнеры. Каждая команда автоматическая и последовательно выполняется. Этот файл будет расположен в каталоге, в котором вы запускаете приложение ( Python Manage.py Runserver или Python app.py или Начните NPM Mail – некоторые примеры). В нашем случае он находится в главном каталоге (где manage.py находится). Dockerfile принимает Инструкции по доке Отказ
  • .dockerignore – Указывает, какие файлы не включают в контейнер. Это так же, как .gitignore Но для контейнеров докеров. Этот файл соединен с DockerFile.
  • Docker-Compose.yml – файл конфигурации для составляющей докера. Это позволит нам построить оба приложение и Postgres Изображения одновременно определяют тома и укажите, что приложение зависит от Postgres и установите необходимые экологические переменные.

Примечание: Есть только один докер для двух изображений, потому что мы будем принимать официальный образ докера Postgres из Dockerhub! Вы можете включать свои собственные Postgres Image, написав свой собственный DockerFile для него, но нет смысла.

Dockerfile.

Просто уточнить снова, этот докер для приложение контейнер. В качестве обзора, вот вся докерафиль – это по существу получает базовое изображение, копирует приложение OVER, устанавливает зависимости и устанавливает определенную переменную среды.

FROM python:3.6
LABEL maintainer "Timothy Ko "
RUN apt-get update
RUN mkdir /app
WORKDIR /app
COPY . /app
RUN pip install --no-cache-dir -r requirements.txt
ENV FLASK_ENV="docker"
EXPOSE 5000

Поскольку это приложение Flask использует Python 3.6, мы хотим среду, которая поддерживает ее и уже установлена. К счастью, Dockerhub Имеет официальный образ, который установлен на вершине Ubuntu. В одной строке у нас будет базовая форма Ubuntu с Python 3.6, Virtualenv и Pip. Есть тонны изображений на Dockerhub, но если вы хотите начать с свежих изображений Ubuntu и построить его на вершину, вы могли бы сделать это.

FROM python:3.6

Затем я обратите внимание, что я сопровождающий.

LABEL maintainer "Timothy Ko "

Теперь пришло время добавить приложение Flask на изображение. Для простоты я решил скопировать приложение под /приложение каталог на нашем образе докера.

RUN mkdir /app
COPY . /app
WORKDIR /app

Workdir по сути – CD в Bash, и Скопировать Копирует определенный каталог для предоставленного каталога на изображении. Добавить это еще одна команда, которая делает то же самое, что и Скопировать , но это также позволяет добавить репозиторий из URL. Таким образом, если вы хотите клонировать вашу репозиторий Git вместо того, чтобы копировать его из местного хранилища (для постановки и производства), вы можете использовать это. Скопировать Однако следует использовать большую часть времени, если у вас нет URL. Каждый раз, когда вы используете Беги , Скопировать , От или CMD Вы создаете новый слой в вашем образе докера, который влияет на то, как Docker Stores и кэширует изображения. Для получения дополнительной информации о передовых методах и наслоении см. Dockerfile лучшие практики Отказ

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

RUN pip install --no-cache-dir -r requirements.txt

Но сказать, что у вас есть приложение узла вместо колбе – вместо этого пишут Запустите NPM Установить Отказ Следующим шагом – рассказать колбу, чтобы использовать конфигурации Docker, которые я жесткокодировал в config.py Отказ В этой конфигурации колба будет подключаться к правильной базе данных, которую мы будем настроить позже. Поскольку у меня было производство и регулярные конфигурации развития, я сделал это, чтобы колба выбрала бы конфигурацию докеров, когда Flask_env Переменная среды установлена на Докер Отказ Итак, нам нужно установить это в нашем приложение изображение.

ENV FLASK_ENV="docker"

Затем выставляйте порт (5000) приложение Flask на:

EXPOSE 5000

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

В любое время вы создаете свое изображение, эти следующие команды будут запущены. Теперь вы можете построить это изображение с Sudo Docker Build -t приложение. Отказ Однако, когда вы запускаете его с Sudo Docker запустить приложение Чтобы запустить контейнер Docker, приложение будет работать в ошибке подключения к базе данных. Это потому, что вы еще не предоставили базу данных.

Docker-Compose.yml.yml.yml

Docker Compose позволит вам сделать это и построить свой приложение изображение одновременно. Весь файл выглядит так:

version: '2.1'services:  postgres:    restart: always    image: postgres:10    environment:      - POSTGRES_USER=${POSTGRES_USER}      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}      - POSTGRES_DB=${POSTGRES_DB}    volumes:      - ./postgres-data/postgres:/var/lib/postgresql/data    ports:      - "5432:5432"  app:    restart: always    build: .    ports:      - 5000:5000    volumes:      - .:/app

Для этого конкретного хранилища я решил использовать версию 2.1, так как мне было более комфортно, и у него было еще несколько гидов и учебных пособий – да, это мои единственные рассуждения для не используя версию 3. С версии 2, вы должны предоставить » Услуги »или изображения, которые вы хотите включить. В нашем случае это приложение и Postgres (Это просто имена, к которым вы можете ссылаться, когда вы используете команды docker-compose. Вы называете их База данных и API Или все, что плавает на лодке).

Postgres Image.

Глядя на службу Postgres, я указываю, что это Postgres: 10 Изображение, которое является еще одним изображением Dockerhub. Это изображение представляет собой изображение Ubuntu, которое установлена Postgres и автоматически запустит сервер Postgres.

postgres:  restart: always  image: postgres:10  environment:    - POSTGRES_USER=${USER}    - POSTGRES_PASSWORD=${PASSWORD}    - POSTGRES_DB=${DB}  volumes:    - ./postgres-data/postgres:/var/lib/postgresql/data  ports:    - "5432:5432"

Если вы хотите другую версию, просто измените «10» на что-то еще. Чтобы указать, какой пользователь, пароль и база данных вы хотите внутри Postgres, вы должны заранее определить переменные среды – это реализуется в официальных Postgres Docker Image Dockerfile. В этом случае Postgres Изображение введет $ Пользователь , $ Пароль и $ БД Переменные среды и делают их Postgrees_user , Postgres_password и Postgrees_db Обязательные переменные внутри Контейнер Postgres. Обратите внимание, что $ Пользователь И другие переменные среды впрыскиваются переменные среды, указанные в вашем собственном компьютере (более конкретно, процесс командной строки, который вы используете для запуска команды Docker-Compose UP , введенные данные, это позволяет не принимать свои учетные данные в публичный репозиторий.

Docker-Compose также автоматически вводит переменные среды, если у вас есть .env Файл в том же каталоге, что и ваш Docker-Compose.yml файл. Вот пример файла .env для этого сценария:

USER=testusrPASSWORD=passwordDB=testdb

Таким образом, наша база данных PostgreSQL будет названа testdb с пользователем под названием Testusr с паролем пароль.

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

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

  • Объемы докера
  • Местные монтирование каталога

Я решил монтировать его на локально, чтобы ./postgres-data/postgres , но это может быть где угодно. Синтаксис всегда [Хост]: [Контейнер] Отказ Это означает любые данные из /var/lib/postgresql/data на самом деле хранится в ./postgres-data Отказ

volumes:- ./postgres-data/postgres:/var/lib/postgresql/data

Мы будем использовать тот же синтаксис для портов:

ports:- "5432:5432"

изображение приложения

Затем мы определим приложение изображение.

app:  restart: always  build: .  ports:    - 5000:5000  volumes:     - .:/app  depends_on:    - postgres  entrypoint: ["python", "manage.py","runserver"]

Сначала мы определим это, чтобы иметь Перезапуск: всегда Отказ Это означает, что он будет перезапущен всякий раз, когда он не будет. Это особенно полезно, когда мы строим и начнем эти контейнеры. приложение вообще запускается до Postgres , что означает, что приложение Постараюсь подключиться к базе данных и сбой, поскольку Postgres еще не работает. Без этого свойства приложение просто остановит, и это конец этого.

Затем мы определяем, что мы хотим, чтобы эта сборка была докерафилом, который находится в этом текущем каталоге:

build: .

Этот следующий шаг довольно важен для сервера Flask, чтобы перезапустить всякий раз, когда вы измените любой код в локальном хранилище. Это очень полезно, поэтому вам не нужно снова восстановить ваше изображение снова и снова, чтобы увидеть ваши изменения. Для этого мы делаем то же самое, что мы сделали для Postgres : Мы заявляем, что /приложение Каталог внутри контейнера будет то, что находится в. (текущий каталог). Таким образом, любые изменения в вашем местном репо будут отражены внутри контейнера.

volumes:  - .:/app

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

depends_on:  - postgres

Наконец, нам нужно предоставить команду, которая вызывается, чтобы начать наше приложение. В нашем случае это Python Manage.py Runserver Отказ

entrypoint: ["python", "manage.py","runserver"]

Одно предупреждение для колбе – это то, что вы должны явно обратите внимание, какой хост (порт) вы хотите запустить его, и хотите ли вы, чтобы он был в режиме отладки при запуске его. Так в Manage.py Я делаю это с:

def runserver():    app.run(debug=True, host='0.0.0.0', port=5000)

Наконец, создайте и запустите свой приложение Flask и Postgres, используя вашу командную строку:

docker-compose builddocker-compose up -ddocker-compose exec app python manage.py recreate_db

Последняя команда существенно создает схему базы данных, определенную моим приложением Flask в Postgres.

Вот и все! Вы должны иметь возможность увидеть приложение Flask, работающее на http://localhost: 5000!

Команды докера

Вспоминая и поиск команд докеров может быть довольно разочаровывающим в начале, поэтому Вот список их! Я также написал кучу обычно используемых в моих Флянка Boaterplate Docs Если вы хотите обратиться к этому.

Заключение

Докер действительно позволяет командам разрабатывать намного быстрее со своей переносимостью и последовательной средой по платформам. Хотя я прошел только с помощью Docker для разработки, Docker Excels, когда вы используете его для непрерывной интеграции/тестирования и в развертывании.

Я мог бы добавить еще пару строк и иметь полную настройку производства с Nginx и Gunicorn. Если бы я хотел использовать Redis для сеанса кэширования или в качестве очереди, я мог бы сделать это очень быстро, и все в моей команде смогут иметь такую же среду, когда они перестроили свои изображения докера.

Не только то, что я мог бы раскрутить 20 экземпляров приложения колбы в считанные секунды, если я хотел. Спасибо за прочтение!:)

Если у вас есть какие-либо мысли и комментарии, не стесняйтесь оставить комментарий ниже или напишите мне на TK2@illinois.edu! Кроме того, не стесняйтесь использовать свой код или поделиться этим со своими сверстниками!