c# - 从 Web Api .Net Core 容器连接到 MySQL 容器?如何获取IP地址?

标签 c# mysql docker docker-networking

我知道这是一个菜鸟问题,但我无法理解如何让我的 .Net Core 网站连接到我的 MySql 容器。所以一些背景,MySql 和.Net 核心网站都在它们单独的容器中。我已经启动了 MySql 容器并设置了 root 帐户来工作。我在 .Net Core 项目中使用 Entity Framework。

我使用以下语句创建了 MySql 容器: docker run --name mysql_container -d -p 3306:3306

下面是 Visual Studio 为我生成的 dockerfile。

如果 MySql 容器的 IP 地址可以更改,那么我要告诉我的 .Net Core 程序什么?

.Net 核心程序内部:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            var connection = $"Server={GetDBAddress()};Database=myDataBase;Uid=root;Pwd=root;";
            services.AddDbContext<ToDoContext>(options => options.UseMySQL(connection));
        }

如果我编写 GetDBAddress 函数,那里面有什么?我不能简单地返回 localhost 因为它是另一个 docker 容器?截至目前,我正在尝试使用本地主机,但连接被拒绝。但是我可以使用工作台连接到 MySql 数据库。

我也不确定,但这两个设置是否可以合并到某个文件中,我认为它们可能称为 docker-compose 文件?

docker 文件

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY ["ToDoService/ToDoService.csproj", "ToDoService/"]
RUN dotnet restore "ToDoService/ToDoService.csproj"
COPY . .
WORKDIR "/src/ToDoService"
RUN dotnet build "ToDoService.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "ToDoService.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "ToDoService.dll"]

最佳答案

如果您启动了 MySQL 并公开了端口,您应该能够从 localhost 连接到它,端口为 3306。 否则,正如您所建议的,可以设置一个 docker-compose 文件。该文件通常包含您的应用程序运行所需的所有配置。因此,例如,适合您的应用程序的配置(注意:我假设您使用的是 MySQL 5.7,因为您没有指定)可能是:

version: '3.3'

services: # list of services composing your application
   db: # the service hosting your MySQL instance
     image: mysql:5.7 # the image and tag docker will pull from docker hub
     volumes: # this section allows you to configure persistence within multiple restarts
       - db_data:/var/lib/mysql
     restart: always # if the db crash somehow, restart it
     environment: # env variables, you usually set this to override existing ones
       MYSQL_ROOT_PASSWORD: root
       MYSQL_DATABASE: todoservice
       MYSQL_USER: root
       MYSQL_PASSWORD: root
   todoservice: # you application service
     build: ./ # this tells docker-compose to not pull from docker hub, but to build from the Dockerfile it will find in ./
     restart: always
     depends_on: # set a dependency between your service and the database: this means that your application will not run if the db service is not running, but it doesn't assure you that the dabase will be ready to accept incoming connection (so your application could crash untill the db initializes itself)
       - db

volumes:
    db_data: # this tells docker-compose to save your data in a generic docker volume. You can see existing volumes typing 'docker volume ls'

要启动和部署您的应用程序,现在您需要在终端中输入: docker-compose up 这将启动您的部署。请注意,此处未公开任何端口:只有您的服务才能从 db:3306 访问数据库(您不需要通过 IP 引用,但您可以使用服务名称访问其他服务). 出于调试目的,您仍然可以打开数据库端口,在 image 下添加此行:

ports:
  - "3306:3306"

请注意,此端口必须是空闲的(没有其他系统服务正在使用它),否则整个部署将失败。

最后说明:因为 docker-compose 会尽量避免在每次启动服务时构建您的镜像,要强制它构建一个新镜像,您必须将 --build 附加到docker-compose up 命令。

要停止部署,只需使用 docker-compose down。要删除与部署相关的所有持久数据(即从新数据库开始),请在上一个命令的末尾附加 -v 标志。

希望对您有所帮助!

关于c# - 从 Web Api .Net Core 容器连接到 MySQL 容器?如何获取IP地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52676741/

相关文章:

docker - 我需要有关docker-compose.yml的信息-如何配置/导出到kubernetes入口

c# - 在自动化测试构建期间如何使用 BACPAC 恢复 Azure 数据库?

php - 具有父主题和子主题的网站的 MySQL 结构

docker - Jenkins 多次构建 docker 端口冲突

java - 从 java swing 导出和导入数据库 mysql

c# - 当 ID 字段 (PK) 自动递增时(带有 EF 的 MySQL),使用与之前相同的 Id 恢复已删除的记录

sql-server - 无法从同一主机上的Web应用程序Docker访问Docker托管的SQL Server

c# - 将 Ninject 属性设置为私有(private)

c# - .NET Native 代码在构造函数上崩溃?.Invoke()(空传播)

c# - ThreadAbortException 与 C# 中的优雅事件句柄退出