В этой главе мы создадим контейнерный проект Django локально и познакомимся с тем, как работает Docker.
Предварительная подготовка
среда разработки
Хотя существует версия Docker для Windows, совместимость во всех аспектах не очень хорошая (установка также более хлопотная), поэтому читателям рекомендуется самостоятельно установить систему Linux или Mac, прежде чем учиться. Конечно, если вы готовы бросить, вы можете сделать это в Windows.
Не волнуйтесь, вы все равно сможете разрабатывать проекты Django под Windows в будущем, просто не используя Docker для разработки.
Установка программы
- Docker: Конечно, чтобы изучить Docker, вы должны установить программное обеспечение Docker (бесплатная версия сообщества), см. Способ установкиофициальная документация.
- Docker-compose: это инструмент, официально запущенный Docker для организации и запуска нескольких контейнеров.Способ установки см.официальная документация. Большая часть этого урока посвящена этому.
- Python3: В учебнике развертывается проект Django, поэтому, конечно, необходим Python3 (включая инструмент управления пакетами Python).pip).
Когда будете готовы, переходите к следующему шагу.
Создайте проект Джанго
Откройте терминал Linux/Mac и установите библиотеку Django:
$ pip install django==2.2
Создайте новый проект Django в удобном для вас месте (например, /home/):
$ django-admin startproject django_app
Перейдите в корневой каталог проекта:
$ cd django_app
Остальная часть учебника выполняется в этом каталоге.для удобства чтения, командная строка$Представляет в настоящее время в корневом каталоге проектаdjango_app/,mysql $означает, что в настоящее время находится в каталогеdjango_app/mysql/, при работе обратите внимание на текущий рабочий каталог.
Затем перенесите данные:
$ python manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
Applying contenttypes.0001_initial... OK
...
Applying sessions.0001_initial... OK
Подготовительная работа сделана.
Соберите проект с помощью Docker
Первое знакомство с Docker
Весь жизненный цикл Docker состоит из трех частей: образ (образ) + контейнер (контейнер) + репозиторий (репозиторий).
Контейнеры создаются из образов, что немного похоже на объектно-ориентированную концепцию: изображение — это класс, а контейнер — это объект после создания экземпляра класса.
зеркало— это шаблон только для чтения, который включает данные, необходимые для запуска контейнера. Образ может содержать полную операционную среду Linux с установленным только Python или другими программами, необходимыми пользователю.
контейнерЭто экземпляр, созданный образом, похожий на виртуальную машину, в которой может быть запущено конкретное приложение, а контейнеры изолированы друг от друга.
складКонцепции похожи на Git и Github, и их очень легко понять, если вы их использовали. Репозиторий по умолчанию, используемый Docker, — это официально поддерживаемый общедоступный репозиторий Docker hub, операции загрузки и извлечения из которого аналогичны Git.
Это все, что вам нужно знать на данный момент, давайте поймем это на практике.
Hello-world
Чтобы убедиться, что Docker установлен правильно, выполните следующую команду:
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
...
latest: Pulling from library/hello-world
1b930d010525: Pull complete
...
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
Если все в порядке, терминал распечатает приветственное заявление, как показано выше.docker run hello-worldСмысл инструкции такой: использовать имя какhello-worldimage для создания контейнера и его запуска. Если это недоступно локальноhello-worldобраз, Docker автоматическискладНайдите и скачайте зеркало с таким же названием.
мы можем использоватьdocker imagesПроверьте существующие зеркала локально:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 9 months ago 1.84kB
Столбцы таблицы — это имя образа, версия, идентификационный номер, время создания и размер.
Вы также можете просматривать существующие контейнеры локально:
$ docker ps -a
CONTAINER ID IMAGE .. CREATED ..
38cb03a96dca hello-world .. 2 minutes ago ..
В дополнение к этому есть несколько очень полезных базовых директив:
docker rmi [images ID] # 删除此 ID 的镜像
docker container stop [container ID] # 停止此 ID 的容器
docker container start [container ID] # 启动此 ID 的容器
docker container rm [container ID] # 删除此 ID 的容器
Поскольку во время тестирования часто генерируются изображения, вы обязательно будете использовать приведенную выше команду для просмотра и удаления бесполезных образов и контейнеров.
После завершения небольшого теста контейнер Django официально собран.
Dockerfile
Docker позволяет создавать образы из файлов конфигурации в текстовом формате, имя по умолчаниюDockerfile. Итак, создайте новый файл в корневом каталоге проекта.Dockerfile, написать:
# 从仓库拉取 带有 python 3.7 的 Linux 环境
FROM python:3.7
# 设置 python 环境变量
ENV PYTHONUNBUFFERED 1
# 创建 code 文件夹并将其设置为工作目录
RUN mkdir /code
WORKDIR /code
# 更新 pip
RUN pip install pip -U
# 将 requirements.txt 复制到容器的 code 目录
ADD requirements.txt /code/
# 安装库
RUN pip install -r requirements.txt
# 将当前目录复制到容器的 code 目录
ADD . /code/
Ключ к пониманию этих инструкций Docker — помнитьконтейнерСреда внутри изолирована от внешнего мира (хозяина), и они совершенно разные. другими словами,Чтобы выяснить, какие операции предназначены для хоста, а какие для контейнера.
FROM python:3.7Инструкция извлекает из репозитория среду операционной системы Linux (версия Linux — Debian), содержащую python 3.7.
RUNиWORKDIRИнструкции все для контейнера, и функция находится вв контейнереСоздайте каталог и установите его в качестве рабочего каталога. УведомлениехозяинНет такого каталога.
ADDКоманда появляется дважды.ADD requirements.txt /code/Это означает, что текущий каталог хоста (то есть каталог, в котором находится Dockerfile) будетrequirements.txtскопировать файл в контейнер/codeв каталоге.ADD . /code/Это означает скопировать все содержимое текущего каталога в контейнер/code/каталог, обратите внимание на тот, что посерединеточка.
Единственная библиотека, от которой зависит текущий проект, — это Django, поэтому создайте ее в корневом каталоге проекта.requirements.txtи писать:
django==2.2
Разве Django не был установлен раньше, зачем устанавливать его здесь? Причина в том, что он был установлен на хосте, а в контейнере нет Django!
Таким образом, текущая файловая структура выглядит следующим образом:
django_app
- Dockerfile
- requirements.txt
- manage.py
- django_app
- db.sqlite3
Файл конфигурации написан, давайте посмотримDocker-composeкак пользоваться.
Docker-compose
В онлайн-среде обычно нежелательно помещать все компоненты проекта в один и тот же контейнер;Поместите каждую отдельную функцию в отдельный контейнер, что удобно для повторного использования. Например, поместите код Django в контейнер A, поместите базу данных Mysql в контейнер B и так далее.
Поэтому на одном сервере может быть запущено несколько контейнеров, и каждый раз запускать по одной инструкции было бы слишком громоздко.Docker-composeИменно для решения этой проблемы он используется для организации нескольких контейнеров, а команды для запуска контейнеров прописываются в файле docker-compose.yml.docker-compose upВот и все. Таким образом, в учебнике также будет использоваться docker-compose для управления контейнерами.
Сначала убедитесь, что docker-compose успешно установлен:
$ docker-compose -v
docker-compose version 1.24.1, build 4667896b
После подтверждения создайте его в корневом каталоге проекта.docker-compose.ymlи писать:
version: "3"
services:
app:
restart: always
build: . # '点'代表当前目录
command: "python3 manage.py runserver 0.0.0.0:8000"
volumes:
- .:/code
ports:
- "8000:8000"
Давайте разберем, что означает каждый из них.
versionПредставляет версию docker-compose.yml, на данный момент последняя версия — 3, менять ее не нужно.
Затем определите имя, называемоеappконтейнер. Содержание позадиappКонфигурация контейнера:
-
restart: Помимо обычной работы контейнер будет перезапущен в любой момент, например, при обнаружении ошибки, сбое процесса, перезапуске докера и т. д. -
build: указывает содержащийDockerfileи создайте образ контейнера с помощью этого Dockerfile. обратите внимание на это".", представляющий текущий каталог. -
command: команда, которую необходимо выполнить во время работы контейнера. Это работающий сервер разработки, с которым мы знакомы. -
volumes:Объем, это очень важное понятие.Как было сказано ранее, контейнер полностью изолирован от хоста, но иногда его нужно подключать, например, часто обновляется код разрабатываемого нами Django проекта, причем обновление также зависит от таких программ, как Git, не очень удобно . Так что естьрулон, который определяет сопоставление между хостом и контейнером:"."Указывает текущий каталог хост-компьютера,":"является разделителем, а «/code» представляет собой каталог в контейнере. То есть текущая директория хоста и директория /code контейнера соединены, при обновлении кода Django текущей директории хоста соответственно обновляется и код в директории /code контейнера. Это как пробить дырку в контейнере, в каком-то смыслепрактичностьиизоляциякомпромисс.
Строго говоря, здесь
.:/codeнетрулон, но называетсяустанавливать, между ними есть разница, за исключением того, что docker-compose позволяет записывать монтирование в конфигурацию тома. будут обсуждаться в последующих главах.
-
ports: определяет сопоставление портов между хостом и контейнером. Изоляция контейнеров — это не только среда, но даже порты изолированы. Но веб-приложения не могут общаться с внешним миром без портов, поэтому здесь определено сопоставление порта 8000 хоста с портом 8000 контейнера, то есть для доступа к порту 8000 хоста. заключается в доступе к порту 8000 контейнера, но убедитесь, что порт не заблокирован другими портами.программа занята.
Конфигурация написана. Структура каталогов проекта теперь выглядит следующим образом:
django_app
- docker-compose.yml
- Dockerfile
- requirements.txt
- manage.py
- django_app
- db.sqlite3
контрольная работа
входная командаdocker-compose upЗапустите службу контейнера:
$ docker-compose up
Creating network "django_app_default" with the default driver
Building app
Step 1/8 : FROM python:3.7
3.7: Pulling from library/python
4a56a430b2ba: Pull complete
...
6933d3d46042: Pull complete
Digest: sha256:0f0e991a97426db345ca7ec59fa911c8ed27ced27c88ae9966b452bcc6438c2f
Status: Downloaded newer image for python:3.7
---> 02d2bb146b3b
Step 1/8 : FROM python:3.7
---> 02d2bb146b3b
...
Step 7/8 : RUN pip install -r requirements.txt
---> Running in 62a60a3003fe
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple
Collecting django==2.2 (from -r requirements.txt (line 1))
Downloading https://files.pythonhosted.org/packages/54/85/0bef63668fb170888c1a2970ec897d4528d6072f32dee27653381a332642/Django-2.2-py3-none-any.whl (7.4MB)
...
Installing collected packages: sqlparse, pytz, django
Successfully installed django-2.2 pytz-2019.2 sqlparse-0.3.0
...
Step 8/8 : ADD . /code/
---> cb23f483ffb6
Successfully built cb23f483ffb6
Successfully tagged django_app_app:latest
WARNING: Image for service app was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating django_app_app_1 ... done
Attaching to django_app_app_1
app_1 | Watching for file changes with StatReloader
app_1 | Performing system checks...
app_1 |
app_1 | System check identified no issues (0 silenced).
app_1 | October 05, 2019 - 15:03:15
app_1 | Django version 2.2, using settings 'django_app.settings'
app_1 | Starting development server at http://0.0.0.0:8000/
app_1 | Quit the server with CONTROL-C.
Вы можете видеть, что Docker успешно построил образ и контейнер в соответствии с требованиями файла конфигурации и запустил контейнер.
Откройте браузер и введите локальный IP-порт127.0.0.1:8000:
Видя маленькую ракету Джанго, проект успешно работает. в соответствии сCtrl + Cчтобы остановить работу сервера разработки.
После остановки сервера контейнер фактически все еще существует, он просто перестает работать. входить:
$ docker-compose down
Контейнер можно удалить.
Если вы хотите запустить контейнер в фоновом режиме, введите:
$ docker-compose up -d
Также, если вам нужно пересобрать образ, введите команду:
$ docker-compose build
Запускайте и останавливайте существующие контейнеры:
$ docker-compose start
$ docker-compose stop
Просто как тот.
Загрузка слишком медленная?
По хорошо известным причинам внутренняя сетевая среда очень сложна. При сборке образов часто приходится вытягивать ресурсы из удаленных репозиториев за границей, а скорость скачивания на иммобилайзере — настоящая головная боль.
Решение состоит в том, чтобы изменить ссылку на ресурс на внутренний зеркальный источник, такой как зеркальный источник Tsinghua.
Измените Dockerfile следующим образом:
FROM python:3.7
ENV PYTHONUNBUFFERED 1
# 添加 Debian 清华镜像源
RUN echo \
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-updates main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ buster-backports main contrib non-free\
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security buster/updates main contrib non-free\
> /etc/apt/sources.list
RUN mkdir /code
WORKDIR /code
# 添加 pip 清华镜像源
RUN pip install pip -U -i https://pypi.tuna.tsinghua.edu.cn/simple
ADD requirements.txt /code/
# 添加 pip 清华镜像源
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
ADD . /code/
Восстановите образ, и скорость загрузки будет такой же быстрой.
Содержание руководства использует источник Tsinghua, но для удобства чтенияЭта часть кода для замены источника опущена, читатель хорошо понимает.
Суммировать
В этой главе вы познакомились с рабочим процессом Docker и с легкостью создали контейнерный проект Django.
В следующей главе базы данных MySQL также добавляются к оркестровке контейнеров.
- Если у вас есть какие-либо вопросы, пожалуйстаЛичный сайт ДьюсиОставьте сообщение, и я отвечу как можно скорее.
- Образец кода учебника:django-docker-tutorial
- Или напишите мне: dusaiphoto@foxmail.com