Контейнеризация веб-приложений Django с помощью Docker

Docker Django
Контейнеризация веб-приложений Django с помощью Docker

В этой колонке я буду время от времени делиться некоторыми передовыми статьями о Django. Содержание сосредоточено на сводке навыков и опыта. Источники временно:

  1. Medium
  2. Twitterизвестный блогер

Если интересно, прошу обратить внимание и мотивировать.Ведь на перевод и организацию нужно время.Спасибо.

--

оригинал:Dockerizing Django for Development(с изменениями)
автор:Mark Winter
Переводчик:Про книга
Сложность: ✨✨
Рекомендуем: ✨✨✨

В этом посте я покажу, как использовать Docker для контейнеризации существующего проекта. Я выбрал случайный проект с GitHub, у которого есть общедоступныйissue, называемый Dockerization (используемый позже Dockerize), можно внести и использовать в качестве примера здесь.

Зачем делать докеризацию существующего веб-приложения Django в реальном мире? Причин много, но если у вас его нет, то просто играйте, лол

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

Проблемы с развертыванием приводят к потере времени, что приводит к лени, лень приводит к вредным привычкам и т. д. Например, лень может заставить вас решить использовать SQLite вместо Postgres. (Аннотация: Первая представляет собой файловую базу данных, развертывание которой не требуется)

Если вы не знаете, что такое Docker, вам просто нужно понимать его как гигантский virtualenv (своего рода виртуальная среда Python), который на самом деле не только содержит некоторые пакеты Python, но и использует Containers (контейнеры) для размещения всех зависимостей упакованы и объединены с приложениями, базами данных, рабочими процессами и т. д.


Docker

Ну, "говорить дешево, покажи мне какой-нибудь код", чувак.

Во-первых, у меня не было проблем с установкой Docker на Ubuntu и Mac OS, а вот на Windows — нет (смущение).

Чтобы сообщить Docker, как запускать ваше приложение в качестве контейнера, вы должны создать Dockerfile:

FROM python:3.6
ENV PYTHONUNBUFFERED 1

RUN mkdir /webapps
WORKDIR /webapps

# Installing OS Dependencies
RUN apt-get update && apt-get upgrade -y && apt-get install -y \
libsqlite3-dev

RUN pip install -U pip setuptools

COPY requirements.txt /webapps/
COPY requirements-opt.txt /webapps/

RUN pip install -r /webapps/requirements.txt
RUN pip install -r /webapps/requirements-opt.txt

ADD . /webapps/

# Django service
EXPOSE 8000

Затем мы смотрим на это построчно

Докер-образ

FROM python:3.6

Здесь используется образ из Docker Hub, который помогает нам настроить контейнер Ubuntu с уже установленным Python 3.6.

Переменные среды (ENV)

Вы можете создавать произвольные переменные среды, используя ключевое слово Env.

ENV PYTHONUNBUFFERED 1

Например, если вы использовали его для хранения ключей Django, вы могли бы написать:

ENV DJANGO_SECRET_KEY abcde0s&&$uyc)hf_3rv@!a95nasd22e-dxt^9k^7!f+$jxkk+$k-

Используйте это в своем коде:

import os
SECRET_KEY = os.environ['DJANGO_SECRET_KEY']

Выполнить команду (ПУСК)

Команды запуска Docker просты для понимания. Просто запустите команду внутри вашего контейнера. Я цитирую это, потому что docker создает несколько подконтейнеров, поэтому мне не нужно снова запускать ту же команду при перестройке контейнера.

RUN mkdir /webapps
WORKDIR /webapps

# Installing OS Dependencies
RUN apt-get update && apt-get upgrade -y && apt-get install -y \
libsqlite3-dev

RUN pip install -U pip setuptools

COPY requirements.txt /webapps/
COPY requirements-opt.txt /webapps/

RUN pip install -r /webapps/requirements.txt
RUN pip install -r /webapps/requirements-opt.txt

ADD . /webapps/

В этом случае мы создаем каталог /webapps для хранения нашего проекта.

WORKDIRЭто также самоочевидно. Это просто позволяет докеру узнать, что происходитRUNкаталог времени.

После этого мы устанавливаем зависимости ОС (apt-get — это инструмент управления пакетами ОС), а затем устанавливаем зависимости Python (pip — это инструмент управления пакетами Python).

Скопировать (COPY) и добавить (ADD)

COPYа такжеADDПодобные. Оба копируют файлы с вашего компьютера (хоста) в контейнер.

Открытый порт (EXPOSE)

Директива EXPOSE используется для сопоставления портов из Docker с хостом.

# Django service
EXPOSE 8000

Хорошо, как сейчас? Но как добавить больше контейнеров и заставить их работать вместе? Например, вам все еще нужен PostgreSQL в контейнере? Не волнуйтесь, мы продолжим читать.


Docker-Compose

Docker-compose— это инструмент для запуска нескольких контейнеров Docker. Представление представляет собой файл yml, вам просто нужно создать файл docker-compose.yml в папке вашего проекта.

version: '3.3'

services:
  # Postgres
  db:
    image: postgres
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_DB=postgres

  web:
    build: .
    command: ["./run_web.sh"]
    volumes:
      - .:/webapps
    ports:
      - "8000:8000"
    links:
      - db
    depends_on:
      - db

Здесь я использую образ Postgres из Docker Hub.

Теперь давайте изменимsettings.pyЧтобы настроить Postgres в качестве базы данных.

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'PASSWORD': 'postgres',
        'HOST': 'db',
        'PORT': '5432',
    }
}

Мы почти закончили. Позвольте мне рассказать о файле компоновки докеров.

Объемы (ОБЪЕМЫ)

Когда вы записываете файлы на общий том, файл также записывается в ваш контейнер.

volumes:
  - .:/webapps

Здесь текущий каталог (.) будет использоваться в контейнере как каталог /webapps.

LINKS

links:
  - db

Вы можете обратиться к другому контейнеру по его имени. Теперь, когда мы создали контейнер db для нашего Postgres, мы можем подключить его к нашему веб-контейнеру. Вы можете увидеть в нашем файле settings.py, который я использую'db'как ХОЗЯИН. (Здесь удивительно)

DEPENDS_ON

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

depends_on:
  - db

Command

Команда — это команда по умолчанию, которую контейнер запускает сразу после запуска.

Для нашего примера я создал скрипт Run_Web.sh, который будет запускать Migration, собирать статические файлы и запускать сервер разработки.

следующим образом:

#!/usr/bin/env bash

cd django-boards/
python manage.py migrate
python manage.py collectstatic --noinput
python manage.py runserver 0.0.0.0:8000

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

Вы можете получить доступ к своему контейнеру следующим образом:

docker-compose run web bash

Если вы хотите запустить его без доступа к самому контейнеру, просто измените последний параметр bash предыдущей команды, например:

docker-compose run web python manage.py migrate

То же самое касается и других команд:

docker-compose run web python manage.py test
docker-compose run web python manage.py shell

запустить докер

Наш Dockerfile, docker-compose.yml и run_web.sh готовы, и мы можем запустить их вместе:

docker-compose up

Проект здесь:GitHub.com/FF REIT ASA LV…

--

Конец текста


Пожалуйста, укажите источник:zhuanlan.zhihu.com/p/33855891

Если вы считаете, что такая статья полезна для вас, обязательно обратите внимание, спасибо