我正在学习docker,我想使用docker-compose来运行MySQL数据库和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>

文档文件:

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 连接到它,它工作得很好.当我try 从这个应用程序的代码中这样做时,问题出现了.我不明白我做错了什么,因为它在不使用docker—compose的情况下工作.

推荐答案

我已经测试了指定网络别名,因为connectionstring在示例中使用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

Mysql相关问答推荐

在MySQL中从非连续数据创建时间线

SQL:如何 Select 每个客户最后购买的产品?

MySQL如何在触发器内部 Select 多行然后插入它们

如何在 SQL 中迭代所有名称和排名排列

如何进行查询以在两个不同的列中搜索两个不同的数据字符串?

如何本地化 MySQL 表中的实体?

如何优化使用多个 LEFT JOIN 和 GROUP BY 子句的慢速 MySQL 查询?

优化解析 5000 万行 MySQL 表的请求

Mysql 中相同列的相关 2 查询

为什么这个查询需要超过 5 秒才能运行?

查询以从约会表中获取可用空档

了解 SQL 中的元组语法

将每组的总和除以总数

在 MySQL 的存储过程中调用存储过程

PHP,MySQL 错误:列计数与第 1 行的值计数不匹配

默认为空字符串的列

你如何 OR 两个 LIKE 语句?

mysql中float(2,2)和float()的区别

MySQL 中的 VARCHAR(255) 和 TINYTEXT 字符串类型有什么区别?

使用 PHP 和 MySQL 存储和显示 unicode 字符串 (हिन्दी)