Docker 容器无法连接 MongoDB
Docker container fails to connect MongoDB
我已经使用 Visual Studio 创建了 .NET 核心 WebAPI 项目。添加了 Docker 支持(以便稍后在 digitalocean 上托管它),但我遇到了一个问题。
当我 运行 docker-compose - 一切正常,但当我尝试在 mongoDB 集合中搜索时,我得到下一个错误:
A timeout occured after 30000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } }. Client view of cluster state is { ClusterId : "1", ConnectionMode : "Automatic", Type : "Unknown", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "127.0.0.1:27017" }", EndPoint: "127.0.0.1:27017", State: "Disconnected", Type: "Unknown", HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server. ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: Connection refused 127.0.0.1:27017
at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MongoDB.Driver.Core.Connections.TcpStreamFactory.<ConnectAsync>d__7.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MongoDB.Driver.Core.Connections.TcpStreamFactory.<CreateStreamAsync>d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MongoDB.Driver.Core.Connections.BinaryConnection.<OpenHelperAsync>d__48.MoveNext()
--- End of inner exception stack trace ---
at MongoDB.Driver.Core.Connections.BinaryConnection.<OpenHelperAsync>d__48.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MongoDB.Driver.Core.Servers.ServerMonitor.<HeartbeatAsync>d__27.MoveNext()" }] }.'
似乎 docker 容器无法连接到它之外的任何东西,但我是 docker 的新手,几天的谷歌搜索一无所获。
MongoDB 与 WebAPI 位于同一台机器上。如果需要 Dockerfile 或 docker-compose 数据,我会提供。
请帮助我了解我错过了什么,以及如何正确配置 docker 项目以与 mongoDb 一起工作,并在发布到 linux 服务器后保持它的工作。
提前谢谢你。
Docker文件:
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY *.sln ./
COPY Temp_Server/Temp_Server.csproj Temp_Server/
RUN dotnet restore
COPY . .
WORKDIR /src/Temp_Server
RUN dotnet build -c Release -o /app
FROM build AS publish
RUN dotnet publish -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Temp_Server.dll"]
docker-compose.ci.build.yml:
version: '3'
services:
ci-build:
image: microsoft/aspnetcore-build:1.0-2.0
volumes:
- .:/src
working_dir: /src
command: /bin/bash -c "dotnet restore ./Temp_Server.sln && dotnet publish ./Temp_Server.sln -c Release -o ./obj/Docker/publish"
docker-compose.yml:
version: '3'
services:
temp_server:
image: temp_server
build:
context: .
dockerfile: temp_Server/Dockerfile
docker-compose.override.yml:
version: '3'
services:
temp_server:
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "80"
EndPoint : "127.0.0.1:27017"
从 docker 容器的角度来看,这意味着 "in this container"。
您应该将容器的 27017 端口发布到主机 IP,然后将您的 Web 容器配置为使用该套接字。重要的是你不能使用 127.0.0.1 作为 IP,因为每个容器都有这个环回地址。请改用您的本地网络 IP。您可以在此处阅读有关网络的更多信息:https://docs.docker.com/config/containers/container-networking/
或者您应该创建一个桥接网络并将容器连接到它,并使用自动服务发现按名称引用容器(如 mymongo:27017)。
https://docs.docker.com/docker-cloud/apps/service-links/#discovering-containers-on-the-same-service-or-stack
我已经使用 Visual Studio 创建了 .NET 核心 WebAPI 项目。添加了 Docker 支持(以便稍后在 digitalocean 上托管它),但我遇到了一个问题。 当我 运行 docker-compose - 一切正常,但当我尝试在 mongoDB 集合中搜索时,我得到下一个错误:
A timeout occured after 30000ms selecting a server using CompositeServerSelector{ Selectors = MongoDB.Driver.MongoClient+AreSessionsSupportedServerSelector, LatencyLimitingServerSelector{ AllowedLatencyRange = 00:00:00.0150000 } }. Client view of cluster state is { ClusterId : "1", ConnectionMode : "Automatic", Type : "Unknown", State : "Disconnected", Servers : [{ ServerId: "{ ClusterId : 1, EndPoint : "127.0.0.1:27017" }", EndPoint: "127.0.0.1:27017", State: "Disconnected", Type: "Unknown", HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server. ---> System.Net.Internals.SocketExceptionFactory+ExtendedSocketException: Connection refused 127.0.0.1:27017
at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
at System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot)
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MongoDB.Driver.Core.Connections.TcpStreamFactory.<ConnectAsync>d__7.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MongoDB.Driver.Core.Connections.TcpStreamFactory.<CreateStreamAsync>d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MongoDB.Driver.Core.Connections.BinaryConnection.<OpenHelperAsync>d__48.MoveNext()
--- End of inner exception stack trace ---
at MongoDB.Driver.Core.Connections.BinaryConnection.<OpenHelperAsync>d__48.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MongoDB.Driver.Core.Servers.ServerMonitor.<HeartbeatAsync>d__27.MoveNext()" }] }.'
似乎 docker 容器无法连接到它之外的任何东西,但我是 docker 的新手,几天的谷歌搜索一无所获。
MongoDB 与 WebAPI 位于同一台机器上。如果需要 Dockerfile 或 docker-compose 数据,我会提供。
请帮助我了解我错过了什么,以及如何正确配置 docker 项目以与 mongoDb 一起工作,并在发布到 linux 服务器后保持它的工作。 提前谢谢你。
Docker文件:
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80
FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY *.sln ./
COPY Temp_Server/Temp_Server.csproj Temp_Server/
RUN dotnet restore
COPY . .
WORKDIR /src/Temp_Server
RUN dotnet build -c Release -o /app
FROM build AS publish
RUN dotnet publish -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Temp_Server.dll"]
docker-compose.ci.build.yml:
version: '3'
services:
ci-build:
image: microsoft/aspnetcore-build:1.0-2.0
volumes:
- .:/src
working_dir: /src
command: /bin/bash -c "dotnet restore ./Temp_Server.sln && dotnet publish ./Temp_Server.sln -c Release -o ./obj/Docker/publish"
docker-compose.yml:
version: '3'
services:
temp_server:
image: temp_server
build:
context: .
dockerfile: temp_Server/Dockerfile
docker-compose.override.yml:
version: '3'
services:
temp_server:
environment:
- ASPNETCORE_ENVIRONMENT=Development
ports:
- "80"
EndPoint : "127.0.0.1:27017"
从 docker 容器的角度来看,这意味着 "in this container"。
您应该将容器的 27017 端口发布到主机 IP,然后将您的 Web 容器配置为使用该套接字。重要的是你不能使用 127.0.0.1 作为 IP,因为每个容器都有这个环回地址。请改用您的本地网络 IP。您可以在此处阅读有关网络的更多信息:https://docs.docker.com/config/containers/container-networking/
或者您应该创建一个桥接网络并将容器连接到它,并使用自动服务发现按名称引用容器(如 mymongo:27017)。 https://docs.docker.com/docker-cloud/apps/service-links/#discovering-containers-on-the-same-service-or-stack