В этой колонке я буду время от времени делиться некоторыми передовыми статьями о Django. Содержание сосредоточено на сводке навыков и опыта. Источники временно:
Если интересно, прошу обратить внимание и мотивировать.Ведь на перевод и организацию нужно время.Спасибо.
--
оригинал: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
Если вы считаете, что такая статья полезна для вас, обязательно обратите внимание, спасибо