首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Docker Web应用程序连接到也在Docker中运行的Server实例

将Docker Web应用程序连接到也在Docker中运行的Server实例
EN

Stack Overflow用户
提问于 2022-05-03 14:34:02
回答 3查看 717关注 0票数 0

我的SQL Server数据库作为Docker容器运行良好,我能够在SSMS中连接,但是当我的web应用程序试图连接到这些Server实例时,它会失败。请参阅下面的异常错误:

代码语言:javascript
复制
EPiServer.Framework.Initialization.InitializationEngine[0]

      Initialize action failed for 'Initialize on class EPiServer.Data.DataInitialization, EPiServer.Data, Version=12.4.2.0, Culture=neutral, PublicKeyToken=- - - -'

      Microsoft.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 40 - Could not open a connection to SQL Server: Could not open a connection to SQL Server)

您可以在下面看到我的docker-compose文件:

代码语言:javascript
复制
version: "3.9"

services:
  sql-commerce: 
    container_name: "sql-commerce"
    image: mcr.microsoft.com/azure-sql-edge
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=Passw0rd123!
      - DB_NAME=commerce
    ports:
      - '1433:1433'
    volumes:
      - ./databases_project/files/data/commerce:/var/opt/mssql/data
  sql-cms:
    container_name: "sql-cms"
    image: mcr.microsoft.com/azure-sql-edge
    environment:
      - ACCEPT_EULA=Y
      - SA_PASSWORD=Passw0rd123!
      - DB_NAME=cms
    ports:
      - '8080:1433'
    volumes:
      - ./databases_project/files/data/cms:/var/opt/mssql/data
  web:
    build: .
    environment:
      EcfSqlConnection: "sql-commerce"
      EPiServerDB: "sql-cms"
    ports:
      - '3080:80'

然后,这将对同一级别的Dockerfile进行如下操作:

代码语言:javascript
复制
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build

WORKDIR /ProjectName
COPY ["Applications/Website.Src/Website.Src.csproj", "Website.Src/"]
RUN dotnet restore "Website.Src/Website.Src.csproj" --source https://api.nuget.org/v3/index.json --source https://nuget.optimizely.com/feed/packages.svc/
COPY . .
WORKDIR "/ProjectName/Applications/Website.Src"
RUN dotnet build "Website.Src.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Website.Src.csproj" -c Release -o /app/publish

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

我的连接字符串如下所示:

代码语言:javascript
复制
  "ConnectionStrings": {
    "EcfSqlConnection": "Server=localhost,1433;Database=projectCommerce;User Id=sa;Password=Passw0rd123!;MultipleActiveResultSets=True",
    "EPiServerDB": "Server=localhost,8080;Database=projectCms;User Id=sa;Password=Passw0rd123!;MultipleActiveResultSets=True"
  },

对我哪里出了问题有什么想法吗?

更新

我试图在连接字符串中以sql容器名称而不是本地主机为目标,但是即使这样也无法连接。

代码语言:javascript
复制
  "ConnectionStrings": {
    "EcfSqlConnection": "Server=sql-commerce,1433;Database=projectCommerce;User Id=sa;Password=Passw0rd123!;MultipleActiveResultSets=True",
    "EPiServerDB": "Server=sql-cms,8080;Database=projectCms;User Id=sa;Password=Passw0rd123!;MultipleActiveResultSets=True"
  },
EN

回答 3

Stack Overflow用户

发布于 2022-05-03 16:04:36

在您的停靠-组合中,每个容器充当自己的主机。当您在连接字符串中引用localhost时,web容器将其视为自身,而不是主机(停靠器)机器。

您也可以通过设置不同的网络来使对接器中的事情变得复杂,但是默认情况下,您的容器都将位于同一个网络上。我喜欢为每个容器指定一个主机名,如下所示:

代码语言:javascript
复制
services:
  sql-commerce: 
    hostname: sql-commerce
    container_name: sql-commerce

然后,您可以在连接字符串中使用该名称。

如果您不希望将ports服务打开给主机-- expose只允许您将它们保存在坞网络中,那么您还可以查看expose和sql之间的区别。现在,我认为您需要为这两个连接指定端口1433 (与对接网络的内部连接),其中第二个连接只在主机上侦听8080

票数 0
EN

Stack Overflow用户

发布于 2022-05-03 19:10:47

不能使用localhost在容器之间进行通信。在容器中使用localhost只会指向它自己。

Docker有内置的DNS服务器,容器可以像您一样使用容器名称相互连接,但是您的数据库名在示例中仍然是错误的,根据您的撰写文件,它们应该是商业和cms。

代码语言:javascript
复制
"ConnectionStrings": {
    "EcfSqlConnection": "Server=sql-commerce,1433;Database=commerce;User Id=sa;Password=Passw0rd123!;MultipleActiveResultSets=True",
    "EPiServerDB": "Server=sql-cms,8080;Database=cms;User Id=sa;Password=Passw0rd123!;MultipleActiveResultSets=True"
},
票数 0
EN

Stack Overflow用户

发布于 2022-09-19 16:13:17

我也有同样的错误,尝试从连接字符串中删除端口,如下所示:

代码语言:javascript
复制
"ConnectionStrings": {
    "EcfSqlConnection": "Server=sql-commerce;Database=projectCommerce;User Id=sa;Password=Passw0rd123!;MultipleActiveResultSets=True",
    "EPiServerDB": "Server=sql-cms,8080;Database=projectCms;User Id=sa;Password=Passw0rd123!;MultipleActiveResultSets=True"
  },
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72101041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档