我在docker中运行了.NET Core控制台应用程序,我想连接到本地MSSQL数据库(未进行dockerized!),但是我无法这样做。通过IP连接到远程服务器上的DB可以正常工作,但是使用Data Source=DESKTOP-9DRU731;Initial Catalog=DB;User id=user;password=password;
这样的连接字符串会给我一个错误
System.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: 35 - An internal exception was caught) ---> System.AggregateException: One or more errors occurred. (No such device or address) ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: No such device or address
有什么办法吗?
我已经尝试在dockerfile中添加暴露,并在docker compose中为端口1433添加端口映射,以及将网络设置为主机。我的数据库启用了远程访问,并且在连接字符串中包含主机IP和端口时,我可以连接到它,但是要求连接字符串保持不变。我也尝试使用host.docker.internal
,但还是没有运气。我认为其中一些可能由于我使用的环境而失败,即:
我也尝试使用桥接网络,但是在那种情况下,当我尝试连接到DB时,我什至无法到达那部分,就像之前那样,我试图创建Service Bus队列,但由于套接字异常而失败。 / p>
我的dockerfile:
FROM microsoft/dotnet:2.2-sdk AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and build
COPY . ./
RUN dotnet publish -c Release -o out
# Build runtime image
FROM microsoft/dotnet:2.2-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "app.dll"]
和docker组成:
version: '3.4'
services:
app:
image: ${DOCKER_REGISTRY-}app
build:
context: .
dockerfile: app/Dockerfile
编辑
感谢@Mihai,有一个可能的解决方案。添加
extra_hosts:
- "DESKTOP-9DRU731:<your_host_ip>"
对Dockerfile起作用。不幸的是,我正在寻找更通用的解决方案。
我将添加更多上下文-我将近100个连接字符串存储在远程数据库中。他们指向特定于外部应用程序实例的数据库。这些数据库位于主机或主机的专用网络中,我需要使用该专用网络中的服务器名称或IP连接到它们。
答案 0 :(得分:1)
您的docker-compose.yml:
version: '3.4'
services:
app:
image: ${DOCKER_REGISTRY-}app
build:
context: .
dockerfile: app/Dockerfile
extra_hosts:
- "DESKTOP-9DRU731:<your_host_ip>"
如果可以,您可以尝试一下吗?
如果您移动主机,则显然可以正常工作。另外,如果主机更改IP,它将停止工作。
我建议像这样从.env文件中提取这些值:
HOSTNAME=...
HOSTIP=....
然后您的docker-compose.yml将变为:
version: '3.4'
services:
app:
image: ${DOCKER_REGISTRY-}app
build:
context: .
dockerfile: app/Dockerfile
extra_hosts:
- "$HOSTNAME:$HOSTIP"
如果您有更多服务并且进行了某些更改,则也只需通过这种方式即可更新.env文件。而且.env可以被多个docker-compose文件使用。