我已经在我的Mac M1中用MySQL在docker compose中设置了Django.每次我做Dackker-Compose时,我都会收到Django应用程序的错误

"Error: File "/usr/local/lib/python3.6/site-packages/MySQLdb/connections.py", line 166, in __init__
web_1  |     super(Connection, self).__init__(*args, **kwargs2)
web_1  | django.db.utils.OperationalError: (2002, "Can't connect to MySQL server on 'db' (115)")

我有另一台机器(Ubuntu),在那里有相同的坞站配置,我没有得到任何问题.

version: '3.2'
services:
  web:
    restart: always
    expose:
      - "5000"
    build:
      context: .
      dockerfile: Dockerfile
    command: python manage.py runserver 0.0.0.0:5000
    ports:
      - "9000:5000"
    environment:
      - MYSQL_HOST=db
      - MYSQL_USER=me
      - MYSQL_PASSWORD=me
      - MYSQL_DB=my_db
    depends_on:
      - db
    volumes:
      - ".:/code/google"
      
  db:
    image: mysql:5.7
    restart: always
    expose:
      - "9306"
    ports:
      - "9306:3306"
    environment:
      - MYSQL_DATABASE=my_db
      - MYSQL_USER=me
      - MYSQL_PASSWORD=me
      - MYSQL_ROOT_PASSWORD=me
    volumes:
      - "./db_data:/opt/homebrew/var/mysql"
      - "./mysql-init:/docker-entrypoint-initdb.d"

这是我的Django设置

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "my_db",
        "USER": "me",
        "PASSWORD": "me",
        "HOST": "db",
        "PORT": "3306",
    }
}

我试过很多东西,现在大部分都不记得了.也就是说,我try 交换服务,只保留数据库服务似乎没有网络的工作,try 更改卷位置,删除所有映像,容器和卷,并重建.

如果这能在ubuntu one机器上运行,难道它不应该也能在Mac M1上运行吗?这不就是 docker 的保证吗?

推荐答案

从 docker docs出发

由于网络的方式,MacOS上没有docker0网桥 在Docker for Mac中实现,您在中看不到docker0接口 MacOS操作系统.此接口实际上位于HyperKit中.

那么,docker0是什么呢?

它是Docker在Linux系统上创建的虚拟网络接口.作为默认的桥接网络接口,用于Docker容器和主机之间的通信.

现在,由于这在Mac中不可用,您的容器无法相互通信.

如果您仅将docker用于本地开发,则可以try 在Django数据库设置中将数据库主机更改为host.docker.internal:

DATABASES = {
    "default": {
        "ENGINE": "django.db.backends.mysql",
        "NAME": "my_db",
        "USER": "me",
        "PASSWORD": "me",
        "HOST": "host.docker.internal",
        "PORT": "3306",
    }
}

同样来自 docker docs:

主机的IP地址不断变化,如果您没有网络,则没有 进入.我们建议您连接到特殊的DNS名称 将其解析为所使用的内部IP地址 主持人.这是出于开发目的,不能在 Docker Desktop之外的生产环境.

另请看this帖子,解释Mac使用轻量级VM与docker进行通信.

Python相关问答推荐

如何在BeautifulSoup中链接Find()方法并处理无?

如何在箱形图中添加绘制线的传奇?

rame中不兼容的d类型

Pytest两个具有无限循环和await命令的Deliverc函数

输出中带有南的亚麻神经网络

如何请求使用Python将文件下载到带有登录名的门户网站?

对所有子图应用相同的轴格式

从spaCy的句子中提取日期

mypy无法推断类型参数.List和Iterable的区别

字符串合并语法在哪里记录

Python中的变量每次增加超过1

使用BeautifulSoup抓取所有链接

Python—压缩叶 map html作为邮箱附件并通过sendgrid发送

如何在海上配对图中使某些标记周围的黑色边框

GPT python SDK引入了大量开销/错误超时

504未连接IB API TWS错误—即使API连接显示已接受''

如何在Python中自动创建数字文件夹和正在进行的文件夹?

Pandas:将值从一列移动到适当的列

如何关联来自两个Pandas DataFrame列的列表项?

解析CSV文件以将详细信息添加到XML文件