[学习笔记]使用Docker+Jenkin自动化流水线发布.Net应用
使用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
这些命令将在构建时,在源代码拉取后执行
- 将指定 ./sample/MainHost/Soa.GatewaySample.Web.Host/Dockerfile构建镜像,并命名为192.168.31.69:5000/soasampleauthorizedservicehost
- 将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应用的更多相关文章
- 使用GitHub+Travis-CI+Docker打造自动化流水线
全文采用的是阿里云的ESC服务器,系统是CentOS 7 示例项目是NodeJS编写,本文主要是Docker的使用,在文章前2/3都是Docker命令介绍,最后我们会完成一个自动化的示例. 准备 注册 ...
- Docker学习笔记2: Docker 概述
一.什么是Docker Docker是基于Go语言实现的云开源项目. Docker 的主要目标是:"Bulid,Ship and Run Any App ,AnyWhere" , ...
- 学习笔记之Docker
Docker 官网 http://www.docker.com Docker is the company driving the container movement and the only co ...
- Docker学习笔记之docker volume 容器卷的那些事(二)
预览目录 更改目录拥有者 Data Container 切换用户 参考文章 0x00 概述 如果你读了docker volume 容器卷的那些事(一),我想应该不会遇到下面这些问题的,毕竟是具有指导意 ...
- Docker学习笔记之Docker的数据管理和存储
0x00 概述 数据是应用程序重要的产出,所以很好的管理和存储数据,是对应用程序劳动结果的尊重.特别是在大数据时代,所有的数据都是重要的资产,保护好数据是每个开发者必须掌握的技能.我们知道,在 Doc ...
- Docker学习笔记之Docker 的简历
0x00 概述 在了解虚拟化和容器技术后,我们就更容易理解 Docker 的相关知识了.在这一小节中,我将介绍关于 Docker 的出现和发展,Docker 背后的技术.同时,我们将阐述 Docker ...
- Docker学习笔记(2)-docker镜像操作
本节将会涉及Docker的镜像操作. 1. 获取镜像 如何获取Docker Hub上的镜像?可通过docker pull命令获取,其格式为: docker pull [选项] [Docker Regi ...
- Docker学习笔记(2)--Docker常用命令
1. 查看docker信息(version.info) # 查看docker版本 $docker version # 显示docker系统的信息 $docker info 2. 对image的操作(s ...
- DOCKER 学习笔记7 Docker Machine 在阿里云实例化ECS 以及本地Windows 实例化虚拟机实战
前言 通过以上6小节的学习,已经可以使用DOCKER 熟练的部署应用程序了.大家都可以发现使用 DOCKER 带来的方便之处,因为现在的话,只是在一台服务器上部署,这样部署,我们只需要一条命令,需要的 ...
随机推荐
- github账号&文章选题
----------------------------------------------------------- https://github.com/yanpanjiao github ...
- python的数据库编程
数据库的基础知识 一.数据库的概念 数据库将大量数据按照一定的方式组织并存储起来,是相互关联的数据的集合.数据库中的数据不仅包括描述事物数据的本身,还包括相关数据之间的联系.数据库可以分为关系型数据库 ...
- C++---变量、数据类型和运算符
内存 计算机使用内存来记忆或存储计算时所使用的的数据. 计算机执行程序时, 组成程序的指令和程序所操作的数据都必须存放在某个地方, 而这个地方就是计算机的内存, 也称为主存, 或随机访问存储器(RAM ...
- RFC 标准文档
RFC 标准文档 什么是 RFC ? RFC(Request For Comments)意即"请求评论",包含了关于Internet的几乎所有重要的文字资料.如果你想成为网络方面的 ...
- .NET MAUI RC 是完整的 API 并准备好起飞 (GA)
2022年4月12日 微软发布了 .NET Multiplatform App UI (.NET MAUI) 作为候选版本RC ,具体参见 https://devblogs.microsoft.com ...
- JavaScript一行代码获取公网IP及城市信息
废话不多说,直接上代码! <script type="text/javascript" src="http://pv.sohu.com/cityjson?ie=ut ...
- [linux tips] puppet client ssl 证书过期
问题: [root@control-01 .ssh]# puppet agent -tv Warning: Unable to fetch my node definition, but the ag ...
- VSCODE调试时在cygwin.S中发生段错误
起因: C++实现矩阵类和向量类 当看了我实现的矩阵类后,一个同学问我: 然后我就试了试1000维,结果运行时在cygwin.S里引发了奇奇怪怪的Segmentation fault,而且这个文件还是 ...
- python二分法、牛顿法求根
二分法求根 思路:对于一个连续函数,左值f(a)*右值f(b)如果<0,那么在这个区间内[a,b]必存在一个c使得f(c)=0 那么思路便是取中间点,分成两段区间,然后对这两段区间分别再比较,跳 ...
- Tutorial 3_软件工作量估计和编码规范
软件过程与管理实验 实验3:编码规范 本次实验内容是个人软件过程部分,通过本次实验,学生将掌握以下内容: 1.建立自己的编码规范和代码审查表. 2.会用COCOMO II模型对软件工作量进行估计. [ ...