​使用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. github账号&文章选题

    ----------------------------------------------------------- https://github.com/yanpanjiao     github ...

  2. python的数据库编程

    数据库的基础知识 一.数据库的概念 数据库将大量数据按照一定的方式组织并存储起来,是相互关联的数据的集合.数据库中的数据不仅包括描述事物数据的本身,还包括相关数据之间的联系.数据库可以分为关系型数据库 ...

  3. C++---变量、数据类型和运算符

    内存 计算机使用内存来记忆或存储计算时所使用的的数据. 计算机执行程序时, 组成程序的指令和程序所操作的数据都必须存放在某个地方, 而这个地方就是计算机的内存, 也称为主存, 或随机访问存储器(RAM ...

  4. RFC 标准文档

    RFC 标准文档 什么是 RFC ? RFC(Request For Comments)意即"请求评论",包含了关于Internet的几乎所有重要的文字资料.如果你想成为网络方面的 ...

  5. .NET MAUI RC 是完整的 API 并准备好起飞 (GA)

    2022年4月12日 微软发布了 .NET Multiplatform App UI (.NET MAUI) 作为候选版本RC ,具体参见 https://devblogs.microsoft.com ...

  6. JavaScript一行代码获取公网IP及城市信息

    废话不多说,直接上代码! <script type="text/javascript" src="http://pv.sohu.com/cityjson?ie=ut ...

  7. [linux tips] puppet client ssl 证书过期

    问题: [root@control-01 .ssh]# puppet agent -tv Warning: Unable to fetch my node definition, but the ag ...

  8. VSCODE调试时在cygwin.S中发生段错误

    起因: C++实现矩阵类和向量类 当看了我实现的矩阵类后,一个同学问我: 然后我就试了试1000维,结果运行时在cygwin.S里引发了奇奇怪怪的Segmentation fault,而且这个文件还是 ...

  9. python二分法、牛顿法求根

    二分法求根 思路:对于一个连续函数,左值f(a)*右值f(b)如果<0,那么在这个区间内[a,b]必存在一个c使得f(c)=0 那么思路便是取中间点,分成两段区间,然后对这两段区间分别再比较,跳 ...

  10. Tutorial 3_软件工作量估计和编码规范

    软件过程与管理实验 实验3:编码规范 本次实验内容是个人软件过程部分,通过本次实验,学生将掌握以下内容: 1.建立自己的编码规范和代码审查表. 2.会用COCOMO II模型对软件工作量进行估计. [ ...