本文主要描述的是当一个.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();
}
通过这些额外的配置,我可以重建镜像,并在容器中运行应用程序,这时在网页上就可以打开了。接下来由于篇幅有限,剩下负载均衡部分请看下一篇文章。