簡體   English   中英

.Net Core docker 容器無法連接到 MySQL docker 容器

[英].Net Core docker container unable to connect to MySQL docker container

我有一個托管在 docker 容器上的 mysql 數據庫。 我能夠在我的 Windows 10 機器上使用 dbeaver 客戶端應用程序連接到 mysql 數據庫(托管在 docker 容器上)。 但是,我無法從部署在另一個 docker 容器上的 .Net 核心應用程序連接到它。 我收到Unable to connect to any of the specified MySQL hosts. 錯誤。

我可能會錯過什么?

Appsettings.json:

  "ConnectionStrings": {
    "InstaTranscribeDBConnection": "server=localhost;port=3306;database=wordpress;user=root;password=SomePassword;"
  },

Dockerfile:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["server/InstaTranscribe.Server.csproj", "server/"]
COPY ["client/InstaTranscribe.Client.csproj", "client/"]
RUN dotnet restore "server/InstaTranscribe.Server.csproj"
COPY . .
WORKDIR "/src/server"
RUN dotnet build "InstaTranscribe.Server.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "InstaTranscribe.Server.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "InstaTranscribe.Server.dll"]
RUN chmod +x ./entrypoint.sh
CMD /bin/bash ./entrypoint.sh

入口點.sh:

#!/bin/bash

set -e
run_cmd="dotnet run --server.urls http://*:80"    
until dotnet ef database update; do
>&2 echo "SQL Server is starting up"
sleep 1
done    
>&2 echo "SQL Server is up - executing command"
exec $run_cmd

堆棧跟蹤:

Unhandled exception. System.InvalidOperationException: An exception has been raised that is likely due to a transient failure. Consider enabling transient error resiliency by adding 'EnableRetryOnFailure()' to the 'UseMySql' call.
 ---> MySql.Data.MySqlClient.MySqlException (0x80004005): Unable to connect to any of the specified MySQL hosts.
   at MySqlConnector.Core.ServerSession.ConnectAsync(ConnectionSettings cs, Int32 startTickCount, ILoadBalancer loadBalancer, IOBehavior ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/Core/ServerSession.cs:line 474
   at MySql.Data.MySqlClient.MySqlConnection.CreateSessionAsync(ConnectionPool pool, Int32 startTickCount, Nullable`1 ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySql.Data.MySqlClient/MySqlConnection.cs:line 741
   at MySql.Data.MySqlClient.MySqlConnection.OpenAsync(Nullable`1 ioBehavior, CancellationToken cancellationToken) in /_/src/MySqlConnector/MySql.Data.MySqlClient/MySqlConnection.cs:line 396
   at MySql.Data.MySqlClient.MySqlConnection.Open() in /_/src/MySqlConnector/MySql.Data.MySqlClient/MySqlConnection.cs:line 362
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
   at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlRelationalConnection.Open(Boolean errorsExpected)
   at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlDatabaseCreator.<>c__DisplayClass18_0.<Exists>b__0(DateTime giveUp)
   at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.<>c__DisplayClass12_0`2.<Execute>b__0(DbContext c, TState s)
   at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)

您將需要運行多個 docker 實例

  1. .NET 核心
  2. MySQL

更重要的是,他們需要成為同一網絡的一部分。

如果您使用 docker-compose 文件,則在兩個 docker 容器之間配置專用網絡會更容易。

示例如下所示:

version: '3'
services:
  moviedb:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: masteringdocker
      MYSQL_DATABASE: MvcMovieContext
      MYSQL_USER: moviedbadmin
      MYSQL_PASSWORD: masteringdocker
    volumes:
      - ./MvcMovie/init.sql:/docker-entrypoint-initdb.d/init.sql:ro
  web:
    build: .
    restart: always
    ports:
      - "8000:80"
    depends_on:
      - moviedb
      - cache

以上將創建一個默認網絡並將兩個容器放在其上。 但是如果你想更好地控制網絡,你可以添加以下部分。

networks:
  public_net:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: ${NETWORK_SUBNET}

並使用以下部分更新每個服務moviedbweb以使用此網絡:

networks:
  public_net:
     ipv4_address: ${HA_PROXY_IP}

HA_PROXY_IP 在 .env 文件中

HA_PROXY_IP=192.168.0.99

這應該讓你開始。 您必須處理多個文件夾的復雜性,並將docker-compose.ymlDockerfile放在正確的位置,以便一切順利。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM