【问题标题】:Connect to MySQL container from Web Api .Net Core Container? How to get Ip Address?从 Web Api .Net Core Container 连接到 MySQL 容器?如何获取IP地址?
【发布时间】:2019-03-11 14:49:47
【问题描述】:

我知道这是一个菜鸟问题,但我无法理解如何让我的 .Net Core 网站连接到我的 MySql 容器。因此,一些背景知识,MySql 和 .Net 核心网站都在各自的容器中。我已经启动了 MySql 容器并设置了 root 帐户来工作。我在 .Net Core 项目中使用实体框架。

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

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

如果 IP 可以更改,我应该告诉我的 .Net Core 程序是 MySql 容器的 IP 地址吗?

.Net Core 程序内部:

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 容器?截至目前,我正在尝试使用 localhost,但连接被拒绝。但我可以使用工作台连接到 MySql 数据库。

我也不确定,但这两个设置是否可以组合成一些文件,我认为它们可能被称为 docker-compose 文件?

Dockerfile

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"]

【问题讨论】:

  • 这两个容器是否在同一台机器上运行?你在使用 docker-compose 吗?因为在第一种情况下,您可以引用 localhost,但是您必须公开正确的端口才能使容器可以从外部访问
  • 容器与 linux 容器在同一台机器上运行。我刚刚使用它设置的 MySql 容器。 docker run --name mysql_container -d -p 3306:3306 那我用visual studio创建的dockerfile更新问题。

标签: c# mysql docker docker-networking


【解决方案1】:

如果您启动了暴露端口的 MySQL,您应该能够从 localhost 连接到它,使用端口 3306。 否则,正如您所建议的,可以设置docker-compose file。该文件通常包含您的应用程序运行所需的所有配置。因此,例如,适合您的应用程序的配置(注意:我假设您使用的是 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 标志。

希望对你有帮助!

【讨论】:

  • 我正在努力将其添加到 docker compose 文件中,我遇到了一些问题,但我认为我需要 Visual Studio 在添加其中一些位之前对它创建的 docker compose 执行清理。
  • 要清理 docker-compose 创建的所有内容,您应该在编辑首先创建资源的 docker-compose 之前使用 docker-compose down -v --rmi all 之类的东西(我将使用此命令) .要清理您在 docker 安装中未主动使用的图像,您要搜索的命令是 docker image prune -a。小心使用!
  • 我不确定 Visual Studio 做了什么,但 VS 中的“清理”命令似乎完成了大部分工作。
  • 我不能在这里帮助你,因为我不使用 Visual Studio。无论如何,请检查它是否已使用docker ps -a 清除所有内容。如果您的应用程序没有正在运行的实例,那么我认为您很好。
  • 好吧,我只是想确保一切都是“安全的”。如果我的 MySql 容器在 1 个容器中运行,而我的 Api 在另一个容器中运行,我不应该将端口 3306 暴露给主机吗?所以我正在努力测试
猜你喜欢
  • 2019-04-27
  • 2020-12-11
  • 2021-09-03
  • 1970-01-01
  • 2014-04-27
  • 2021-08-27
  • 2016-12-27
  • 2023-03-09
  • 2015-08-13
相关资源
最近更新 更多