2002年,"Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (2)"在Docker-c



我正在尝试通过docker-compose up启动服务器

我收到一个错误:

2002, "无法通过套接字'/run/mysqld/mysqld.sock' (2(连接到本地MySQL服务器">

docker-compose.yml

version: '3'
services:
db:
image: mysql:5.7
environment:
MYSQL_DATABASE: 'slack_bot1'
MYSQL_USER: 'root'
MYSQL_PASSWORD: ''
MYSQL_ROOT_PASSWORD: '****'
volumes:
- /opt/slack_bot/mysql_data:/var/lib/mysql
redis:
image: "redis:alpine"
volumes:
- /opt/slack_bot/redis_data:/var/lib/redis
web:
build: .
command: python manage.py runserver 0.0.0.0:8001
ports:
- "8001:8001"
depends_on:
- db

Dockerfile

FROM python:3.7-alpine
ENV PYTHONUNBUFFERED 1
WORKDIR /home/slack_bot
ADD requirements.txt /home/slack_bot/
RUN set -e; 
apk add --no-cache --virtual .build-deps 
gcc 
libc-dev 
linux-headers 
mariadb-dev 
python3-dev 
;
RUN pip install -r requirements.txt
ADD . /home/slack_bot/
EXPOSE 8001
CMD ["python", "manage.py",  "runserver", "0.0.0.0:8001"]

码头工人PS日志

CONTAINER ID        IMAGE                                  COMMAND                  CREATED             STATUS                          PORTS                                                                                                                                         NAMES
68b61ca0ce74        slack_bot_web                          "python manage.py ru…"   8 minutes ago       Up 32 seconds                   0.0.0.0:8001->8001/tcp                                                                                                                        slack_bot_web_1
c5f254a527b0        mysql:5.7                              "docker-entrypoint.s…"   8 minutes ago       Up 34 seconds                   3306/tcp, 33060/tcp                                                                                                                           slack_bot_db_1
4cbc1fa3765e        redis:alpine                           "docker-entrypoint.s…"   15 minutes ago      Up 33 seconds                   6379/tcp                                                                                                                                      slack_bot_redis_1

数据库的姜戈设置

'ENGINE': 'django.db.backends.mysql',
'NAME': 'slack_bot1',
'USER': 'root',
'PASSWORD': '',
'HOST': '',
'PORT': '',

在你的 django 设置中,你将数据库主机保留为 EMPTY,那么默认值将是localhost。当使用localhost时,mysql客户端驱动程序会将mysql服务器与unix socket连接,而不是tcp

因此,对于您的情况,您需要将 mysql 容器中的unix socket导出到卷,然后您的 django 应用程序容器利用此卷来共享unix socket

接下来是您需要执行的操作:

  1. 手动新建一个文件夹,稍后作为卷来共享您的 unix 套接字文件

    (重要提示:您无法依靠 docker-compose 来新建此文件夹,您将遇到权限错误(

    mkdir -p /tmp/slack_bot/mysqld && chmod -R 777 /tmp/slack_bot/mysqld
    
  2. docker-compose.yaml中,再向mysql服务添加一个卷:

    db:
    image: mysql:5.7
    environment:
    MYSQL_DATABASE: 'slack_bot1'
    MYSQL_USER: 'root'
    MYSQL_PASSWORD: ''
    MYSQL_ROOT_PASSWORD: '****'
    volumes:
    - /opt/slack_bot/mysql_data:/var/lib/mysql
    - /tmp/slack_bot/mysqld:/var/run/mysqld
    
  3. docker-compose.yaml中,再向web服务添加一个卷:

    web:
    build: .
    command: python manage.py runserver 0.0.0.0:8001
    ports:
    - "8001:8001"
    depends_on:
    - db
    volumes:
    - /tmp/slack_bot/mysqld:/run/mysqld
    

    注意:在这里你说你得到错误/run/mysqld/mysqld.sock如下,我不确定你是否粘贴了所有日志,因为它可能是/var/run/mysqld/mysqld.sock的,无神经的,如果错误/var/run/mysqld/mysqld.sock那么你应该修改上面的示例卷以- /tmp/slack_bot/mysqld:/var/run/mysqld

    2002, "无法通过套接字'/run/mysqld/mysqld.sock' (2(连接到本地MySQL服务器">

如上所述,现在您的 Web 服务可以共享 mysql 容器中的 unix 套接字。

另外,将HOST配置为db我认为也可能是另一种解决方案,只是unix socket与使用tcp相比要快得多。

我能够通过以下步骤连接 django 和 db docker 容器,它们位于同一台机器中但不在同一个 docker-compose 文件中:

  • 在 settings.py 中使用host.docker.internal作为主机,而不是本地主机,如下所示:

    DATABASES = {
    'default': {
    'ENGINE': 'django.db.backends.mysql',
    'NAME': 'dbName',
    'USER': 'dbUser',
    'PASSWORD': 'dbUserPassword',
    'HOST': 'host.docker.internal',
    'PORT': '3306'
    }
    

    }

  • 在数据库组合文件中公开端口

    ports:
    - 3306:3306
    

相关内容

最新更新