目录
Docker Compose
简介
安装
webApi 项目
创建项目
编写 Dockfile
Web MVC 项目
创建项目
编写 Dockfile
编写 docker-compose.yml 文件
运行项目
源代码
参考
本文模拟一个比较完整的项目, 包括前端 (MVC), 后端(WebApi) 和数据库(mssql-server-linux). 通过 Docker Compose 定义, 组合并执行它们. 涉及到 Docker Compose 安装, 命令, docker-compose.yml 文件编写, WebApi 和 MVC 项目编写, Dockfile 编写等
Docker Compose
简介
Docker Compose 是 Docker 三剑客之一, 用于定义和运行多个 Docker 容器应用, 负责实现对 Docker 容器集群的快速编排.
我们可以通过 Dockerfile 定义一个单独的应用容器. 然而在日常工作中, 经常会碰到需要多个容器相互配合来完成某项任务的情况. 例如要实现一个 Web 项目, 除了 Web 服务容器本身, 往往还需要再加上后端的数据库服务容器等.
Compose 恰好满足了这样的需求. 它允许用户通过一个单独的 docker-compose.yml 配置板文件 (YAML 格式) 来定义一组相关联的应用容器. 然后使用使用单个命令, 就可以根据配置中创建并启动所有服务.
安装
curl 下载 Docker Compose
sudo curl -L https://github.com/docker/compose/releases/download/{{site.compose_version}}/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
替换 {{site.compose_version}} 为最新的版本号 https://github.com/docker/compose/releases
赋执行权限
sudo chmod +x /usr/local/bin/docker-compose
测试是否安装成功
docker-compose --version
WebApi 项目
创建项目
参考微软示例 Create a Web API https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-2.1 创建一个基于 net core 2.1 的 WebApi 项目, 命名为 Todo.Api. 参照示例添加 model 和 database context.
在 ConfigureServices 里注册 database context.
- services.AddDbContext<TodoContext>(options =>
- options.UseSqlServer(Configuration["ConnectionString"]));
参考微软示例 Work with SQL Server LocalDB https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-mvc-app/working-with-sql?view=aspnetcore-2.1&tabs=aspnetcore2x 添加 Seed 类并在 Program.cs 里面添加 seed initializer 等.
- public static void Main(string[] args)
- {
- var host = CreateWebHostBuilder(args).Build();
- using (var scope = host.Services.CreateScope())
- {
- var services = scope.ServiceProvider;
- try
- {
- var context = services.GetRequiredService<TodoContext>();
- if (context.Database.GetPendingMigrations().Any())
- {
- context.Database.Migrate();
- SeedData.Initialize(services);
- }
- }
- catch (Exception ex)
- {
- var logger = services.GetRequiredService<ILogger<Program>>();
- logger.LogError(ex, "An error occurred seeding the DB.");
- }
- }
- host.Run();
- }
只需要运行 Add-Migration 命令生成迁移. 无需执行 Update-Database 命令, 因为程序运行起来时候会通过 context.Database.Migrate()来执行迁移.
编写 Dockfile
- FROM microsoft/dotnet:2.1-aspnetcore-runtime
- WORKDIR /app
- EXPOSE 80/tcp
- ENTRYPOINT ["dotnet", "Todo.Api.dll"]
Web MVC 项目
创建项目
创建一个基于 net core 2.1 的 Web MVC 项目, 命名为 webMVC.
添加 Service 去调用 WebApi 开放的接口.
- public class TodoService : ITodoService
- {
- private readonly HttpClient _apiClient;
- private readonly IOptions<ApiConfig> _setting;
- public TodoService(HttpClient httpClient, IOptions<ApiConfig> settings)
- {
- _apiClient = httpClient;
- _setting = settings;
- }
- public async Task<IEnumerable<TodoViewModel>> GetTodos()
- {
- var url = $"{_setting.Value.TodoApiUrl}/api/todo";
- var dataString = await _apiClient.GetStringAsync(url);
- return JsonConvert.DeserializeObject<IEnumerable<TodoViewModel>>(dataString);
- }
- public async Task<IEnumerable<string>> GetMachineNames()
- {
- var url = $"{_setting.Value.TodoApiUrl}/api/machine";
- var dataString = await _apiClient.GetStringAsync(url);
- return JsonConvert.DeserializeObject<IEnumerable<string>>(dataString);
- }
- }
编写 Dockfile
- FROM microsoft/dotnet:2.1-aspnetcore-runtime
- WORKDIR /app
- EXPOSE 80/tcp
- ENTRYPOINT ["dotnet", "WebMVC.dll"]
编写 docker-compose.yml 文件
- version: "3"
- services:
- webmvc:
- image: webmvc
- environment:
- - ASPNETCORE_URLS=http://0.0.0.0:80
- build:
- context: ./WebMVC
- dockerfile: Dockerfile
- ports:
- - "8080:80"
- volumes:
- - ./WebMVC/bin/pub/:/app
- container_name: webmvc
- depends_on:
- - todo.api
- todo.api:
- image: todo.api
- environment:
- - ASPNETCORE_URLS=http://0.0.0.0:80
- - ConnectionString=Server=sql.data;User=sa;Password=Pass@word;Database=WebAPI_SQL_Docker_Demo;
- build:
- context: ./Todo.Api
- dockerfile: Dockerfile
- ports:
- - "8081:80"
- volumes:
- - ./Todo.Api/bin/pub/:/app
- container_name: todo.api
- depends_on:
- - sql.data
- sql.data:
- image: microsoft/mssql-server-linux:2017-latest
- environment:
- - SA_PASSWORD=Pass@word
- - ACCEPT_EULA=Y
- ports:
- - "1433:1433"
image: 指定镜像或构建生成镜像的名字
build: 构建生成镜像. context 指令指定 Dockerfile 所在文件夹的路径, dockerfile 指令指定 Dockerfile 文件名
environment: 设置环境变量
ports: 暴露端口信息. 使用宿主端口: 容器端口 (HOST:CONTAINER) 格式
volumes: 数据卷所挂载路径设置. 可以设置宿主机路径 (HOST:CONTAINER)
container_name: 指定容器名称. 默认将会使用 项目名称_服务名称_序号 这样的格式
depends_on: 解决容器的依赖, 启动先后的问题
详细请参考 Compose file version 3 reference https://docs.docker.com/compose/compose-file/
运行项目
在 docker-compose.yml 文件通目录下执行
docker-compose build
构建项目中的服务容器.
docker-compose build
通过 docker-compose up 创建, 关联并启动服务.
docker-compose up
-d 在后台运行服务容器.
--scale SERVICE=NUM 创建服务的 N 个实例.
详细请参考 Compose (docker-compose) CLI reference https://docs.docker.com/compose/reference/overview/
源代码
https://github.com/zdz72113/Docker.Demos/tree/master/WebAPI_SQL_Docker_Demo
参考
- compose gitHub https://github.com/docker/compose
- Quickstart: Compose and ASP.NET Core with SQL Server https://docs.docker.com/compose/aspnet-mssql-compose/
Get Started Building Microservices with ASP.NET Core and Docker in Visual Studio Code https://fullstackmark.com/post/12/get-started-building-microservices-with-asp.net-core-and-docker-in-visual-studio-code
Docker Compose 项目 https://github.com/yeasy/docker_practice/tree/master/compose
来源: https://www.cnblogs.com/royzshare/p/9359343.html