Докеризация приложения Django + mySql: (2002, "Не удается подключиться к локальному серверу MySQL через сокет '/run/mysqld/mysqld.sock' (2)") ошибка

Я пытаюсь докеризировать мое приложение Django, которое использует mySql, но сталкиваюсь с некоторыми проблемами. Это первый раз, когда я использую Docker, поэтому, возможно, есть что-то базовое, чего я не понимаю.

Следуя некоторым онлайн-учебникам, вот мой Dockerfile:

FROM python:3.8
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD . /code/
RUN pip install --upgrade pip && pip install -r requirements.txt
RUN pip install mysqlclient
COPY . /code/

А это мой docker-compose:

version: '3'

services: 
  db:
    image: mysql:8
    ports:
      - '3306:3306'
    environment:
       MYSQL_DATABASE: 'database_name'
       MYSQL_USER: 'django'
       MYSQL_PASSWORD: 'django-password'
       MYSQL_ROOT_PASSWORD: 'password'
    volumes:
      - .setup.sql:/docker-entrypoint-initbd.d/setup.sql

  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db
    links: 
      - db 

settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': os.environ.get('MYSQL_DATABASE', 'mysql-db'),
        'USER': os.environ.get('MYSQL_USER', 'mysql-user'),
        'PASSWORD': os.environ.get('MYSQL_PASSWORD', 'mysql-password'),
        'HOST': os.environ.get('MYSQL_DATABASE_HOST', 'db'),
        'PORT': os.environ.get('MYSQL_DATABASE_PORT', 3306),
    }
}

И .env:

MYSQL_DATABASE=database_name
MYSQL_USER=django
MYSQL_PASSWORD=django-password
MYSQL_ROOT_PASSWORD=password
MYSQL_DATABASE_HOST=db
MYSQL_DATABASE_PORT=3306

Для докеризации приложения я использую Docker desktop в Windows 10.

После того как я выполнил:

docker-compose up -d

Я вижу, что оба контейнера (db и web) запущены, однако в web контейнере я вижу, что django не может подключиться к mySql, так как выдает ошибку:

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

Я просмотрел несколько похожих тем, но они не помогли мне понять, в чем проблема, и как ее решить. Пожалуйста, помогите мне пролить свет на эту проблему, спасибо!

Пробовали ли вы сначала запустить свой контейнер db?

docker compose up db
docker compose build web
docker compose up

После создания сервисов вы сможете docker compose up не запускать сначала db-контейнер, поскольку контейнеры будут запускаться в порядке depends_on определенном в файле docker-compose.

Вернуться на верх