Подключение к локальной базе данных MySQL из докера приложения django - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь докернизировать свое приложение Django с помощью Docker, но у меня возникают некоторые проблемы с подключением к базе данных mysql, поскольку я не очень разбираюсь в Docker. У меня есть пара вопросов:

  1. Я установил mysql и настроил базу данных локально на моем компьютере, должен ли я использовать образ mysql и создать службу db в моем docker-composeслишком ? Разве Django не должен нормально подключаться к mysql, как это было, когда он не докеризован?

  2. Если база данных размещена на сервере, то установлен ли mysql на этом сервере? Нужно ли использовать изображение mysql для подключения к базе данных?

Вот мой docker-compose.yml:

version: '3.7'

services:
  web:
    build: ./appchat
    command: python appchat/manage.py runserver
    ports:
      - 8000:8000
      - "3306"
    network_mode: "host"

А вот настройки базы данныхв файле settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'root',
        'PASSWORD': 'root',
        'NAME': 'company',
        'PORT': '3306',
    }
}

Ошибка при запуске файла docker-compose:

django.db.utils.OperationalError: (2002, "Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)")

Любая помощь будет принята с благодарностью. Спасибо.

1 Ответ

0 голосов
/ 06 октября 2019

Приложение и его база данных могут работать на одном и том же хосте или на разных хостах, а также в Docker или нет.

Если приложение и его база данных работают на разных хостах, существуетнет ничего необычного в настройке этого в Docker. Настройте ваше приложение с DNS-именем сервера базы данных. (Я бы рекомендовал передавать это через переменные среды, а не изменять файл settings.py.)

Синтаксис Docker Compose:

environment:
  MYSQL_HOST: mysql.example.com

Если оба работают в одной и той же настройке Docker, то Dockerобеспечивает внутреннюю настройку DNS для одного, чтобы достигнуть другого. В Docker Compose, , вы можете использовать клавишу services: в качестве имени хоста ;в обычном Docker, вам нужно вручную docker network create, но тогда этот трюк работает.

Пример простого Docker:

docker network create app
docker run --net app --name mysql -v $PWD/mysql:/var/lib/mysql/data mysql
docker run --net app --name app -e MYSQL_HOST=mysql myapp

Если база данных работает на том жехост в качестве приложения, но вне Docker, и хост - это система Mac или Windows, на которой запущено приложение Docker Desktop, тогда существует специальное host.docker.internal имя хоста

docker run -e MYSQL_HOST=host.docker.internal myapp

ДляУ хоста native-Linux этот ярлык не существует, и вам нужно узнать IP-адрес хоста, но затем вы можете рассматривать это как первый случай.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...