jenkins+Docker+nginx实现.net core在ubuntu16.04下的持续集成,及简单的负载均衡

本文主要描述的是当一个.Net Core程序的代码提交到git之后,利用jenkins和docker实现在linux环境下的自动部署,并提供了一个简单的负载均衡思路。

话不多说,首先需要以下环境:

ubuntu16.04:系统发布的操作系统;

nginx 提供反向代理和负载均衡;

Jenkins实现.net core的自动构建和发布;

Docker实现同一套代码在同一个服务器上部署多个实例;  

 .Net Core SDK

首先安装.NET Core SDK,相对于windows下的 .NET Framework。我安装的是版本是.NET Core 1.1.2, 参照官方文档的安装过程 https://www.microsoft.com/net/core#linuxubuntu。

值得注意的是要选择ubuntu16.04的命令:

  安装完成后就可以在项目文件夹,使用以下命令启动网站

dotnet xxx.dll

Nginx 

通过命令安装:

sudo apt-get install nginx

然后配置nginx的代理转发,修改/etc/nginx/sites-available/default,修改内容如下

//如果没有权限修改,请使用 sudo chmod 777 xxx 修改权限(xxx表示文件夹路径或者文件名)
server {
    listen 80;
    location / {
        proxy_pass http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
保存退出,然后重新加载nginx

sudo nginx -t

sudo nginx -s reload

这样就实现了通过IP访问

 Docker

安装Docker使用apt-get命令:

apt-get update 
apt-get install docker.io

创建软连接 

ln -sf /usr/bin/docker.io /usr/local/bin/docker

如没有提示错误则说明你已经在Ubuntu16.04上面快速安装Docker成功了。

使用dock info查看docker版本:

下载.net core镜像

docker 下载镜像,此处如果用国外的官方镜像下载会耗时很久,所以一般都是配置中国官方镜像:

 http://blog.csdn.net/csdn_duomaomao/article/details/72957392

设置好执行以下命令重启docker守护进程和docker

sudo systemctl daemon-reload
sudo  systemctl restart docker

执行命令 docker pull microsoft/aspnetcore

 

镜像下载完成之后,输入sudo docker images我们检查一下:

安装Jenkins 

Jenkins基于Java, 所以需要先安装java。 Linux下安装java只要配置java环境变量即可。 
首先从这里下载jdk-8u65-linux-x64.tar.gz,解压java到相应目录,我一般习惯把安装的软件放到目录/usr/local下。

tar -zxvf jdk-8u65-linux-x64.tar.gz -C /usr/local

编辑环境变量,在/etc/profile文件中添加环境变量,Linux的所有用户都可以使用。

sudo gedit /etc/profile

在文件最后添加内容如下:

export JAVA_HOME=/usr/local/jdk1.8.0_65
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jart

这样,java就配置完成 

安装Jenkins简单来说需要下面四步:

wget -q -O - https://pkg.jenkins.io/debian/jenkins-ci.org.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins

这样之后就安装完成。可以查看进程信息。

ps -ef |grep jenkins

这里写图片描述

安装简介

1、通过上面的安装,Jenkins将作为一个Linux守护进程,可以查看文件/etc/init.d/jenkins 
这里写图片描述
2、创建一个名为Jenkins的Linux用户

sudo cat /etc/shadow
或
sudo cat /etc/passwd

这里写图片描述 
3、生成日志文件 /var/log/jenkins/jenkins.log 
这里写图片描述 
4、在配置文件/etc/default/jenkins 中定义Jenkins 默认端口。

HTTP_PORT=8080

简单配置–Unlock Jenkins

上面只是安装完成了Jenkins,还需要进行一些配置才可以。 
这时通过浏览器就可以访问Jenkins了。比如我的地址:http://192.168.126.128:8080/ 
这里写图片描述
可以看到提示,为了确保Jenkins的安全,将管理员的密码写入文件,需要复制到下面的文本框做验证。

/var/lib/jenkins/secrets/initialAdminPassword

然后,到了选择插件的界面,通过附加功能扩展Jenkins可以支持许多不同的需求。 
这里写图片描述

我就选择建议的插件,然后就开始安装。

这里写图片描述

插件安装完成,就到了创建用户的界面,这里可以创建一个Jenkins用户。 
这里写图片描述

到这里,基本配置就完成了。 
这里写图片描述

创建一个运行在 Docker 容器中的 ASP.NET Core 项目然后把这个项目发布到一个在线的 git 仓库中,这里我以这个仓库作为例子

创建完毕之后,为这个项目添加 Dockerfile

FROM microsoft/dotnet:latest
WORKDIR /app
COPY /autopublish/bin/Debug/netcoreapp1.1/publish/. /app
CMD ["dotnet", "autopublish.dll"]

配置 Jenkins 上的自动构建任务 

 

选择 FreeStyle,记得随便起个名字

然后你会进入项目配置页面

配置仓库地址

设置构建触发器,此处的Schedule文本框填入:* * * * *,表示每分钟检查git是否有更新,有则pull并自动构建

设置构建脚本

我的构建脚本的内容是:

#!/bin/bash
# 获取短版本号
GITHASH=`git rev-parse --short HEAD`
echo ---------------Restoring...------------------
cd autopublish
sudo dotnet restore
echo ---------------Publishing...------------------
sudo dotnet publish
echo ---------------Removing Previous Container...------------------
sudo docker rm -f autopublish-web
echo ---------------Building Docker Image...------------------
sudo docker build -t autopublish:$GITHASH .
sudo docker tag autopublish:$GITHASH autopublish:latest
echo ---------------Launching Container...------------------
sudo docker run --name autopublish-web -d -p 5000:5000 --env ASPNETCORE_ENVIRONMENT=Development autopublish:latest

sudo docker run --name autopublish-web -d -p 5000:5000 --env ASPNETCORE_ENVIRONMENT=Development autopublish:latest这行指令表现启动autopublish:latest这个镜像的容器并将它命名为autopublish-web。如果启动不成功,可以把-d参数去掉。

我之前启动的时候失败,提示 .net core版本不匹配。原因是因为宿主机上的.net core sdk的版本必须与docker拉取的.net core的镜像的版本保持一致。

最后点击底部的保存,自动构建就配置完成了~

尝试第一次自动构建

直接在 git 仓库中进行一次 push,稍等1分钟左右的时间,我们就可以在 Jenkins 的控制面板中看到构建正在执行了~ 

 构建过程记录可以查看控制台:

,可能会遇到以下错误:

 

这是因为sudo命令需要输入管理员密码,这时我们把jenkins 用户设为无需密码

1    打开sudoers

gedit  /etc/sudoers

2    添加免密码

jenkins ALL = NOPASSWD: ALL

等到构建完成之后,检查宿主机上的容器

这时我们打开浏览器 输入地址  http://localhost:5000/

可能会发现,网页打不开,如果你检查一切配置文件和安装步骤都发现没问题,那么就可能是因为localhost 有问题。

这儿的 localhost 是一个回路接口。

维基百科[15]:

在计算机网络中,localhost 是一个代表本机的主机名。本地主机可以通过网络回路接口访问在主机上运行的网络服务。通过使用回路接口可以绕过任何硬件网络接口。

当运行在容器内时这是一个问题,因为 localhost 只能够在容器内访问。解决方法是更新 Startup.cs 里的 Main 方法来配置 Kestral 监听的 URL:

publicstaticvoidMain(string[]args)

{

varhost =newWebHostBuilder()

.UseKestrel()

.UseContentRoot(Directory.GetCurrentDirectory())

.UseUrls("http://*:5000")// 在所有网络接口上监听端口 5000

.UseIISIntegration()

.UseStartup<Startup>()

.Build();

host.Run();

}

通过这些额外的配置,我可以重建镜像,并在容器中运行应用程序,这时在网页上就可以打开了。接下来由于篇幅有限,剩下负载均衡部分请看下一篇文章。

 

原文地址:https://www.cnblogs.com/shyu/p/7356412.html