Разверните среду разработки Django + MySQL 8 с помощью Docker

Docker Django

Некоторое время назад я переустановил систему, а потом не сделал резервную копию, поэтому среда разработки на компьютере пропала.

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

Я недавно изучаю Docker, разве это не решает мою текущую проблему? Причем, не только переустанавливая систему в этот раз, но и не боясь переустановки в будущем, пока вы держите файлы Dockerfile и docker-compose, независимо от того, какая среда, можно легко запустить одну команду.

Перед развертыванием среды разработки Python мы использовали virtualenv или Pipenv. После использования Docker на этот раз, по сравнению с ним, Docker более удобен, я подробно расскажу о нем ниже.

Dockerfile

FROM python:3.6.8

ENV PYTHONUNBUFFERED 1

RUN mkdir -p /code
COPY ./requirements.txt /code

WORKDIR /code

RUN sed -i "s/archive.ubuntu./mirrors.aliyun./g" /etc/apt/sources.list
RUN sed -i "s/deb.debian.org/mirrors.aliyun.com/g" /etc/apt/sources.list

RUN apt-get clean && apt-get -y update && \
    apt-get -y install libsasl2-dev python-dev libldap2-dev libssl-dev libsnmp-dev
RUN pip3 install --index-url https://mirrors.aliyun.com/pypi/simple/ --no-cache-dir -r requirements.txt

COPY ./* /code/

Используйте Dockerfile для создания образа, версия Python 3.6.8, скопируйте исходный код в контейнер/codeсодержание.

docker-compose

version: '3'

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    image: web
    container_name: web
    hostname: web
    restart: always
    command: python /code/manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/web
    ports:
      - "8000:8000"
    depends_on:
      - mysql  

  mysql:
    image: mysql
    container_name: mysql
    hostname: mysql
    restart: always
    command: --default-authentication-plugin=mysql_native_password --mysqlx=0
    ports:
      - 3306:3306
    volumes:
      - ./db:/var/lib/mysql
    environment:
      - MYSQL_HOST=localhost 
      - MYSQL_PORT=3306 
      - MYSQL_DATABASE=dev
      - MYSQL_USER=dev
      - MYSQL_PASSWORD=123456
      - MYSQL_ROOT_PASSWORD=123456

Используйте docker-compose для размещения контейнеров, запустите всего два сервиса,webСлужба — это служба Django в фоновом режиме,mysqlэто служба базы данных.

Следует отметить три вещи:

  • webиспользование службыdepends_onкоманда, что означает зависимость отmysqlСлужить.
  • mysqlнужно добавить услугу--default-authentication-plugin=mysql_native_passwordЗаказ. Потому что, начиная с MySQL 8.0, правило шифрования по умолчанию использует caching_sha2_password, который наш клиент не поддерживает. Ранее использовался mysql_native_password.
  • использоватьvolumesЧтобы сохранить данные, иначе данные будут потеряны после удаления контейнера.

requirements

Django==2.2.11
mysqlclient==1.4.6

Запустите пакет pip, требуемый Django, и версия Django должна быть не ниже 2.0, иначе будет сообщено об ошибке.

Django settings

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dev',
        'USER': 'dev',
        'PASSWORD': '123456',
        'HOST': 'mysql',
        'PORT': '3306'
    }
}

Настройте информацию о базе данных в файле настроек Django, и содержимое должно соответствовать docker-compose.

Следует отметить, что HOST должен быть настроен как имя службы в docker-compose, в моем случае этоmysql. Настроено на другое, такое как localhost или 127.0.0.1, сообщит об ошибке.

Поскольку Docker настраивает локальную сеть при запуске, вы можетеmysqlРазрешите контейнер соответствующей службы, и соответствующая служба не находится на локальном хосте.

Run

Используйте следующую команду для создания образа.

$ docker-compose -f ./docker-compose.yml build

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

$ docker-compose -f ./docker-compose.yml up

Устранение неполадок

В процессе развертывания вы можете столкнуться со следующими ошибками, которые в основном вызваны ошибками конфигурации. Если это произойдет, обязательно внимательно проверьте конфигурацию, если она совпадает с текстом, проблем не будет.

  • 'Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory'
  • django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
  • django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")
  • django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")
  • django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on '127.0.0.1' (115)")
  • django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

Я также столкнулся с более сложной проблемой:

[Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

Я думал, что мой пароль был установлен неправильно.Долго проверяя, я не нашел проблему.Позже я нашел объяснение в Интернете и просто проигнорировал его.

That is just a warning printed by during database file initialization (mysqld --initialize-insecure). The root user with password is created later while the database is listening only on the unix socket.

Справочная документация:

fusion blender.net/Django-Valium-…

GitHub.com/docker-case пациент…

у-у-у. Краткое описание.com/afraid/4 oh ah 4 87…