返回

在 Docker Compose 中连接 MySQL 与 ASP.NET 应用程序的终极指南

mysql

在 Docker-Compose 中连接 MySQL 服务器与 ASP.NET 应用程序

简介

在使用 Docker-Compose 同时运行 MySQL 数据库和 ASP.NET 应用程序时,连接这两个容器可能会遇到挑战。本文将深入探讨导致此问题的常见原因,并提供分步指南来解决它们,以建立成功的连接。

问题症状

  • ASP.NET 应用程序无法访问 MySQL 数据库
  • 应用程序启动时出现连接异常
  • 数据库查询返回空结果或错误

解决步骤

1. 检查网络连接

确保 MySQL 和 ASP.NET 应用程序容器在同一 Docker 网络中运行。在 docker-compose.yml 文件中检查 networks 部分。

2. 验证数据库凭据

核对 DbContextModel 类中指定的数据库凭据(服务器、用户名、密码和端口)与 MySQL 容器中的配置匹配。

3. 允许外部连接

在 MySQL 容器中,通过将 bind-address 设置为 0.0.0.0 允许外部连接。可以在容器启动时使用命令实现:

docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pass -e MYSQL_BIND_ADDRESS=0.0.0.0 mysql

4. 授予用户访问权限

确保为 ASP.NET 应用程序使用的数据库用户授予了访问 MySQL 数据库的权限。可以在 MySQL 容器中使用命令实现:

GRANT ALL PRIVILEGES ON *.* TO 'aspnetuser'@'%' IDENTIFIED BY 'password';

5. 更新连接字符串

将 DbContextModel 中的连接字符串更新为使用 MySQL 容器的实际 IP 地址或主机名。可以通过运行以下命令查找容器的 IP 地址:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' database

6. 重建应用程序

对 ASP.NET 应用程序进行重建,使其使用更新的连接字符串。

7. 重新启动容器

重新启动 MySQL 和 ASP.NET 应用程序容器以应用更改。

代码示例

DbContextModel.cs

using Microsoft.EntityFrameworkCore;
using System.Data;

namespace DockerLearning.Models
{
    public class DbContextModel : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySQL(
using Microsoft.EntityFrameworkCore;
using System.Data;

namespace DockerLearning.Models
{
    public class DbContextModel : DbContext
    {
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySQL($"server={mysqlIpAddressOrHostname};database=;uid=root;pwd=pass;port=3306;");
        }
    }
}
quot;server={mysqlIpAddressOrHostname};database=;uid=root;pwd=pass;port=3306;"
); } } }

HomeController.cs

public IActionResult Index()
{
    List<string> databases = new List<string>();
    using (var dbContext = new DbContextModel())
    {
        var connection = dbContext.Database.GetDbConnection();
        ViewData["Databases"] = null;
        ViewData["Error"] = null;
        if (connection != null)
        {
            try
            {
                connection.Open();
                string query = "SHOW DATABASES;";
                using (MySqlCommand command = new MySqlCommand(query, (MySqlConnection)connection))
                {
                    using (MySqlDataReader reader = command.ExecuteReader())
                    {
                        while (reader.Read())
                        {
                            databases.Add(reader.GetString(0));
                        }
                        ViewData["Databases"] = databases;
                    }
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
                ViewData["Error"] = ex.ToString();
            }
            finally
            {
                connection.Close();
            }
        }
    }              
        return View();
}

docker-compose.yml

version: "3.4"

networks:
  backend:

services:
  database:
    container_name: database
    image: mysql
    environment:
     - MYSQL_ROOT_PASSWORD=pass
     - MYSQL_BIND_ADDRESS=0.0.0.0
    ports:
     - "3306:3306"
    networks:
     - backend
  website:
    image: dockerlearning
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    networks:
        - backend
    ports:
      - "5000:80"
    depends_on:
      - database

常见问题解答

Q1:我仍然无法连接,该怎么办?

A1:检查 ASP.NET 应用程序的网络设置,确保它允许访问 MySQL 容器的 IP 地址。

Q2:我收到一个异常,说“访问被拒绝”

A2:验证 MySQL 服务器是否正在运行,并且您正在使用正确的凭据进行连接。

Q3:如何使用不同的数据库端口?

A3:在 DbContextModel 的连接字符串和 MySQL 容器的端口配置中更新端口号。

Q4:我可以使用不同的数据库用户吗?

A4:是的,但请确保授予新用户访问数据库的适当权限。

Q5:如何调试连接问题?

A5:使用日志文件或调试器来查看异常消息并确定问题根源。

结论

通过遵循本指南中的步骤,您应该能够成功连接 MySQL 服务器和 ASP.NET 应用程序。了解连接问题背后的原因并掌握解决它们的技能对于任何使用 Docker-Compose 管理应用程序和数据库的人来说都是至关重要的。