​使用Docker容器方案可以快速安全地将项目部署到客户的服务器上,作为公司项目,需要解决两个问题:

1. 需要搭建一个私有的Docker仓库,以便安全的存储镜像

2. 需要一套自动化发布方案,实现代码到应用部署的自动化流程

大致流程如下

在java世界中有很多文章介绍了Docker+Jenkin的自动化部署方式,这次来看看如何用这一套工具实现.Net 应用的发布。

编写DockerFile

以Soa项目为例MatoApps/Soa: 一个轻量级的微服务库,基于.Net 6 + Abp框架 可快速地将现有项目改造成为面向服务体系结构,实现模块间松耦合。 (github.com)

Soa/sample/MainHost/Soa.GatewaySample.Web.Host/Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
EXPOSE 44311 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["sample/MainHost/Soa.GatewaySample.Web.Host/Soa.GatewaySample.Web.Host.csproj", "sample/MainHost/Soa.GatewaySample.Web.Host/"]
COPY ["sample/MainHost/Soa.GatewaySample.Web.Core/Soa.GatewaySample.Web.Core.csproj", "sample/MainHost/Soa.GatewaySample.Web.Core/"]
COPY ["sample/MainHost/Soa.GatewaySample.Application/Soa.GatewaySample.Application.csproj", "sample/MainHost/Soa.GatewaySample.Application/"]
COPY ["sample/MainHost/Soa.GatewaySample.Core/Soa.GatewaySample.Core.csproj", "sample/MainHost/Soa.GatewaySample.Core/"]
COPY ["sample/Services.Abstract/Soa.Sample.IService2/Soa.Sample.IService2.csproj", "sample/Services.Abstract/Soa.Sample.IService2/"]
COPY ["src/Soa/Soa.csproj", "src/Soa/"]
COPY ["sample/Services.Abstract/Soa.Sample.IAuthorizedService/Soa.Sample.IAuthorizedService.csproj", "sample/Services.Abstract/Soa.Sample.IAuthorizedService/"]
COPY ["sample/Services.Abstract/Soa.Sample.IService1/Soa.Sample.IService1.csproj", "sample/Services.Abstract/Soa.Sample.IService1/"]
COPY ["sample/MainHost/Soa.GatewaySample.EntityFrameworkCore/Soa.GatewaySample.EntityFrameworkCore.csproj", "sample/MainHost/Soa.GatewaySample.EntityFrameworkCore/"]
COPY ["src/Soa.Client/Soa.Client.csproj", "src/Soa.Client/"]
RUN dotnet restore "sample/MainHost/Soa.GatewaySample.Web.Host/Soa.GatewaySample.Web.Host.csproj"
COPY . .
WORKDIR "/src/sample/MainHost/Soa.GatewaySample.Web.Host"
RUN dotnet build "Soa.GatewaySample.Web.Host.csproj" -c Release -o /app/build FROM build AS publish
RUN dotnet publish "Soa.GatewaySample.Web.Host.csproj" -c Release -o /app/publish FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Soa.GatewaySample.Web.Host.dll"]

搭建CI/CD服务器

CI/CD服务器用于将代码端到仓库的自动化发布,假设你已经拥有一台CentOS 7的服务器,IP地址为192.168.31.69,并且已经安装好了Docker和Jenkins。

安装私有仓库

sudo docker pull registry

设置启动方式为后台任务,端口为5000,并设置随docker服务一同启动

sudo docker run -d -p 5000:5000 --restart always  registry

更改docker.service

sudo nano /usr/lib/systemd/system/docker.service

在ExecStart命令后面添加参数,添加本机IP地址到registry中

[Service]
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.31.69:5000

重启docker服务

sudo systemctl daemon-reload
sudo systemctl restart docker

[可选]安装并运行whalerator,whalerator是一个docker镜像仓库可视化工具,可以提供类似Docker Hub的方式浏览镜像

jevonsflash/whalerator: Portable front end for Docker Registry (github.com)

sudo docker run -d -p 8081:80 --restart always whalerator/whalerator

测试

下载从dockerhub上下载一个仓库,再将他提交到私有仓库中

sudo docker pull jevonsflash/soasampleauthorizedservicehost:latest
sudo docker tag jevonsflash/soasampleauthorizedservicehost:latest 192.168.31.69:5000/soasampleauthorizedservicehost:latest
sudo docker push 192.168.31.69:5000/soasampleauthorizedservicehost

防火墙开启8081与8082端口以便外部环境可以访问

firewall-cmd --zone=public --add-port=8081/tcp --permanent
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload

在同网段下的浏览器中输入 http://192.168.31.69:8081, 将跳转至管理页面

选择Anonymous匿名登陆,输入192.168.31.69:5000,点击Submit

可以看到soasampleauthorizedservicehost:latest已经存在于仓库内了

配置Jenkins

首先配置Jenkins的shell脚本权限

sudo visudo

在文件末尾添加规则,这样执行sudo命令时将跳过root管理员密码验证

jenkins         ALL=(ALL) NOPASSWD:ALL

重启jenkins

sudo systemctl restart jenkins

在同网段下的浏览器打开http://192.168.31.69:8080, 打开Jenkins管理界面

Dashboard - 新建任务,选择“构建一个自由风格的软件项目”

这里暂且命名为test

在源码管理中填写Git仓库地址,并且填写正确的鉴权信息

在构建中添加一个“执行 shell” 步骤

在命令中输入以下内容

sudo docker build -f ./sample/MainHost/Soa.GatewaySample.Web.Host/Dockerfile -t 192.168.31.69:5000/soasampleauthorizedservicehost --no-cache --target final ./
sudo docker push 192.168.31.69:5000/soasampleauthorizedservicehost

这些命令将在构建时,在源代码拉取后执行

  1. 将指定 ./sample/MainHost/Soa.GatewaySample.Web.Host/Dockerfile构建镜像,并命名为192.168.31.69:5000/soasampleauthorizedservicehost
  2. 将192.168.31.69:5000/soasampleauthorizedservicehost镜像推送至私有docker仓库

至此搭建CI/CD服务器工作结束。

测试和发布

返回Dashboard,在test项目下选择“立即构建”

等待构建成功

再次打开 http://192.168.31.69:8081, 打开Docker仓库管理页面,可以发现发布时间已更新

至此部署工作结束。

在客户机上需要安装Docker并且配置好IP地址,当然CI/CD服务器需要映射到一个公网IP地址上,以便客户的服务器拉取镜像

[Service]
ExecStart=/usr/bin/dockerd --insecure-registry [CI/CD服务器地址]

[学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用的更多相关文章

  1. 使用GitHub+Travis-CI+Docker打造自动化流水线

    全文采用的是阿里云的ESC服务器,系统是CentOS 7 示例项目是NodeJS编写,本文主要是Docker的使用,在文章前2/3都是Docker命令介绍,最后我们会完成一个自动化的示例. 准备 注册 ...

  2. Docker学习笔记2: Docker 概述

    一.什么是Docker Docker是基于Go语言实现的云开源项目. Docker 的主要目标是:"Bulid,Ship and  Run Any App ,AnyWhere" , ...

  3. 学习笔记之Docker

    Docker 官网 http://www.docker.com Docker is the company driving the container movement and the only co ...

  4. Docker学习笔记之docker volume 容器卷的那些事(二)

    预览目录 更改目录拥有者 Data Container 切换用户 参考文章 0x00 概述 如果你读了docker volume 容器卷的那些事(一),我想应该不会遇到下面这些问题的,毕竟是具有指导意 ...

  5. Docker学习笔记之Docker的数据管理和存储

    0x00 概述 数据是应用程序重要的产出,所以很好的管理和存储数据,是对应用程序劳动结果的尊重.特别是在大数据时代,所有的数据都是重要的资产,保护好数据是每个开发者必须掌握的技能.我们知道,在 Doc ...

  6. Docker学习笔记之Docker 的简历

    0x00 概述 在了解虚拟化和容器技术后,我们就更容易理解 Docker 的相关知识了.在这一小节中,我将介绍关于 Docker 的出现和发展,Docker 背后的技术.同时,我们将阐述 Docker ...

  7. Docker学习笔记(2)-docker镜像操作

    本节将会涉及Docker的镜像操作. 1. 获取镜像 如何获取Docker Hub上的镜像?可通过docker pull命令获取,其格式为: docker pull [选项] [Docker Regi ...

  8. Docker学习笔记(2)--Docker常用命令

    1. 查看docker信息(version.info) # 查看docker版本 $docker version # 显示docker系统的信息 $docker info 2. 对image的操作(s ...

  9. DOCKER 学习笔记7 Docker Machine 在阿里云实例化ECS 以及本地Windows 实例化虚拟机实战

    前言 通过以上6小节的学习,已经可以使用DOCKER 熟练的部署应用程序了.大家都可以发现使用 DOCKER 带来的方便之处,因为现在的话,只是在一台服务器上部署,这样部署,我们只需要一条命令,需要的 ...

随机推荐

  1. Python IDLE清屏

    在学习和使用Python的过程中,少不了要与Python IDLE打交道.但使用 Python IDLE 都会遇到一个常见而又懊恼的问题--要怎么清屏? 答案是为IDLE增加一个清屏的扩展ClearW ...

  2. git-flow-avh的使用过程

    安装: 在mac上 brew install git-flow-avh 使用: 在仓库中 git flow init 一路回车就行,这个命令相当于写入一些默认命令流程到.git中, 此命令执行之后会增 ...

  3. spring源码编译完整步骤拿来即用!

    1.版本选择 1)源码版本:spring5.3.x 2)gradle版本:根据spring源码的工程路径:gradle/wrapper/gradle-wrapper.properties文件查看gra ...

  4. 异步任务-springboot

    异步任务-springboot 异步:异步与同步相对,当一个异步过程调用发出后,调用者在没有得到结果之前,就可以继续执行后续操作.也就是说无论异步方法执行代码需要多长时间,跟主线程没有任何影响,主线程 ...

  5. VUE(uni-app)+SSM 微信小程序

    环境 jdk:1.8.0_181 tomcat:7.0.100 mysql:8.0.25 工具 ideaIU+Hbuilder 遇到的问题 1.需要跳转到注册在tobar中页面时,需使用 uni.sw ...

  6. 【Electron】Electron Icon 图标说明、及常见问题

    [Electron]Electron Icon 图标说明.及常见问题 其实各种打包模块都有相关的文档说明,相关链接如下: electron-builder:https://www.electron.b ...

  7. 1903021116-吉琛-Java第四周作业-程序编写

    项目 内容 课程班级博客链接 19级信计班 这个作业要求链接 Java分支语句学习 https://edu.cnblogs.com/campus/pexy/19xj/homework/12563 我的 ...

  8. android软件简约记账app开发day02-收入支出明细页面绘制

    android软件简约记账app开发day02-收入支出明细页面绘制 效果图 列表界面绘制 新建layout文件-item_mainlv.xml大体使用绝对布局,嵌套相对布局,嵌套文本内容实现 < ...

  9. CesiumJS 2022^ 原理[3] 渲染原理之从 Entity 看 DataSource 架构 - 生成 Primitive 的过程

    目录 API 用法回顾 1. 为什么要从 Viewer 访问 Entity API 1.1. 高层数据模型的封装 - DataSource API 1.2. 显示管理器 DataSourceDispl ...

  10. MySQL免安装版发生系统错误 1067

    使用MySql免安装版启动时1067 解决办法 打开安装的文件夹 找到my.ini的mysqld模块,调整参数位置. 3. 重新启动Mysql服务 net start mysql