【问题标题】:how can i connect django container to mysql container我如何将 django 容器连接到 mysql 容器
【发布时间】:2021-11-16 23:46:28
【问题描述】:

您好,我想在每个容器中连接 django - mysql :)

我尝试了很多方法,但都失败了..

这是我的 mysql docker-compose.yaml

version: "3"
services:
  db:
    platform: linux/x86_64
    image: mysql:5.7
    container_name: good-mysql
    ports:
      - "3307:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=test
      - MYSQL_DATABASE=testdb
    command: 
      - --character-set-server=utf8mb4
      - --collation-server=utf8mb4_unicode_ci
    volumes:
      - /Users/Shared/data/mysql-test:/var/lib/mysql
    network_mode: bridge

我用的是mysql官方镜像

还有我的 django Dockerfile

FROM ubuntu:18.04
FROM python:3.8.6-buster

ENV PYTHONUNBUFFERED 1

# General Packages
RUN apt-get update \
    && apt-get install -y libmariadb-dev \
    && apt-get install -y python3-pip \
    && apt-get install -y build-essential \
    && apt-get install -y libcurl4-openssl-dev \
    && apt-get install -y libssl-dev \
    && pip install --upgrade pip

RUN mkdir -p /project/myproject
COPY ./myproject /project/myproject

RUN mkdir -p /app
    WORKDIR /app

RUN pip install -r requirements.txt

CMD tail -f /dev/null

和 docker-compose.yaml

version: '3.8'
services:
    deepnatural-ai-api:
        build: .
        image: deepnatural-ai-api:latest
        container_name: deepnatural-ai-api
        ports:
            - 1000:1000
        external_links:
            - "good-mysql:db"
        network_mode: bridge

我运行docker-compose up -d每个容器

并访问 mysql 容器,运行 mysql -uroot -p 它的工作!

但是当我访问 django 容器运行迁移时,它会引发错误

"Unknown MySQL server host 'db' (-2)")

我的 django settings.py 是

ALLOWED_HOSTS = ['*']

INSTALLED_APPS = [
    '...',
]

DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'testdb',
    'USER': 'root',
    'PASSWORD': 'test',
    'HOST': 'db',
    'PORT': '3306',
    'OPTIONS': {'auth_plugin': 'mysql_native_password'},
    }
}

ROOT_URLCONF = 'myproject.urls'

DEFAULT_AUTO_FIELD='django.db.models.AutoField'

STATIC_URL = '/static/'

INTERNAL_IPS = [
    '127.0.0.1',
    '0.0.0.0',
]

我仔细检查了 docker 网络、数据库主机名、密码、数据库名称等...

但 django 找不到数据库主机“good-mysql”

请给点建议谢谢:)

编辑:

当我运行docker ps

我尝试更改HOST: "good-mysql"

【问题讨论】:

    标签: mysql django docker


    【解决方案1】:
    pip install dj-database-url
    
    settings.py
    import dj_database_url
    
    DATABASES = {"default": dj_database_url.config()}
    

    在您的 django 容器的配置中,您需要添加:

    environment:
      - DATABASE_URL=mysql://<username>:<password>@<db_container_name>/<db_name>
    

    【讨论】:

      【解决方案2】:

      尝试合并您的 docker-compose 文件:

      version: '3.8'
      
      services:
          deepnatural-ai-api:
              build: .
              image: deepnatural-ai-api:latest
              container_name: deepnatural-ai-api
              ports:
                  - 1000:1000
              depends_on:
                  - db
          db:
              platform: linux/x86_64
              image: mysql:5.7
              ports:
                  - "3307:3306"
              environment:
                  - MYSQL_ROOT_PASSWORD=test
                  - MYSQL_DATABASE=testdb
              command: 
                  - --character-set-server=utf8mb4
                  - --collation-server=utf8mb4_unicode_ci
              volumes:
                  - mysql_test:/var/lib/mysql/data
      
      volumes:
          mysql_test:
      

      现在尝试运行docker-compose up -d --build。两个容器都应该启动,db 容器首先启动,因为 deepnatural-ai-api 将它作为依赖项。

      如果您不想合并 docker-compose 文件。请在使用docker container ls 启动它们后列出正在运行的容器。

      【讨论】:

      • 当我添加 docker container ls 谢谢 :)
      • 您是否尝试将 Django 设置中的 HOST 设置更改为 good-mysql 而不是 db
      • 是的,我已经尝试过了,但仍然失败:(
      • 这似乎是容器之间的网络问题。尝试删除 db 服务中的 ports 配置?
      • 在测试之前尝试重建您的图像。 docker-compose down & 然后docker-compose up -d --build
      【解决方案3】:

      我解决了我的问题

      我使用了IPv4Address的mysql容器,比如172.17.0.3

      我运行命令docker network inspect bridge 并检查IPv4Address

      并像这样插入我的 settings.py

      DATABASES = {
      'default': {
          'ENGINE': 'django.db.backends.mysql',
          'NAME': 'testdb',
          'USER': 'root',
          'PASSWORD': 'test',
          'HOST': '172.17.0.3', # <---- mysql container IPv4Address
          'PORT': '3306',
          'OPTIONS': {'auth_plugin': 'mysql_native_password'},
          }
      }
      

      及其工作!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多