在 Docker Compose 中连接 MySQL 与 ASP.NET 应用程序的终极指南
2024-03-07 03:41:39
在 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 管理应用程序和数据库的人来说都是至关重要的。