本文模拟一个比较完整的项目,包括前端(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
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. 赋执行权限
sudo chmod +x /usr/local/bin/docker-compose
  1. 测试是否安装成功
docker-compose --version

WebApi 项目

创建项目

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

  2. 在 ConfigureServices 里注册 database context.

services.AddDbContext<TodoContext>(options =>
options.UseSqlServer(Configuration["ConnectionString"]));
  1. 参考微软示例Work with SQL Server LocalDB 添加 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 项目

创建项目

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

  2. 添加 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

运行项目

  1. 在docker-compose.yml文件通目录下执行docker-compose build构建项目中的服务容器.
docker-compose build
  1. 通过 docker-compose up 创建,关联并启动服务.
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. JKS与P12证书互转

    keytool -importkeystore -srckeystore cacerts -srcstoretype JKS -deststoretype PKCS12 -destkeystore k ...

  2. angular响应式表单 - 状态字段

    用于表单验证的过程: touched,untoched pristine,dirty pending

  3. 虚拟机安装MAC OS X 10.9与Windows 7共享文件夹的方法

    在虚拟机中安装好MAC OS X后, 把CD/DVD中的ISO映像换成 VMwareWorkstation安装目录下的/darwin.iso, 然后连接上 进入MAC 系统后, 先安装vmware t ...

  4. RFID

    RFID 物联网必不可少会接触到RFID,国内比较常见的RFID读卡驱动芯片有两款.一款是NXP的RC522这系列的,非常稳定,当然也相对较贵,另一款是复旦微电子的FM1702系列,国产的便宜没得说, ...

  5. JavaScript一个页面中有多个audio标签,其中一个播放结束后自动播放下一个,audio连续播放

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. KVM性能优化学习笔记

    本学习笔记系列都是采用CentOS6.x操作系统,KVM虚拟机的管理也是采用virsh方式,网上的很多的文章都基于ubuntu高版本内核下,KVM的一些新的特性支持更好,本文只是记录了CentOS6. ...

  7. “全栈2019”Java多线程第九章:判断线程是否存活isAlive()详解

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

  8. eclipse的debug模式经常自动跳到TheadPoolExecutor的断点

    1.问题:eclipse的debug模式经常自动跳到TheadPoolExecutor的断点,实在烦人 解决方法是: 在eclipse中选择Window->Preference->Java ...

  9. Windows server 2008启动remote dosktop services服务报错1079

    原创 欢迎转载,届时请注明出处 报错场景 今天,刚开始启动win server的远程连接服务(remote desktop services)时 该服务可以正常启动,然后选择了  “计算机--> ...

  10. python 取出字典的键或者值/如何删除一个字典的键值对/如何遍历字典

    先定义一个字典并直接进行初始化赋值 my_dict = dict(name="lowman", age=45, money=998, hourse=None) 1.取出该字典所有的 ...