【问题标题】:Error connecting to MySQL Instance in docker在 docker 中连接 MySQL 实例时出错
【发布时间】:2019-09-30 16:42:15
【问题描述】:

我在 dotnet core 2.1 中有一个非常简单的应用程序,它与 MySQL 数据库通信。该应用程序使用这样的实体框架:

var connectionString = Configuration.GetConnectionString("DatabaseConnection");
services.AddDbContext<ChtrDbContext>(options => options.UseMySql(connectionString));

connectionString 如下所示:

"DatabaseConnection": "Server=db;port=3306;Database=chtr;userid=dbuser;Password=dbuserpassword"

应用程序是 dockerized,我使用docker-compose up --build 启动环境。

当我导航到 localhost:8080/graphql(这是我的 GraphiQL 端点)并尝试对数据库进行简单查询时,我无法登录。这是日志文件:

 Access denied for user 'dbuser'@'172.19.0.3' (using password: YES)
chtr.server_1  |    at MySqlConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs, ILoadBalancer loadBalancer, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 360

它说作为配置用户的 dbuser 没有访问我的数据库的权限。

Running docker ps 列出了我的所有容器,我可以看到 mysql 容器正在运行。然后我再次运行docker inspect chtrserver_db_1,这是容器名称。向下滚动到这个 json 文件的 Config 部分,我会得到以下信息:

"Env": [
                "MYSQL_RANDOM_ROOT_PASSWORD=1",
                "MYSQL_DATABASE=chtr",
                "MYSQL_USER=dbuser",
                "MYSQL_PASSWORD=dbuserpassword",
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "GOSU_VERSION=1.7",
                "MYSQL_MAJOR=5.7",
                "MYSQL_VERSION=5.7.26-1debian9"
            ],

好的,所以我已经确认 docker 容器正在运行,并且连接字符串中指定的凭据与容器中配置的凭据相同。我怎么还是登录不了?

docker-compose.yml 文件如下所示:

版本:'3.0'

services:
   db:
     image: mysql:5.7
     environment:
       MYSQL_RANDOM_ROOT_PASSWORD: 1
       MYSQL_DATABASE: chtr
       MYSQL_USER: dbuser
       MYSQL_PASSWORD: dbuserpassword
     volumes:
       - dbdata:/var/lib/mysql
       - ./Scripts:/docker-entrypoint-Dataseed.d
     restart: always

   chtr.server:
     depends_on:
       - db
     image: trebias/chtr.server
     build:
       context: .
     ports:
       - "8080:80"

volumes:
    dbdata:

对如何前进有什么建议吗?

【问题讨论】:

  • 你没有把端口暴露给mysql
  • @DanielA.White 需要解释一下吗?我猜它在我的 yml 文件中的端口部分下,但我对 docker 相当陌生。谢谢!
  • @DanielA.White,如果两个容器在同一个网络上,则不需要暴露 mysql 端口。
  • @codestation 他们是。

标签: c# mysql docker .net-core docker-compose


【解决方案1】:

您是否 100% 确定凭据与 MySQL 上的用户匹配?请注意,MYSQL_USER 和 MYSQL_PASSWORD 仅在第一次创建数据库时使用一次,因此如果您在保留数据库的同时更改它们,那么您假设凭证的 ENV 变量与数据库中的变量匹配的假设不再正确。

如果是这种情况,那么您可以删除数据库并重新开始。由于您使用的是命名卷,因此您需要手动删除它(docker rm 在使用 rm 命令时永远不会删除命名卷,只会删除匿名卷)。

要删除命名卷,您可以使用以下命令:

docker volume rm xxxx_dbdata

其中 xxxx 应该是您的项目名称(您的撰写文件所在的目录)。您还可以通过 docker volume ls 查看 docker 卷列表。

【讨论】:

  • 我不是 100% 确定,但我每次拆除环境时都会运行 docker -rm -v 命令来删除图像。有没有办法解决这个问题?
  • @TobiasMoeThorstensen -v 仅删除匿名卷。在您的撰写文件中,您正在使用一个命名卷,您必须使用docker volume rm xxxxx_dbdata 明确删除它(xxxxx 将是您的项目名称)。
  • 清除;项目名称是什么?它是在我的 yml 文件中定义的吗?任何 docker 命令都可以在这里帮助我吗?
  • @TobiasMoeThorstensen 项目名称是您的撰写文件所在的目录名称。您可以使用docker volume ls 列出您创建的所有卷(命名和匿名)。
  • 好像是这样。自从我今天早些时候配置了不同的凭据以来,另一卷并排运行。非常感谢。我建议你根据 cmets 链写一个答案。我会接受的。
【解决方案2】:

确保在 docker-compose 中指定了端口

services:
    db:
     image: mysql:5.7
     environment:
       MYSQL_RANDOM_ROOT_PASSWORD: 1
       MYSQL_DATABASE: chtr
       MYSQL_USER: dbuser
       MYSQL_PASSWORD: dbuserpassword
     volumes:
       - dbdata:/var/lib/mysql
       - ./Scripts:/docker-entrypoint-Dataseed.d
     restart: always
     ports:
       - "3306:3306"

Alos,您是在 docker-compose 中创建网络吗?

【讨论】:

  • 正如评论中所写,只要两个容器在同一个网络上,就不需要指定端口
猜你喜欢
  • 2021-07-23
  • 2018-09-05
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 2020-08-04
  • 2021-12-08
  • 2022-08-18
  • 2019-10-08
相关资源
最近更新 更多