Docker-контейнер не может подключиться к MongoDB - PullRequest
0 голосов
/ 12 июня 2018

Я создал .NET основной проект WebAPI, используя Visual Studio.Добавлена ​​поддержка 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 и несколько дней поиска в Google ничего не дали.

MongoDB находится на той же машине, что и WebAPI.Если нужны данные Dockerfile или docker-compose, я предоставлю их.

Пожалуйста, помогите мне понять, что я пропустил и как правильно настроить проект docker для работы с mongoDb и чтобы это работало даже после публикации всервер linuxЗаранее благодарю.

Dockerfile:

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"

1 Ответ

0 голосов
/ 12 июня 2018
EndPoint : "127.0.0.1:27017"

С точки зрения контейнера-докера это означает "в этом контейнере".

Вам следует опубликовать порт контейнера 27017 для IP-адреса хоста, а затем настроить свой веб-контейнер на использование этого сокета.Важно, что вы не можете использовать 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

...