本文模拟一个比较完整的项目,包括前端(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 格式)来定义一组相关联的应用容器。然后使用使用单个命令,就可以根据配置中创建并启动所有服务。

安装

  1. curl 下载 Docker Compose
  1. 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}}为最新的版本号

  1. 赋执行权限
  1. sudo chmod +x /usr/local/bin/docker-compose
  1. 测试是否安装成功
  1. docker-compose --version

WebApi 项目

创建项目

  1. 参考微软示例Create a Web API 创建一个基于 net core 2.1的WebApi项目,命名为Todo.Api. 参照示例添加 model 和 database context。

  2. 在 ConfigureServices 里注册 database context.

  1. services.AddDbContext<TodoContext>(options =>
  2. options.UseSqlServer(Configuration["ConnectionString"]));
  1. 参考微软示例Work with SQL Server LocalDB 添加 Seed 类并在Program.cs里面添加 seed initializer等。
  1. public static void Main(string[] args)
  2. {
  3. var host = CreateWebHostBuilder(args).Build();
  4. using (var scope = host.Services.CreateScope())
  5. {
  6. var services = scope.ServiceProvider;
  7. try
  8. {
  9. var context = services.GetRequiredService<TodoContext>();
  10. if (context.Database.GetPendingMigrations().Any())
  11. {
  12. context.Database.Migrate();
  13. SeedData.Initialize(services);
  14. }
  15. }
  16. catch (Exception ex)
  17. {
  18. var logger = services.GetRequiredService<ILogger<Program>>();
  19. logger.LogError(ex, "An error occurred seeding the DB.");
  20. }
  21. }
  22. host.Run();
  23. }

只需要运行Add-Migration命令生成迁移。无需执行Update-Database命令,因为程序运行起来时候会通过context.Database.Migrate()来执行迁移。

编写Dockfile

  1. FROM microsoft/dotnet:2.1-aspnetcore-runtime
  2. WORKDIR /app
  3. EXPOSE 80/tcp
  4. ENTRYPOINT ["dotnet", "Todo.Api.dll"]

Web MVC 项目

创建项目

  1. 创建一个基于 net core 2.1的Web MVC项目,命名为webMVC.

  2. 添加 Service 去调用 WebApi 开放的接口。

  1. public class TodoService : ITodoService
  2. {
  3. private readonly HttpClient _apiClient;
  4. private readonly IOptions<ApiConfig> _setting;
  5. public TodoService(HttpClient httpClient, IOptions<ApiConfig> settings)
  6. {
  7. _apiClient = httpClient;
  8. _setting = settings;
  9. }
  10. public async Task<IEnumerable<TodoViewModel>> GetTodos()
  11. {
  12. var url = $"{_setting.Value.TodoApiUrl}/api/todo";
  13. var dataString = await _apiClient.GetStringAsync(url);
  14. return JsonConvert.DeserializeObject<IEnumerable<TodoViewModel>>(dataString);
  15. }
  16. public async Task<IEnumerable<string>> GetMachineNames()
  17. {
  18. var url = $"{_setting.Value.TodoApiUrl}/api/machine";
  19. var dataString = await _apiClient.GetStringAsync(url);
  20. return JsonConvert.DeserializeObject<IEnumerable<string>>(dataString);
  21. }
  22. }

编写Dockfile

  1. FROM microsoft/dotnet:2.1-aspnetcore-runtime
  2. WORKDIR /app
  3. EXPOSE 80/tcp
  4. ENTRYPOINT ["dotnet", "WebMVC.dll"]

编写 docker-compose.yml文件

  1. version: "3"
  2. services:
  3. webmvc:
  4. image: webmvc
  5. environment:
  6. - ASPNETCORE_URLS=http://0.0.0.0:80
  7. build:
  8. context: ./WebMVC
  9. dockerfile: Dockerfile
  10. ports:
  11. - "8080:80"
  12. volumes:
  13. - ./WebMVC/bin/pub/:/app
  14. container_name: webmvc
  15. depends_on:
  16. - todo.api
  17. todo.api:
  18. image: todo.api
  19. environment:
  20. - ASPNETCORE_URLS=http://0.0.0.0:80
  21. - ConnectionString=Server=sql.data;User=sa;Password=Pass@word;Database=WebAPI_SQL_Docker_Demo;
  22. build:
  23. context: ./Todo.Api
  24. dockerfile: Dockerfile
  25. ports:
  26. - "8081:80"
  27. volumes:
  28. - ./Todo.Api/bin/pub/:/app
  29. container_name: todo.api
  30. depends_on:
  31. - sql.data
  32. sql.data:
  33. image: microsoft/mssql-server-linux:2017-latest
  34. environment:
  35. - SA_PASSWORD=Pass@word
  36. - ACCEPT_EULA=Y
  37. ports:
  38. - "1433:1433"

image: 指定镜像或构建生成镜像的名字

build:构建生成镜像。context 指令指定 Dockerfile 所在文件夹的路径,dockerfile 指令指定 Dockerfile 文件名

environment:设置环境变量

ports:暴露端口信息。使用宿主端口:容器端口 (HOST:CONTAINER) 格式

volumes:数据卷所挂载路径设置。可以设置宿主机路径 (HOST:CONTAINER)

container_name:指定容器名称。默认将会使用 项目名称_服务名称_序号 这样的格式

depends_on:解决容器的依赖、启动先后的问题

详细请参考 Compose file version 3 reference

运行项目

  1. 在docker-compose.yml文件通目录下执行docker-compose build构建项目中的服务容器.
  1. docker-compose build
  1. 通过 docker-compose up 创建,关联并启动服务.
  1. docker-compose up

-d 在后台运行服务容器。

--scale SERVICE=NUM 创建服务的N个实例。

详细请参考 Compose (docker-compose) CLI reference

源代码

参考

通过 Docker Compose 组合 ASP NET Core 和 SQL Server的更多相关文章

  1. 在Windows Server 2019通过Docker Compose部署Asp.Net Core

    一.安装Docker Enterprise 安装文档是: https://docs.docker.com/install/windows/docker-ee/ 安装完成后,如下图 二.首先,拉取一个W ...

  2. linux+asp.net core+nginx+sql server

    Linux Disibutaion:Ubuntu 16.04.1 LTS Web Server:Nginx.Kestrel 安装.net core sudo sh -c 'echo "deb ...

  3. asp.net core 中 sql server 2017 数据库连接测试

    使用sql server 2017 进行连接: 配置appsettings.json文件 { "ConnectionStrings": { "DefaultConnect ...

  4. docker中运行ASP.NET Core Web API

    在docker中运行ASP.NET Core Web API应用程序 本文是一篇指导快速演练的文章,将介绍在docker中运行一个ASP.NET Core Web API应用程序的基本步骤,在介绍的过 ...

  5. Ubuntu & Docker & Consul & Fabio & ASP.NET Core 2.0 微服务跨平台实践

    相关博文: Ubuntu 简单安装 Docker Mac OS.Ubuntu 安装及使用 Consul Consul 服务注册与服务发现 Fabio 安装和简单使用 阅读目录: Docker 运行 C ...

  6. Docker & Consul & Fabio & ASP.NET Core 2.0 微服务跨平台实践

    相关博文: Ubuntu 简单安装 Docker Mac OS.Ubuntu 安装及使用 Consul Consul 服务注册与服务发现 Fabio 安装和简单使用 阅读目录: Docker 运行 C ...

  7. 使用docker来部署asp.net core的程序

    使用docker来部署asp.net core程序 暂不介绍docker是个什么东西?不知道的自己百度. 第一步安装docker: 我的docker是装在centos7系统上,windows上我的也用 ...

  8. Asp.net core Identity + identity server + angular 学习笔记 (第一篇)

    用了很长一段时间了, 但是一直没有做过任何笔记,感觉 identity 太多东西要写了, 提不起劲. 但是时间一久很多东西都记不清了. 还是写一轮吧. 加深记忆. 这是 0-1 的笔记, 会写好多篇. ...

  9. ASP.net(C#)利用SQL Server实现注册和登陆功能

    说说我现在吧,楼主现在从事的事IT行业,主攻DotNet技术:当然这次上博客园我也是有备而来,所有再次奉献鄙人拙作,以飨诸位,望诸位不吝赐教. 世界上大多数的工作都是熟练性的工种,编程也不例外,做久了 ...

随机推荐

  1. LR中的迭代次数设置

    在参数化时,对于一次压力测试中均只能用一次的资源应该怎么参数化呢?就是说这些资源用了一次就不能在用了的. --参数化时,在select  next row选择unique,update value o ...

  2. Java ActiveMQ 讲解(一)理解JMS 和 ActiveMQ基本使用

    最近的项目中用到了mq,之前自己一直在码农一样的照葫芦画瓢.最近几天研究了下,把自己所有看下来的文档和了解总结一下. 一. 认识JMS 1.概述 对于JMS,百度百科,是这样介绍的:JMS即Java消 ...

  3. char、varchar、nchar、nvarchar、text的区别

    char.varchar.nchar.nvarchar.text的区别 1.有var前缀的,表示是实际存储空间是变长的,varchar,nvarchar 所谓定长就是长度固定的,当输入的数据长度没有达 ...

  4. ASP.NET Core根据环境切换NLog配置

    1.新建NLog配置文件,名称分别为nlog.config和nlog.debug.config <?xml version="1.0"?> <nlog xmlns ...

  5. Codeforces Beta Round #75 (Div. 1 Only) B. Queue 二分

    B. Queue Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 codeforces.com/problemset/problem/91/B Descrip ...

  6. “全栈2019”Java异常第五章:一定会被执行的finally代码块

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  7. JAVA判断质数

    好久没写了,今天做题有点忘了,不会写了.重新做了一份,整理出来. import java.util.Scanner; public class 判断质数 { public static boolean ...

  8. Linux 下的 netfilter 认识与常规操作

    Linux 下的 netfilter 认识与常规操作 前言 博客写到今天,1年7个月.可是包含所有写作经历,这个时间线可以达到三年. 上次更新了一篇 "镇站之宝" ,也是本站阅读量 ...

  9. mybatis的执行流程

    1.SqlSessionFactoryBuilder与SqlSessionFactory 我们一般在使用mybatis是都会通过new SqlSessionFactoryBuilder.build(. ...

  10. 如何使用Node爬虫利器Puppteer进行自动化测试

    文:华为云DevCloud 乐少 1.背景 1.1 前端自动化测试较少 前端浏览器众多导致页面兼容性问题比较多,另外界面变化比较快,一个月内可能页面改版两三次,这样导致对前端自动化测试较少,大家也不是 ...