如何配置Docker与yml文件实现多Web API项目差异化连接部署?
我来帮你梳理下如何配置这个多服务架构的Docker Compose YAML,同时给两个Web API配置独立的数据库连接字符串,步骤很清晰:
1. 完善Docker Compose配置文件
我们需要用docker-compose.yml(基础配置)和docker-compose.override.yml(开发环境专属配置)配合,先看基础的主配置文件:
version: '3.8' services: # 调用两个API的Web应用服务 webapp: build: context: ./WebApp # 替换成你的Web应用项目实际路径 dockerfile: Dockerfile depends_on: - newpost.api - twobatch networks: - app-network # 第一个Web API服务 newpost.api: build: context: ./NewPost.Api # 替换成第一个API的实际项目路径 dockerfile: Dockerfile networks: - app-network # 第二个Web API服务 twobatch: build: context: ./TwoBatch # 替换成第二个API的实际项目路径 dockerfile: Dockerfile networks: - app-network networks: app-network: driver: bridge
接下来完善你的docker-compose.override.yml,重点配置开发环境的端口、独立数据库连接字符串:
version: '3.8' services: webapp: environment: - ASPNETCORE_ENVIRONMENT=Development # 给Web应用配置两个API的调用地址,方便后续读取 - NewPostApiUrl=http://newpost.api - TwoBatchApiUrl=http://twobatch ports: - "5000:80" # 本地5000端口映射到Web应用容器的80端口 newpost.api: environment: - ASPNETCORE_ENVIRONMENT=Development # 第一个API的专属数据库连接字符串,双下划线会被ASP.NET Core解析为配置节点的冒号 - ConnectionStrings__DefaultConnection=Data Source=host.docker.internal\SQLEXPRESS;Initial Catalog=dbpractice;Integrated Security=True ports: - "5001:80" # 本地5001端口访问第一个API twobatch: environment: - ASPNETCORE_ENVIRONMENT=Development # 第二个API的专属数据库连接字符串,指向不同的数据库 - ConnectionStrings__DefaultConnection=Data Source=host.docker.internal\SQLEXPRESS;Initial Catalog=dbpractice_twobatch;Integrated Security=True ports: - "5002:80" # 本地5002端口访问第二个API
注意:如果你的SQL Server是本地安装的,要用
host.docker.internal代替你的机器名(比如DESKTOP-QVMU6HA),这样Docker容器才能访问本地数据库。
2. 让Web API读取各自的连接字符串
在每个API的Program.cs(旧版本用Startup.cs)里,配置DbContext时读取对应环境变量的连接字符串:
var builder = WebApplication.CreateBuilder(args); // 注册DbContext,自动读取配置里的DefaultConnection字符串 builder.Services.AddDbContext<YourDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); // 其他服务、中间件配置... var app = builder.Build(); app.Run();
这样两个API就会各自加载自己的连接字符串,连接到不同的数据库。
3. 配置Web应用调用两个API
在Web应用里,通过读取环境变量获取API地址,用HttpClient调用:
首先在Program.cs里注册命名HttpClient:
var builder = WebApplication.CreateBuilder(args); // 注册第一个API的HttpClient builder.Services.AddHttpClient("NewPostApi", client => { client.BaseAddress = new Uri(builder.Configuration["NewPostApiUrl"] ?? "http://newpost.api"); }); // 注册第二个API的HttpClient builder.Services.AddHttpClient("TwoBatchApi", client => { client.BaseAddress = new Uri(builder.Configuration["TwoBatchApiUrl"] ?? "http://twobatch"); }); // 其他服务配置... var app = builder.Build(); app.Run();
然后在控制器里注入IHttpClientFactory调用API:
public class HomeController : Controller { private readonly IHttpClientFactory _httpClientFactory; public HomeController(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } public async Task<IActionResult> Index() { // 调用第一个API的接口 var newPostClient = _httpClientFactory.CreateClient("NewPostApi"); var newPostData = await newPostClient.GetFromJsonAsync<YourModel>("/api/posts"); // 调用第二个API的接口 var twoBatchClient = _httpClientFactory.CreateClient("TwoBatchApi"); var twoBatchData = await twoBatchClient.GetFromJsonAsync<AnotherModel>("/api/batches"); // 处理数据并返回视图... return View(); } }
4. 最后一步:给每个项目加Dockerfile
每个.NET项目都需要自己的Dockerfile,模板如下(替换成你的项目名称):
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["YourProjectName.csproj", "."] RUN dotnet restore "./YourProjectName.csproj" COPY . . WORKDIR "/src/." RUN dotnet build "YourProjectName.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "YourProjectName.csproj" -c Release -o /app/publish /p:UseAppHost=false FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "YourProjectName.dll"]
一切配置好后,在包含docker-compose.yml的目录下执行docker-compose up --build,就能一键启动所有服务了。
内容的提问来源于stack exchange,提问作者sm12
相关产品推荐
相关产品推荐

