首页 > 解决方案 > 将 .NET Core Web API 连接到不同 docker 容器上的 MySQL

问题描述

我有 2 个 docker 容器在同一虚拟机上运行(VMWare 工作站 12 Player 上的 Ubuntu 服务器 18.04)。第一个是 MySql Container,它在端口 3306 上运行,第二个是 asp.net core (v2.0) web api(vm 上的端口 5000 并通过端口 80 通过 nginx 导出到外部)。我的虚拟机 api 是 192.168.20.197

项目架构图

我在 web api 项目上的连接字符串是:optionsBuilder.UseMySQL("server=localhost;port=3306;database=mydatabase;user=root;CharSet=utf8");

我的 docker 文件内容是

FROM microsoft/dotnet:sdk AS build-env
WORKDIR /app


COPY *.csproj ./
RUN dotnet restore


COPY . ./
RUN dotnet publish -c Release -o out


FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "DemoMySql.dll"]

我尝试向 VM 上的 web api 发出 HTTP 请求,但是当我尝试与数据库交互时服务器响应错误(500)(当我让它返回示例字符串时,web api 仍然正常工作,例如 192.168.20.197 /api/values/samplestring)。那么如何将 web api 连接到不同容器上的 mysql 呢?

p/s: 对不起我的语法不好

标签: mysql.netdocker.net-coreasp.net-core-webapi

解决方案


感谢@Tao Zhou 和@Nathan Werry 的建议,我通过将连接字符串中的localhost 替换为我的虚拟机的IP 地址解决了这个问题。然后我使用 docker --link 标签(docker 的遗留功能)将 mysql 容器链接到 web api 容器。

docker run \
--name <webapi-container-name> \
-p 8082:8081 \
--link <mysql-container-name>:<mysql-image> \
-d <webapi-image>

推荐阅读