从Web Api .Net核心容器连接到MySQL容器?如何获得IP地址?

时间:2018-10-06 07:29:57

标签: c# mysql docker docker-networking

我知道这是一个菜鸟问题,但是我在理解如何使.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函数,那里面有什么?我不能简单地返回本地主机,因为它是另一个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"]

1 个答案:

答案 0 :(得分:2)

如果启动了MySQL公开了端口,则应该可以从localhost到端口3306进行连接。 否则,如您建议的那样,可以设置docker-compose file。该文件通常包含您的应用程序需要运行的所有配置。因此,例如,适合您的应用程序的配置(请注意:由于您尚未指定MySQL,因此我假设您正在使用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标志。

希望有帮助!

相关问题