Некоторое время назад я переустановил систему, а потом не сделал резервную копию, поэтому среда разработки на компьютере пропала.
Когда я думаю о том, чтобы снова установить среду 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-…