本文简要说一下ASP.NET Core 在Docker中部署以及docker-compose的使用  (ASP.NET Core 系列目录)。 系统环境为CentOS 8 。

 

一、概述

简单说一下Docker的几个概念:

记得上学的时候流行一种安装操作系统的方式,叫GHOST,大概是这样的:

进入PE系统打开GHOST软件,点击“local”,然后选择“Partition”,最后选择“From Image”,选择一个.gho后缀文件,就开始系统安装了。

安装好系统之后,根据自己的需求又安装了一些常用软件,然后为了避免下次重装系统还要安装这些,可以将现在状态的系统再次用GHOST备份一下,生成一个.gho后缀的镜像文件,这个镜像又可以用来安装系统。

一个.gho文件可以用来为多台电脑安装系统,每个被安装好的系统又可以被备份成一个.gho文件文件。

而类比Docker,有这样几个概念:

  1. Image(镜像):有点像.gho后缀的镜像文件。
  2. Container(容器):就像用.gho安装成功的一个操作系统。
  3. Repository(仓库):存放镜像的仓库,像Git一样可以有公有的仓库也可以有私有的。微软的仓库地址为:

但实际上Docker不是一个操作系统,也不像一个虚拟机一样,它是要共享宿主的内核的。

而且一般建议一个容器只跑一个进程,不像操作系统那样可以多进程运行。(虽然也可以通过一些方法在一个Docker容器中跑多个应用,但不建议这样做。)

二、安装docker

说明:安装CentOS 8 选择了最小安装,此处就不说了,下面说一下Docker的安装过程。

  • 安装一些必要的系统工具:

  sudo yum install -y yum-utils device-mapper-persistent-data lvm2

  • 添加软件源信息:

  sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

  • 更新 yum 缓存:

  sudo yum makecache fast

  • 安装 Docker-ce:

  sudo yum -y install docker-ce

  • 启动 Docker 后台服务

  sudo systemctl start docker

  注意:安装Docker-ce的时候可能报错:package docker-ce …… requires containerd.io >= 1.2.2-3, but none of the providers can be installed
                  是因为containerd.io版本过低,可去下面网站查看新版本:

https://download.docker.com/linux/centos/7/x86_64/edge/Packages

  • 下载:

  wget https://download.docker.com/linux/centos/7/x86_64/edge/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm

  • 安装:

  yum -y install containerd.io-1.2.6-3.3.el7.x86_64.rpm
  再次执行sudo yum -y install docker-ce安装即可。

三、Docker的几个常见命令

  • 搜索远程存储库中的镜像,例如MongoDB的镜像
docker search mongo

  • 拉取仓库中的镜像
docker pull  mongo
  •  列出本地镜像。
docker images

可以看到本地镜像中包了mongo镜像。

  • 运行镜像生成一个容器
docker run --name mongotodocker -p : -d mongo

含义: 用镜像mongo运行生成一个容器,名字为mongotodocker ,将容器内的端口27017映射到主机的27088端口。-p 指的是端口映射。 -d是说后台运行容器,并返回容器ID;

  •  列出所有容器
docker ps -a 

可以看到刚运行起来的容器。

  • 停止容器
docker stop mongotodocker
  •  删除容器
docker rm mongotodocker
  • 删除镜像
docker rmi mongo

具体每个命令都有一些参数可用,这里只是简单介绍一下使用方法。具体的文档网上很多,不一一说明了。

四、注册Docker账号

注册一个账号(可选项),地址:https://hub.docker.com/ ,可以在上面建自己的仓库。

五、创建一个ASP.NET Core 项目,生成并运行Docker镜像

新建一个名为DockerComposeDemo的API项目,直接发布,拷贝发布的文件到CentOS系统中,例如/home/aspcore目录。并在该目录新建一个文本文件名为Dockerfile,内容如下:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
COPY . .
ENTRYPOINT ["dotnet", "DockerComposeDemo.dll"]

含义是:引用包含3.0运行时的镜像,这个镜像在远程仓库中,若本地没有提前pull下来,会先执行pull操作获取到本地。然后将工作目录设为/app , 拷贝发布的项目文件,设置进程的入口是通过dotnet运行DockerComposeDemo.dll。

执行如下命令:

cd /home/aspcore
docker build -t dockertest .

注意第二行后后面有个'.'不能少。 含义就是按照Dockerfile文件中设置的规则生成名为dockertest的镜像。

此时执行docker images命令可以看到本地镜像中已经有了 mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim 和 dockertest 两个镜像。

运行这个镜像生成容器:

docker run --name aspdocker -p : -d dockertest

生成一个名为aspdocker 的容器,并将容器的80端口映射到主机的8080端口。访问项目默认提供的controller:http://192.168.183.230:8080/WeatherForecast

可以看到能正常访问。

六:使用docker-compose

因为一个Docker容器只建议运行一个应用,那么一个项目就可能会存在多个容器被运行,可能包含多个项目、数据库等,这时候就需要对这些容器进行统一的管理,从构建运行开始到运行后状态的监控等。

这时候有个简易的方法就是docker-compose,它可以完成多个Docker的统一管理,包括Docker镜像构建、容器运行、相关配置以及Docker之间的依赖关系等。

下面举个简单例子,这个DockerComposeDemo项目需要搭配一个MongoDB数据库,这样除了该项目外还需要一个Docker容器运行MongoDB数据库。

这时候用docker-compose就方便多了。docker-compose的核心是docker-compose.yml文件,看一下对应这个例子的文件内容:

version: '3.4'

services:
demomvc:
image: thisdemoimage
build:
context: .
dockerfile: Dockerfile
environment:
- ASPNETCORE_DBCONN=mongodb://192.168.183.230:27089
- ASPNETCORE_DBNAME=dockerdb ports:
- "5103:80"
depends_on:
- mongodocker
mongodocker:
image: mongo
ports:
- "27089:27017"

在services节点下定义了demomvc和mongodocker两个服务,一个是ASP.NET Core的项目,一个是MongoDB数据库。

每个节点下的image参数指定了采用的镜像名称,ports指定端口映射。此处的MongoDB设置未涉及持久化,实际使用时要注意设置。

ASP.NET Core的项目的thisdemoimage镜像是不存在的,下面指定了build方法。当然也可以先创建好镜像然后在这里使用就像mongo服务的设置一样。

depends_on表示本服务对另一个服务的依赖,本例中就是ASP.NET Core项目依赖MongoDB项目。

environment用于设置环境变量,作用是什么呢?

有一些设置,比如本例中的数据库连接,如果将连接字符串写在了项目中的appsettings.json中,而这个文件被“固化”到镜像中了,是不能修改的,除非重新生成镜像,非常麻烦。

所以可以通过这样的环境变量在外面设置。

将项目引用NuGet包MongoDB.Driver, 修改WeatherForecastController的get方法:

        [HttpGet]
public IEnumerable<WeatherForecast> Get()
{
var rng = new Random();
_mongoHelper.InsertOne(new WeatherForecast
{
Date = DateTime.Now.AddDays(),
TemperatureC = rng.Next(-, ),
Summary = Summaries[rng.Next(Summaries.Length)]
});
return _mongoHelper.FindList<WeatherForecast>();
}

每次都是先插入一条,然后返回所有记录。这里简要的写了一个mongoHelper:

    public class MongoHelper
{
private readonly IMongoDatabase database;
public MongoHelper(IConfiguration configuration) : this(configuration["ASPNETCORE_DBCONN"], configuration.GetSection("ASPNETCORE_DBNAME").Value)
{ }
public MongoHelper(string ConnectionString,string DBName)
{
MongoClient mongoClient = new MongoClient(ConnectionString);
database = mongoClient.GetDatabase(DBName);
}
public List<T> FindList<T>(FilterDefinition<T> filter = null, string collectionName = null)
{
collectionName ??= typeof(T).Name;
filter ??= new BsonDocument();
var collection = database.GetCollection<T>(collectionName);
return collection.Find(filter).ToList();
}
public void InsertOne<T>(T model, string collectionName = null)
{
collectionName ??= typeof(T).Name;
var collection = database.GetCollection<T>(collectionName);
collection.InsertOne(model);
}
}

连接字符串采用 IConfiguration中的设置。

这里有个不算技巧的技巧,为了方便在非Docker的情况下测试,依然可以在appsettings.json文件中设置MongoDB的连接字符串,当部署到Docker中的时候,通过Docker环境变量配置的连接字符串会覆盖appsettings.json中的配置。

这是因为在讲述IConfiguration的文章中说过,系统是先加载appsettings.json中的设置,后加载环境变量中的设置的,二者的key相同,所以最终会以环境变量中的配置为准。

重新发布项目并将文件拷贝到/home/aspcore目录,其中的dockerfile文件不变,添加本例中的docker-compose.yml文件。

docker-compose是需要单独下载安装的, 执行命令:

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

如果提示权限错误,需执行如下命令:

sudo chmod +x /usr/local/bin/docker-compose

安装好之后执行 docker-compose --version 验证是否安装成功。

都准备好了,执行如下命令:

cd /home/aspcore
docker-compose up

执行成功后访问 http://192.168.183.230:5103/WeatherForecast 进行测试。

七、Windows下开发

我们都知道,VisualStudio经常“贴心”的帮我们做好多事,例如Git的图形化操作。对于Docker也是如此。

若要在Windows环境下开发及调试Docker,可按下面步骤完成。

首先需下载并安装Docker Desktop

页面上有个图标:,点击下载。安装后右下角会有 图标,右键可以做一些设置。

它支持Windows和Linux两种主机

通过docker version 命令可以看出当前主机类型。也可以右键点击右下角的图标,有个Switch to ……的选项,可以知道当前主机类型,点击后切换到另一种类型。

命令切换:C:\Program Files\Docker\Docker\DockerCli.exe -SwitchDaemon

解决方案启用Docker支持:

新建项目的时候,勾选启用Docker支持:

已有项目可以右键点击项目,添加Docker支持:

两种方式都会要求选择主机类型是Windows还是Linux。

此时Visual Studio帮我们会在项目中添加一个名为Dockerfile的文件:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
WORKDIR /app
EXPOSE FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
WORKDIR /src
COPY ["DockerDemo/DockerDemo.csproj", "DockerDemo/"]
RUN dotnet restore "DockerDemo/DockerDemo.csproj"
COPY . .
WORKDIR "/src/DockerDemo"
RUN dotnet build "DockerDemo.csproj" -c Release -o /app/build FROM build AS publish
RUN dotnet publish "DockerDemo.csproj" -c Release -o /app/publish FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DockerDemo.dll"]

这个文件和上面例子中我们自己创建的优点不同,它包含了4个From,第一个和最后一个和我们自己创建的有点像,只是Visual Studio帮我们自动添加了SDK镜像的拉取、项目的编译、项目发布的过程。

这里用到了两个镜像,第一个From调用了微软官方的包含ASP.NET Core 3.0 的运行时版镜像。第二个From用到了包含.Net Core 3.0的SDK的镜像,因为我们需要对项目进行生成和发布操作。

通过添加Docker的支持,可以使用Visual Studio开发并将项目自动发布到Docker进行调试。但选择系统环境为Windows的时候速度很快,选择Linux的时候由于网络问题非常慢。网上有临时的解决方案。

如果多个项目想采用docker-compose管理,在上面添加docker支持的图中可以看到有一个“容器业务流程协调程序支持”, 添加它就会自动生成一个docker-compose.yml文件。

Docker-Compose主要用于当前主机中的docker的管理,对于多主机的集群管理,就需要Docker Swarm或者Kubernetes了。

ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用的更多相关文章

  1. ASP.NET Core 3.0 : 二十五. TagHelper

    什么是TagHelper?这是ASP.NET Core 中新出现的一个名词,它的作用是使服务器端代码可以在Razor 文件中参与创建和呈现HTML 元素.(ASP.NET Core 系列目录) 一.概 ...

  2. ASP.NET Core 3.0 : 二十四. 配置的Options模式

    上一章讲到了配置的用法及内部处理机制,对于配置,ASP.NET Core还提供了一种Options模式.(ASP.NET Core 系列目录) 一.Options的使用 上一章有个配置的绑定的例子,可 ...

  3. 学习ASP.NET Core Razor 编程系列十八——并发解决方案

    学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

  4. ASP.NET Core 2.2 : 二十六. 应用JWT进行用户认证

    本文将通过实际的例子来演示如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新方案(ASP.NET Core 系列目录) 一.什么是JWT? JWT(json web token ...

  5. ASP.NET Core 2.2 : 二十六. 应用JWT进行用户认证及Token的刷新

    来源:https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_26.html 本文将通过实际的例子来演示如何在ASP.NET Core中应用JWT进行用户认证以及T ...

  6. ASP.NET Core 2.2 : 二十. Action的多数据返回格式处理机制

    上一章讲了系统如何将客户端提交的请求数据格式化处理成我们想要的格式并绑定到对应的参数,本章讲一下它的“逆过程”,如何将请求结果按照客户端想要的格式返回去. 一.常见的返回类型 以系统模板默认生成的Ho ...

  7. ASP.NET Core 2.2 : 二十二. 多样性的配置方式

    大多数应用都离不开配置,本章将介绍ASP.NET Core中常见的几种配置方式及系统内部实现的机制. 说到配置,第一印象可能就是“.config”类型的xml文件或者“.ini”类型的ini文件,在A ...

  8. ASP.NET Core 2.0: 二. 开发环境

    macOS:Install Visual Studio for Mac 系统要求: macOS 10.12 Sierra 及更高版本 其他要求: 可能会要求安装xcode或android相关环境, 详 ...

  9. 剑指offer二十八之数组中出现次数超过一半的数字

    一.题目 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. ...

随机推荐

  1. Github 持续化集成 工作流 Npm包自动化发布

    Github 持续化集成 工作流 Npm包自动化发布 简介   持续集成指的是,频繁地(一天多次)将代码集成到主干. 它的好处主要有两个: 快速发现错误.每完成一点更新,就集成到主干,可以快速发现错误 ...

  2. 解决微信小程序开发中wxss中不能用本地图片

    微信小程序开发中wxss中不能用本地图片,我们可以用将我们的图片传到服务器上,然后直接引用在线地址.但是当我们没有服务器时,我们可以用"图床",这个具体可以百度.这里我们用第二种方 ...

  3. java-整型数值 用 16进制转换、2进制转换-Integer.toHexString

    负数为什么要用补码表示 可以将符号位和其它位统一处理 减法也可按加法来处理 另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃 正数:原码.反码.补码相同. 负数:反码符号位不变 ...

  4. mysql 排序规则

    一.对比 1.utf8_general_ci 不区分大小写,utf8_general_cs 区分大小写 2.utf8_bin: compare strings by the binary value ...

  5. Spring IOC(1)----容器刷新(refresh())之前

    首先本次分析是基于注解形式的,想来xml格式的原理都是类似的. 首先说一下什么是Bean定义(beandefinition):bean定义并不是实例化的bean,而是bean对象的一些信息,根据这些定 ...

  6. 自己动手实现智能家居之温湿度数据采集存储(DHT11,MySql)

    [前言] 一个热爱技术的人一定向往有一个科技感十足的环境吧,那何不亲自实践一下属于技术人的座右铭:"技术改变世界". 就让我们一步步动手搭建一个属于自己的"智能家居平台& ...

  7. 防DOS攻击-网络连接法

    #!/bin/bash netstat -antup | grep SYN_RECV | awk '{print $5}' |awk -F: '{print $1}'|sort|uniq -c > ...

  8. (八十二)c#Winform自定义控件-穿梭框

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  9. Creator3D长什么样?看看官方惊艳的DEMO就知道了,附在线体验!

    Shawn 这两天在学习 Creator3D 的官方案例,由于是刚接触 Creator3D 很多东西在没弄清楚之前还是以简单的编辑介绍为主,先了解一下3D场景的基本操作: 观查场景:按住鼠标右键以自己 ...

  10. 手把手教你如何在window下将jenkins+allure集成生成的测试报告通过jenkins配置邮箱自动发送-04(非常详细,非常实用)

    简介 上一篇生成测试报告,小伙伴们和童鞋们就又问道,测试报告已经生成了,怎么发送给相关的负责人了?小伙伴们和童鞋们不要着急,听宏哥慢慢给你道来,心急吃不了热豆腐哈.今天这篇文章宏哥就给小伙伴和童鞋们来 ...