Контейнерное развертывание Django-Docker: развертывание Django-Docker-MySQL

Docker

В предыдущей главе мы успешно создали контейнерный проект 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.