本文模拟一个比较完整的项目,包括前端(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. VUE 学习笔记 一 指令

    1.声明式渲染 v-bind 特性被称为指令.指令带有前缀 v-,以表示它们是 Vue 提供的特殊特性 <div id='app'> <span v-bind:title=" ...

  2. .net core redis使用

    整理下.net core的redis使用  可以分布式 Nuget安装 StackExchange.Redis using System; using System.Collections.Gener ...

  3. WP8.1StoreApp(WP8.1RT)---发送邮件和短信

    在WP7/8中,发送短信是利用了EmailComposeTask和SmsComposeTask来实现的. 在WP8.1 Store App中,原来的方式已经失效,采用了新的方法:ChatMessage ...

  4. python网络编程--线程的方法,线程池

    一.线程的其他方法(Thread其他属性和方法) ident() 获取线程id Thread实例对象的方法 isAlive() 设置线程名 getName() 返回线程名 setName() 设置线程 ...

  5. mongodb 备份还原

    一.简介 说起来数据库的“备份-还原”,在RDBMS系统中,都有很好的支持,也有很多选项可以设置,功能强大,也能自动完成大部分的备份功能,只要当初设置好了就可以了.对于MongoDB文档型的数据库来说 ...

  6. Android 的学习心得

    https://www.jianshu.com/p/f93a6c75940c    一个2年安卓开发者的一些经验分享

  7. linux命令之信息显示与搜索文件命令

    1.uname:显示系统信息 该命令用于显示系统相关的信息,比如内核版本号,硬件架构等. 参数 说明 -n(常用) 显示主机名称 -r(常用) 显示内核发行版本号 示例: 1)显示主机名 [root@ ...

  8. CASE语句用法学习

    A. 使用带有 CASE 简单表达式的 SELECT 语句 SELECT ProductNumber, Category = CASE ProductLine WHEN 'R' THEN 'Road' ...

  9. (原创推荐文章)kerberos服务器端与客户端

    #环境 两台装centos7的虚拟机即可. kerberos服务器端与客户端各一台 (本文档推荐使用Typora软件观看) # 1.kerberos服务器端配置 ## 1.1安装配置Kerberos ...

  10. linux系统服务管理

    centos7的服务管理命令 systemctl start 服务名称 systemctl stop 服务名称 systemctl status 服务名称 systemctl restart 服务名称 ...