ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用

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

一、概述

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

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

ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用

进入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

ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用
  • 拉取仓库中的镜像
docker pull  mongo
  • 列出本地镜像。
docker images

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

  • 运行镜像生成一个容器
docker run --name mongotodocker -p 27088:27017 -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 8080:80 -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的核心是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 Get()
        {
            var rng = new Random();
            _mongoHelper.InsertOne(new WeatherForecast
            {
                Date = DateTime.Now.AddDays(1),
                TemperatureC = rng.Next(-20, 55),
                Summary = Summaries[rng.Next(Summaries.Length)]
            });
            return _mongoHelper.FindList();
        }

每次都是先插入一条,然后返回所有记录。这里简要的写了一个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 FindList(FilterDefinition filter = null, string collectionName = null)
        {
            collectionName ??= typeof(T).Name;
            filter ??= new BsonDocument();
            var collection = database.GetCollection(collectionName);
            return collection.Find(filter).ToList();
        }
        public void InsertOne(T model, string collectionName = null)
        {
            collectionName ??= typeof(T).Name;
            var collection = database.GetCollection(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

ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用

它支持Windows和Linux两种主机

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

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

解决方案启用Docker支持:

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

ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用

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

ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用

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

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

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0-buster-slim AS base
WORKDIR /app
EXPOSE 80

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的使用

(ASP.NET Core 系列目录)

Original: https://www.cnblogs.com/FlyLolo/p/ASPNETCore_28.html
Author: FlyLolo
Title: ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581848/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 如何在 pyqt 中解决启用 DPI 缩放后 QIcon 模糊的问题

    问题描述 如今显示器的分辨率越来越高,如果不启用 DPI 缩放,软件的字体和图标在高分屏下就会显得非常小,看得很累人。从 5.6 版本开始,Qt 便能支持 DPI 缩放功能,Qt6…

    Linux 2023年6月7日
    0204
  • 闭包、装饰器

    闭包: 闭包的演变过程: 闭包的概念: “闭包”的本质就是函数的嵌套定义,即在函数内部再定义函数 “闭包”有两种不同的方式,第一种是…

    Linux 2023年6月8日
    080
  • MySQL表空间回收的正确姿势

    不知道大家有没有遇到这样的一种情况,线上业务在MySQL表上做增删改查操作,随着时间的推移,表里面的数据越来越多,表数据文件越来越大,数据库占用的空间自然也逐渐增长 为了缩小磁盘上…

    Linux 2023年6月13日
    091
  • Linux系统编程之命名管道与共享内存

    在上一篇博客中,我们已经熟悉并使用了匿名管道,这篇博客我们将讲述进程间通信另外两种常见方式——命名管道与共享内存。 1.命名管道 管道是使用文件的方式,进行进程之间的通信。因此对于…

    Linux 2023年6月8日
    093
  • php uniapp 支付宝app支付,前后端实战源码

    uniapp端,前端代码 app.php端代码 Original: https://www.cnblogs.com/xiaofengzheng/p/16457966.htmlAut…

    Linux 2023年6月7日
    084
  • 如何设置redis中hash的field的expire ?

    redis 127.0.0.1:6379> hset expire:me name tom (integer) 0 redis 127.0.0.1:6379> hget…

    Linux 2023年5月28日
    0122
  • 如何快速提高英飞凌单片机编译器 TASKING TriCore Eclipse IDE 编译速度

    1、前言 使用英飞凌单片机编译器 TASKING TriCore Eclipse IDE 开发编译时,想必感受最深刻的就是编译速度,那是非常慢了,如果是部分修改的源文件编译还好,不…

    Linux 2023年6月7日
    088
  • VMware Workstation 与 Device/Credential Guard 不兼容

    问题: 在确定已经禁用 Hyper-V 功能的前提下,启动虚拟机还是报错 ” VMware Workstation 与 Device/Credential Guard …

    Linux 2023年6月7日
    099
  • CentOS7 安装高版本gcc, g++, gfortran等工具

    SCL(Software Collections)是一个CentOS/RHEL Linux平台的软件多版本共存解决方案,为用户提供一种方便、安全地安装和使用应用程序和运行时环境的多…

    Linux 2023年6月7日
    086
  • 资源笔记

    Spring Cloud Stream中文指导文档 Original: https://www.cnblogs.com/iforeverhz/p/16274259.htmlAuth…

    Linux 2023年6月7日
    0116
  • php-redis 总结

    php-redis代码库和文档地址:https://github.com/phpredis/phpredis/#readme string 字符串类型: list 列表类型(也是链…

    Linux 2023年5月28日
    0104
  • 对比nushell和powershell

    2021-07-17 第一版 有些对比领域缺失,这篇文章会持续更新。 这是一篇对比powershell和nushell的文章。我是powerhsell专家,又是nushell新手,…

    Linux 2023年6月14日
    0109
  • 使用Amazon Pinpoint对用户行为追踪

    1.前言 最近在做一个项目,我们的后台大数据团队需要了解用户在使用app的时候,都进行了哪些操作,在哪个页面都干了些什么,以及app日活和月活等等,各种数据。总之就是监控用户行为,…

    Linux 2023年6月13日
    0104
  • python入门基础知识六(函数)

    函数要先定义,再调用! 一、函数参数的类型: 1. 形式参数和实际参数: def funct_name(arguments): codes… codes… …

    Linux 2023年6月7日
    088
  • 【设计模式】Java设计模式-建造者模式

    【设计模式】Java设计模式 – 建造者模式 😄 不断学习才是王道🔥 继续踏上学习之路,学之分享笔记👊 总有一天我也能像各位大佬一样🏆 @一个有梦有戏的人 @怒放吧德德…

    Linux 2023年6月6日
    0127
  • 记一次 android 线上 oom 问题

    背景 公司的主打产品是一款跨平台的 App,我的部门负责为它提供底层的 sdk 用于数据传输,我负责的是 Adnroid 端的 sdk 开发。 sdk 并不直接加载在 App 主进…

    Linux 2023年6月6日
    0110
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球