繁体   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