• 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();

    }

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

     

  • 相关阅读:
    数据库表数据传输到Oracle方案
    Pdnovel 在线阅读体验
    Metaweblog博客分发体验
    Liveqrcode活码系统设计
    Java Language Changes for Java SE 9
    利用“计算器”和公式做房贷计算
    阿里云SLB快速切换至https
    Charles 协助解决 metaweblog 排序问题
    Go语言网络通信---连续通信的UDP编程
    Go语言网络通信---一个简单的UDP编程
  • 原文地址:https://www.cnblogs.com/shyu/p/7356412.html
Copyright © 2020-2023  润新知