无法从容器中的 APS .NET 应用程序连接到 MySQL 服务器容器

问题描述 投票:0回答:1

我正在学习 docker,想要使用 docker-compose 来运行 MySQL db 和 ASP .NET 应用程序,但在使用 docker-compose 时无法连接它们。

代码如下:

DbContext 文件:

using Microsoft.EntityFrameworkCore;
using System.Data;

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

我如何尝试测试它:

        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();
        }

查看:

<div>
    <ul>
        @if (ViewData["Databases"] != null)
        {
            @foreach (var db in (List<string>)ViewData["Databases"])
            {
                <li>@db</li>
            }
        }else{
            <p>@ViewData["Error"]</p>
        }
    </ul>
</div>

Dockerfile:

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["DockerLearning.csproj", "."]
RUN dotnet restore "./DockerLearning.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "DockerLearning.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "DockerLearning.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DockerLearning.dll"]

docker-compose.yml:

version: "3.4"

networks:
  backend:

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

错误:

System.TimeoutException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. at MySql.Data.Common.StreamCreator.GetTcpStream(MySqlConnectionStringBuilder settings, MyNetworkStream& networkStream) at MySql.Data.Common.StreamCreator.GetStream(MySqlConnectionStringBuilder settings, MyNetworkStream& networkStream) at MySql.Data.MySqlClient.NativeDriver.Open() at MySql.Data.MySqlClient.Driver.Open() at MySql.Data.MySqlClient.Driver.Create(MySqlConnectionStringBuilder settings) at MySql.Data.MySqlClient.MySqlPool.CreateNewPooledConnection() at MySql.Data.MySqlClient.MySqlPool.GetPooledConnection() at MySql.Data.MySqlClient.MySqlPool.TryToGetDriver() at MySql.Data.MySqlClient.MySqlPool.GetConnection() at MySql.Data.MySqlClient.MySqlConnection.Open() at DockerLearning.Controllers.HomeController.Index() in /src/Controllers/HomeController.cs:line 31

我能够使用单独的容器连接它们。当我使用

docker-compose up -d
运行它们时,两个容器都可以互相 ping 通,并且看起来很 git gut。如果我安装 mysql,在 Web 应用程序容器上我可以使用
mysql -u root -p -h 172.18.0.2 -P 3306 
连接到它,并且工作正常。当我尝试从这个应用程序中的代码执行此操作时,问题就出现了。我不明白我做错了什么,因为它在不使用 docker-compose 的情况下工作。

mysql asp.net-mvc asp.net-core docker-compose
1个回答
0
投票

我已经使用指定网络别名进行了测试,因为连接字符串在您的示例上使用 docker compose 效果很好。

optionsBuilder.UseMySql("server=mysqlcontainer;database=;user=root;password=123456", new MySqlServerVersion(new Version()));
version: "3.4"

networks:
  backend:
    driver: bridge

services:
  database:
    container_name: database
    image: mysql
    environment:
     - MYSQL_ROOT_PASSWORD=123456
    ports:
     - "3306:3306"
    networks:
      backend:
        aliases:
          - mysqlcontainer
  website:
    image: dockerlearning
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    networks:
      backend:
    ports:
      - "5000:80"
    depends_on:
      - database
© www.soinside.com 2019 - 2024. All rights reserved.