【问题标题】:docker-compose unable to connect mysqldocker-compose无法连接mysql
【发布时间】:2021-06-16 06:04:59
【问题描述】:

我看到了这个问题的多个解决方案,但我仍然无法取得进展,因此发布了这个问题 我有 react+django+mysql 应用程序,我想将它部署到 docker 中,但是当我尝试做我的 sql 映像时没有创建,它说 db uses and image, skipping。 但我看到没有为mysql创建图像(它有一个但我强制删除,所以它可以创建新的),我尝试了here的解决方案并尝试在命令下运行

docker 运行 mysql -h 127.0.0.1 -P 3306

但它要求我提供密码、root 密码等,我出了什么问题? 以下是我的日志

PFb 我的 docker-compose.yaml

version: '3.2'

services:
  db:
    image: mysql:8.0
    ports:
      - '3302:3306'
    environment:
       MYSQL_DATABASE: 'motor_vehicle_collision'
       MYSQL_USER: 'creditshelf_user'
       MYSQL_PASSWORD: '12345678'
       MYSQL_ROOT_PASSWORD: '12345678'
    networks:
      - db-net

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

  frontend:
    restart: always
    command: npm start
    container_name: front
    build:
      context: ../../../react code/collision-UI/collision-info
      dockerfile: Dockerfile
    ports:
      - "3000:3000"
    stdin_open: true
    depends_on:
      - web
    networks:
      - db-net



networks:
      db-net:
        driver: bridge

下面是我的python项目Dockerfile

FROM python:3.8
ENV PYTHONUNBUFFERED 1
RUN mkdir /collision_bike_info
WORKDIR /collision_bike_info
ADD requirements.txt /collision_bike_info/
RUN pip install -r requirements.txt
ADD . /collision_bike_info/

在我的 settings.py 下方

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'motor_vehicle_collision',
        'USER': 'creditshelf_user',
        'PASSWORD': '12345678',
        'HOST': 'localhost',
        'PORT' : '3306'
        # 'NAME': BASE_DIR / 'db.sqlite3',
    }
}

解决方案:

下面的答案对我有用,但是我现在遇到了不同的问题,我的 sql 说

(1045, '插件缓存_sha2_password 无法加载: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: 无法打开共享对象文件:没有这样的文件或目录')

从谷歌我知道这是由于新的 mysql 版本(8.0 以后)所以我需要降级我的 sql 映像或者我需要为我的用户更改密码策略,我如何更改我的 sql 用户的策略码头工人? 如果我降级它说 unkow host db f0r mysql,我该怎么办?

【问题讨论】:

  • 您能否在设置文件中包含DATABASES 部分?
  • 添加,请看

标签: mysql django docker docker-compose


【解决方案1】:

以免先理顺一些术语:

image - 是可运行事物的图像,例如 MySql 或 Python。它是只读的。您无法连接到映像,但可以从映像启动容器。容器是做什么工作的。容器基于图像加上它的可写层。因此,即使您停止并重新启动,所有更改都会保存在这些可写层中。

所以db uses an image 意味着 docker compose 不必为您的数据库容器构建新映像。但只需要使用您定义的参数启动容器。同时 docker composer 必须使用你的 Dockerfile 构建web 图像。

当您执行docker run mysql .... 时,您只是在不使用 docker compose 的情况下从 MySql 映像启动新容器,因此它会询问您在 docker compose 文件中为db 容器输入的所有参数。 不要这样做,因为您使用的是 docker-compose。

根据日志所说的can't connect to local mysql through socket,您的python 脚本尝试连接到本地主机上的mysql。但是,您的 docker 文件将 MySql 定义为 db

所以db 应该是您的网络尝试在其上查找 mysql 的主机。 另一件事是您的网络没有使用与其他 pod 相同的 networks:

附言在继续之前,您可能需要检查您已经运行了哪些继续器。 停止所有 docker compose 并检查休息。像这样:

  • docker-compose down - 停止和删除 composer 文件中定义的容器。
  • docker ps - 查看正在运行的容器。应该没有。
  • docker ps -a - 查看所有容器,包括停止的容器。
  • docker stop {container id} 停止某事。
  • docker rm {container id} 删除容器。

【讨论】: