使用docker compose up后无法连接到mysql数据库

3
我可以帮您翻译。以下是翻译结果:

我创建了一个带有MySQL数据库的容器,并且手动连接到.net应用程序非常好。现在我想使用docker-compose自动构建MySQL容器和.net应用程序镜像。

我的docker-compose文件如下所示。

version: '3.1'

networks:
  overlay:
services:
  authentication_service:
    image: authentication_service:latest
    depends_on:
      - "authentication_service_db"
      - "adminer"
    build:
      context: .
      dockerfile: Dockerfile
    links:
      - authentication_service_db
    ports:
      - "5003:80"
    networks:
      - overlay
  authentication_service_db:
    image: mysql:8.0.3
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: authenticationdb
    ports:
      - 3305:3306
    restart: always
    volumes:
      - ./data-authentication:/var/lib/mysql
    networks:
      - overlay

当我在开发中启动应用程序时,连接字符串被打印出来,看起来像这样:server=localhost;Port=3305;Database=authenticationdb;Uid=root;Pwd=secret。这个可以正常工作。

当我运行docker-compose up -d --build时,它会变成:server=authentication_service_db;Port=3305;Database=authenticationdb;Uid=root;Pwd=secret;

我的连接测试脚本:

private static void WaitForDbInit(string connectionString)
        {
            var connection = new MySqlConnection(connectionString);
            Console.WriteLine("Connecting with credentials: {0}", connectionString);

            var retries = 1;
            while (retries < 5)
            {
                try
                {
                    Console.WriteLine("Connecting to db. Trial: {0}", retries);
                    connection.Open();
                    connection.Close();
                    break;
                }
                catch (MySqlException)
                {
                    Thread.Sleep((int) Math.Pow(2, retries) * 1000);
                    retries++;
                }
            }
        }

日志:

Connecting to db. Trial: 1
Connecting to db. Trial: 2
Connecting to db. Trial: 3
Connecting to db. Trial: 4
[...]
application startup exception: MySql.Data.MySqlClient.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts.
   at MySqlConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs, ILoadBalancer loadBalancer, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ServerSession.cs:line 299

appsettings.json:

{
  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },
  "AllowedHosts": "*",
  "MysqlConnection": {
    "connectionString": "server=authentication_service_db;Port=3305;Database=authenticationdb;Uid=root;Pwd=secret;"
 }
}

所以我不知道如何调试或下一步该做什么。当我使用docker compose时,我无法获得连接。

“Original Answer”翻译成中文为“最初的回答”。

1个回答

2
你将端口3306映射到主机的3305端口上,用于开发应用程序。所以你可以连接到3305端口上的数据库。然而,在容器内部仍在使用3305端口。因为你的服务(authentication_service_db)正在监听3306端口,而不是3305端口,所以你的应用程序连接数据库时出现了问题。
你必须更改连接字符串,使用3306端口而不是3305端口。

我会尝试这个并且会报告结果。我完全还不理解它。我的映射意图是可以运行多个MySQL数据库。将会有更多的服务,每个服务都应该有自己的数据库和端口。如何让每个端口都监听3306呢?你能详细解释一下吗? - undefined
1
在Docker中,容器与主机之间没有网络连接。因此,为了连接到运行在mydb:3306上的MySQL服务,你需要将其映射到localhost:3305。当你想要添加另一个MySQL实例(例如:mydb2:3306)时,可以将其映射到localhost:3304,然后通过它访问。然而,容器之间存在网络连接。因此,容器内部运行的应用程序应该使用容器IP/名称:服务端口模式来连接服务。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接