В предыдущей главе мы успешно создали контейнерный проект Django, и в качестве базы данных использовалась Sqlite по умолчанию. Хотя Sqlite прост и удобен в использовании, он обычно выбирает более эффективную и надежную базу данных, такую как MySQL, при онлайн-развертывании.
В этой главе будет изменен и построен проект контейнера Docker + Django + MySQL на основе предыдущей главы.
Docker-compose
Когда мы будем изучать объектно-ориентированные языки программирования, мы постараемся изо всех сил изолировать модули с независимыми функциями, что удобно для повторного использования и обслуживания.
То же самое касается контейнеров. Хотя теоретически возможно запихнуть все компоненты в один контейнер, лучше иметь каждый модуль в отдельном контейнере, пока поддерживается необходимая коммуникация.
Тем не менее, теперь нам нужны два контейнера для этого урока:
- Контейнер Django с именем приложения
- Контейнер MySQL с именем db
Так как же создать образ MySQL? Не волнуйтесь, такой часто используемый образ был официально собран для вас, просто перетащите его из репозитория в локальный.
Изменить то, что было написано в предыдущей главеdocker-compose.yml
, добавьте контейнер MySQL:
version: "3"
services:
app:
restart: always
build: .
command: bash -c "python3 manage.py migrate && python3 manage.py runserver 0.0.0.0:8000"
volumes:
- .:/code
ports:
- "8000:8000"
depends_on:
- db
db:
image: mysql:5.7
volumes:
- "./mysql:/var/lib/mysql"
ports:
- "3306:3306"
restart: always
environment:
- MYSQL_ROOT_PASSWORD=mypassword
- MYSQL_DATABASE=django_app
app
контейнерcommand
Изменена команда для выполнения переноса данных перед запуском; добавлена конфигурацияdepends_on
, что означает, что этот контейнер должен ждатьdb
Контейнер можно запустить только после его запуска.
Проанализируйте недавно добавленноеdb
контейнер:
-
image
: Вытащите MySQL 5.7 из репозитория. Последней версией является MySQL 8, но очень жаль, что новая версия изменяет метод аутентификации для входа пользователя, что упрощает аутентификацию. В учебнике для простоты используется версия 5.7. позжеОбразец кода учебникадобавлено вmysql-8Разветвите и дайте метод работы, заинтересованные читатели могут проверить. -
volumes
: Определите том (фактически смонтируйте здесь), как упоминалось в предыдущей главе, он реализует сопоставление между хостом и каталогом контейнера. Функция состоит в том, чтобы сопоставить данные MySQL в контейнере с хостом. -
ports
: Коммуникационный порт MySQL по умолчанию — 3306. -
environment
: определите переменные среды контейнера и установите пароль пользователя root MySQL и имя базы данных.
Зачем использовать здесьрулон? Не лучше ли просто хранить данные в контейнере и изолировать их? Хранить данные в контейнере теоретически возможно, но есть фатальная проблема, то есть данные связаны с жизненным циклом контейнера: если однажды контейнер будет удален, данные в нем уйдут вместе с Ушел из жизни, ты легендарная фигура, которая удалила библиотеку и сбежала во всей компании. Имейте в виду, что жизненный цикл контейнера может быть очень коротким, а инструкции по удалению довольно плавными (docker-compose down
). Сопоставьте данные с хостом, и даже если контейнер будет удален, данные по-прежнему будут в безопасности на вашем сервере. Другими словами, внутри контейнера оченьПодходит для запуска приложений без сохранения состояния; Когда дело доходит до вещей с состоянием, таких как данные, вы должны хорошо подумать.
Dockerfile
Изменить следующийDockerfile
:
FROM python:3.7
ENV PYTHONUNBUFFERED 1
# 添加这两行
RUN apt-get update
RUN apt-get install python3-dev default-libmysqlclient-dev -y
RUN mkdir /code
WORKDIR /code
RUN pip install pip -U
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
Добавленные две строки кода устанавливают коннектор MySQL в системе.Подробнее см.официальная документация.
Другая конфигурация
Исправлятьrequirements.txt
, добавьте драйвер MySQL:
django==2.2
mysqlclient==1.3.14
Затем нужно изменитьdjango_app/settings.py
, установите базу данных в MySQL:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'django_app',
'USER': 'root',
'PASSWORD': 'mypassword',
'HOST': 'db',
'PORT': '3306',
'OPTIONS': {'charset': 'utf8mb4'},
}
}
Обратите внимание, что HOST заполнен именем контейнера, а именно db.
Вот и все. Следующий тест.
контрольная работа
Перед тестированием убедитесь, что никакая другая программа не занимает порт 3306, например MySQL, установленная на хосте.
Восстановите образ:
$ docker-compose build
Соберите и запустите контейнер:
$ docker-compose up
Creating network "django_app_default" with the default driver
Creating django_app_db_1 ... done
Creating django_app_app_1 ... done
Attaching to django_app_db_1, django_app_app_1
db_1 | 2019-10-06T12:24:57.183860Z 0 [Note] mysqld (mysqld 5.7.27) starting as process 1 ...
...
db_1 | 2019-10-06T12:24:58.120480Z 0 [Note] mysqld: ready for connections.
db_1 | Version: '5.7.27' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server (GPL)
app_1 | Operations to perform:
app_1 | Apply all migrations: admin, auth, contenttypes, sessions
app_1 | Running migrations:
app_1 | Applying contenttypes.0001_initial... OK
...
app_1 | Applying sessions.0001_initial... OK
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 06, 2019 - 12:24:58
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.
Открытый доступ в браузере127.0.0.1:8000
, и снова увидеть ракету Джанго.
**Примечание:** при первом запуске контейнера может появиться сообщение об ошибке, что вы не можете подключиться к MySQL, так как хотя контейнер db был запущен, инициализация не завершена; после перезапуска контейнера он нормально работать. Если он не работает должным образом после нескольких запусков, это другая причина, поэтому проверьте его.
Суммировать
В этой главе добавляется контейнер MySQL и реализуется совместная работа нескольких контейнеров.
В следующей главе будет реализован официально развернутый проект Docker + Django + MySQL + Nginx + Gunicorn.
- Если у вас есть какие-либо вопросы, пожалуйстаЛичный сайт ДьюсиОставьте сообщение, и я отвечу как можно скорее.
- Образец кода учебника:django-docker-tutorial
- Или напишите мне в приват:dusaiphoto@foxmail.com