Docker-Compose не может подключиться к MySQL - PullRequest
1 голос
/ 15 октября 2019

Я пытаюсь соединить проект Django с MySQL, используя docker.

У меня проблема при поднятии docker-compose. Там написано следующее сообщение об ошибке:

super (Connection, self). init (* args, ** kwargs2) django.db.utils.OperationalError: (2002, "Canне подключаться к серверу MySQL по 'db' (115) ")

Я использую порт 3307, должен ли я создать первую новую схему базы данных в моей локальной сети? Или как я могу это сделать, потому что мой порт по умолчанию - 3306, но если я пытаюсь его использовать, он говорит, что занят.

Мой код здесь:

Dockerfile


FROM python:3.7
ENV PYTHONUNBUFFERED 1
ENV LANG=C.UTF-8
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN apt-get update
RUN pip install -r requirements.txt
ADD . /code/


Docker-compose


    version: '2'

services:
  app:
    container_name: container_app
    build:
      context: .
      dockerfile: Dockerfile
    restart: always
    command: bash -c "python3 manage.py migrate && python manage.py shell < backend/scripts/setup.py && python3 manage.py runserver 0.0.0.0:8000"
    links:
      - db
    depends_on:
      - db
    ports:
      - "8000:8000"
  db:
    container_name: container_database
    image: mariadb
    restart: always
    environment:
      MYSQL_ROOT_HOST: 'host.docker.internal'
      MYSQL_DATABASE: 'container_develop'
      MYSQL_USER: 'root'
      MYSQL_PASSWORD: 'password'
      MYSQL_ROOT_PASSWORD: 'password'
    ports:
      - "3307:3307"

settings.py:


DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database_develop',
        'USER': 'root',
        'PASSWORD': 'password',
        'HOST': 'db',
        'PORT': 3307,
        'CHARSET': 'utf8',
        'COLLATION': 'utf8_bin',
        'OPTIONS': {
            'use_unicode' : True,
            'init_command': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED',
        },
    }
}

Дело в том, что у меня нигде нет базы данных, поэтому я использую ее локально, нужно лизагрузить базу данных на сервер и затем использовать порт, который мне предоставляет сервер? Есть ли способ использовать его локально из докера? Или установить его в докер? Так что я могу поделиться этим докером с другом, и он может использовать ту же базу данных?

Ответы [ 2 ]

3 голосов
/ 15 октября 2019

Ответ @Nico фиксировал доступность вашего сервиса извне контейнера, то есть, если попытаться получить к нему доступ с хоста, он должен работать.

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

Измените порт в соединении с 3307 на 3306

DATABASES = {
    'default' : {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'database_develop',
        'USER': 'root',
        'PASSWORD': 'password',
        'HOST': 'db',
        'PORT': 3306,
        'CHARSET': 'utf8',
        'COLLATION': 'utf8_bin',
        'OPTIONS': {
            'use_unicode' : True,
            'init_command': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED',
        },
    }
}
2 голосов
/ 15 октября 2019

В части "db", в вашем docker-compose:

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