You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署Django执行createsuperuser报错:Unknown server host 'db'

Django容器内数据库连接正常,但本地执行manage.py命令报错无法解析'db'主机

Docker搭配Pipenv部署Django应用,执行docker compose up -d --build后,容器内的应用能正常连接db服务的数据库,settings.py已配置数据库HOST为'db'。但在本地环境执行python manage.py createsuperuser等manage.py命令时,持续报错:

django.db.utils.OperationalError: (2005, "Unknown server host 'db' (11001)")

错误详情

PS C:\Users\nawar\Desktop\uni\Uni\Modules\UWE_Modules\Y3\DESD\CW2\mlaas-g7> python manage.py createsuperuser
Traceback (most recent call last):
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\base\base.py", line 282, in ensure_connection
    self.connect()
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\base\base.py", line 263, in connect
    self.connection = self.get_new_connection(conn_params)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\mysql\base.py", line 247, in get_new_connection
    connection = Database.connect(**conn_params)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\MySQLdb\__init__.py", line 123, in Connect
    return Connection(*args, **kwargs)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\MySQLdb\connections.py", line 185, in __init__
    super().__init__(*args, **kwargs2)
MySQLdb._exceptions.OperationalError: (2005, "Unknown server host 'db' (11001)")

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\nawar\Desktop\uni\Uni\Modules\UWE_Modules\Y3\DESD\CW2\mlaas-g7\manage.py", line 22, in <module>
    main()
  File "C:\Users\nawar\Desktop\uni\Uni\Modules\UWE_Modules\Y3\DESD\CW2\mlaas-g7\manage.py", line 18, in main 
    execute_from_command_line(sys.argv)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\core\management\__init__.py", line 446, in execute_from_command_line
    utility.execute()
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\core\management\__init__.py", line 440, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\core\management\base.py", line 402, in run_from_argv
    self.execute(*args, **cmd_options)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\contrib\auth\management\commands\createsuperuser.py", line 88, in execute
    return super().execute(*args, **options)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\core\management\base.py", line 447, in execute
    self.check_migrations()
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\core\management\base.py", line 564, in check_migrations
    executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS])
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\migrations\executor.py", line 18, in __init__
    self.loader = MigrationLoader(self.connection)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\migrations\loader.py", line 58, in __init__
    self.build_graph()
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\migrations\loader.py", line 235, in build_graph
    self.applied_migrations = recorder.applied_migrations()
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\migrations\recorder.py", line 81, in applied_migrations
    if self.has_table():
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\migrations\recorder.py", line 57, in has_table
    with self.connection.cursor() as cursor:
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\base\base.py", line 323, in cursor
    return self._cursor()
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\base\base.py", line 299, in _cursor
    self.ensure_connection()
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\base\base.py", line 281, in ensure_connection
    with self.wrap_database_errors:
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\utils.py", line 91, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\base\base.py", line 282, in ensure_connection
    self.connect()
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\base\base.py", line 263, in connect
    self.connection = self.get_new_connection(conn_params)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\utils\asyncio.py", line 26, in inner
    return func(*args, **kwargs)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\mysql\base.py", line 247, in get_new_connection
    connection = Database.connect(**conn_params)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\MySQLdb\__init__.py", line 123, in Connect
    return Connection(*args, **kwargs)
  File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\MySQLdb\connections.py", line 185, in __init__
    super().__init__(*args, **kwargs2)
django.db.utils.OperationalError: (2005, "Unknown server host 'db' (11001)")

相关配置文件

docker-compose.yml

services:
  mlaas:
    image: mlaas
    build:
      context: .
      dockerfile: Dockerfile
    restart: always
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    depends_on:
      - db
    entrypoint: ["./mlaas-entrypoint.sh"]

  db:
    image: mysql:8.0-debian
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: mysql-root
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_DATABASE: prediction_db
    restart: always
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

Dockerfile

FROM python:3.10-slim

WORKDIR /app

RUN apt-get update && apt-get install -y build-essential default-libmysqlclient-dev

COPY requirements.txt ./
RUN pip install -r requirements.txt

COPY . .

EXPOSE 8000

入口脚本 mlaas-entrypoint.sh

#!/bin/sh

echo "Waiting for MySQL Database Service to start..."

./wait-for db:3306

python manage.py makemigrations
python manage.py migrate

python manage.py runserver 0.0.0.0:8000

问题原因

'db'是Docker Compose创建的内部网络别名,仅在Docker容器所在的内部网络中可解析。本地环境不在该网络范围内,因此无法识别此主机名。

解决方法

方法一:直接在容器内执行命令

通过Docker命令进入运行中的Django容器,在容器内部执行manage.py命令:

# 查看运行中的容器信息,获取Django容器名称或ID
docker ps
# 进入容器(替换<container_name_or_id>为实际容器名/ID)
docker exec -it <container_name_or_id> bash
# 在容器内执行命令
python manage.py createsuperuser

方法二:映射本地hosts并区分环境配置

  1. 修改本地hosts文件:将'db'映射到localhost(因为db服务已将3306端口映射到本地)
    • Windows:编辑C:\Windows\System32\drivers\etc\hosts,添加一行:127.0.0.1 db
    • Linux/macOS:编辑/etc/hosts,添加同样内容
  2. 修改settings.py支持环境变量:通过环境变量区分容器和本地环境的数据库HOST
    import os
    
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': os.getenv('DB_NAME', 'prediction_db'),
            'USER': os.getenv('DB_USER', 'user'),
            'PASSWORD': os.getenv('DB_PASSWORD', 'password'),
            'HOST': os.getenv('DB_HOST', 'db'),  # 容器内默认用db,本地可设为localhost
            'PORT': os.getenv('DB_PORT', '3306'),
        }
    }
    
  3. 本地执行命令前设置环境变量:
    • Windows PowerShell:$env:DB_HOST="localhost"
    • Linux/macOS:export DB_HOST=localhost
      之后再执行python manage.py createsuperuser即可。

方法三:用docker compose exec直接执行命令

无需进入容器,直接通过docker compose exec在容器上下文执行命令:

docker compose exec mlaas python manage.py createsuperuser

内容的提问来源于stack exchange,提问作者tetra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:02:30