上一个Demo进行了单独的Jenkins远程部署, 本Demo将使用流行的Jenkins+Git+Docker进行持续部署.

准备Linux服务器

和上一篇Demo一样, 在Azure创建一台CentOS7服务器, 开放22端口供SSH使用, 并且开放了5000和5001端口.

安装DotNet Core

基于微软官方文档, SSH到服务器使用如下命令安装:

sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
sudo yum install dotnet-sdk-3.0

安装Docker

这一步是比之前多出来的, 因为这次我们要基于Docker进行持续部署, 根据官方文件:

# 卸载旧版本, 因为我是一台新的服务器, 这一步可以不做
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 安装需要用到的包
sudo yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
# 设置docker安装仓库地址
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 安装Docker社区版引擎
sudo yum install docker-ce docker-ce-cli containerd.io

配置Jenkins

有了上一篇Demo的基础, 这一次, 我们轻车熟路, 去配置添加一个Server即可.

构建项目

  1. 新建一个Freestyle Project, 名字随便起, 然后确定进入配置页.
  2. 在Source Code Management选择git, 并且在Repository URL填入如下地址:
https://gitee.com/jerryqi/JenkinsTest.git

和上次不一样的一点是, 上次是在本地构建, 然后上传编译后的代码到服务器运行, 而这次是直接把源代码上传到服务器交给Docker来构建, 实际上这里绕了一个圈, 因为我的Jenkins在本地, 所以是本地下载了Gitee的代码然后上传到服务器, 实际上, 如果把Jenkins安装到服务器就可以在服务器直接拉取Gitee代码然后执行Docker脚本构建.

  1. 在Build Environment进行如下操作:

    • 勾选Delete workspace before build starts
    • 勾选Send files or execute commands over SSH after the build runs, 填写信息如下:
Key Value
Name 默认选择了你之前配置的Server
Source files **
Exec command docker build -t jenkinstest .
docker run -d -p 80:5000 --name jenkinstestapp jenkinstest

因为在服务器上构建, 因此这里不写build选项卡, 当然也可以在本地构建, 那么相应的把Dockerfile改一改就好了.

在服务器上的docker构建可以参考我的另外一篇文章: 使用Docker-Compose编排发布.Net Core+Redis应用两个镜像到Docker

编写Dockerfile

因为这里在服务器上实现Docker来构建项目, 我们在项目根目录添加Dockerfile内容如下:

# 第一部分是编译并发布项目
# 以微软.Net Core SDK作为基础镜像, 并且以build作为别名
FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
# 切换build镜像工作目录到/app
WORKDIR /app
# 拷贝sln和csproj项目文件
COPY *.sln .
COPY JenkinsTest/*.csproj ./JenkinsTest/
# Restore项目用到的包
RUN dotnet restore
# 拷贝项目文件到镜像里面相应到目录
COPY JenkinsTest/. ./JenkinsTest/
# 切换build镜像工作目录到/app/AliPay
WORKDIR /app/JenkinsTest
# 以Release模式发布应用到out文件夹
RUN dotnet publish -c Release -o out
# 第二部分是启动项目
# 以微软.Net Core运行环境作为基础镜像, 并且以runtime作为别名
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
# 切换runtime镜像工作目录到/app
WORKDIR /app
# 把build镜像里面编译出来的文件拷贝到runtime镜像
COPY --from=build /app/JenkinsTest/out ./
# 暴漏端口
EXPOSE 5000
# 启动应用
ENTRYPOINT ["dotnet", "JenkinsTest.dll"]

修正

这里跑第一遍的时候提示如下错误:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

通过如下命令查看Docker daemon状态:

sudo service docker status
# ● docker.service - Docker Application Container Engine
# Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
# Active: inactive (dead)
# Docs: https://docs.docker.com

发现他的状态是inactive, 通过如下命令重启Docker:

sudo service docker restart

再次检查Docker daemon发现它变成了active. 但是再次构建是依然报上述错误.

这个时候我直接在服务器上运行docker images, 发现如下错误:

Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/images/json: dial unix /var/run/docker.sock: connect: permission denied

这个很明显是没有权限的问题, 这里有两种解决方法:

  • 第一种当然是sudo, 简单暴力.
  • 还有第二种方法就给他添加权限, 我这里使用第二种:
sudo groupadd docker     #添加docker用户组
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
newgrp docker #更新用户组
docker imges #测试docker命令, OK

最后就是, 一定要勾选Abort the build if it's stuck, 然后把超时时间改长一点, 因为第一次要拉取镜像, 默认的三分钟是不够用的.

然后Build now, 因为我把docker的5000端口映射到了服务器的80端口, 所以直接访问服务器IP即可访问成功, 大功告成!大功告成!大功告成!

jenkins publish .net core application to linux server in docker的更多相关文章

  1. jenkins publish .net core application to linux server

    最近学习Docker与Jenkins, 网上大部分都是关于Jenkins+Git+Docker进行持续远程部署, 我一直在考虑为什么Jenkins和Docker要绑定一块使用, 因为我想单独使用Jen ...

  2. 【asp.net core】Publish to a Linux-Ubuntu 14.04 Server Production Environment

    Submary 又升级了,目录结构有变化了 . project.json and Visual Studio 2015 with .NET Core On March 7, 2017, the .NE ...

  3. ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路

    一.前言  最近一段时间自己主要的学习计划还是按照毕业后设定的计划,自己一步步的搭建一个前后端分离的 ASP.NET Core 项目,目前也还在继续学习 Vue 中,虽然中间断了很长时间,好歹还是坚持 ...

  4. Windows系统下使用Jenkins 自动发布 .NET core到Linux平台下Docker

    准备工作(安装过程可以百度,已安装的可以跳过) a)     安装Jenkins,安装包下载地址:http://mirrors.tuna.tsinghua.edu.cn/jenkins/windows ...

  5. 用VSCode开发一个基于asp.net core 2.0/sql server linux(docker)/ng5/bs4的项目(1)

    最近使用vscode比较多. 学习了一下如何在mac上使用vscode开发asp.netcore项目. 这里是我写的关于vscode的一篇文章: https://www.cnblogs.com/cgz ...

  6. .NET Core部署到linux(CentOS)最全解决方案,入魔篇(使用Docker+Jenkins实现持续集成、自动化部署)

    通过前面三篇: .NET Core部署到linux(CentOS)最全解决方案,常规篇 .NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx) .N ...

  7. .NET Core部署到linux(CentOS)最全解决方案,高阶篇(Docker+Nginx 或 Jexus)

    在前两篇: .NET Core部署到linux(CentOS)最全解决方案,常规篇 .NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx) 我们对. ...

  8. ASP.NET Core MVC 在linux上的创建及发布

    前言 ASP.NET core转眼都发布半月多了,社区最近也是非常活跃,虽然最近从事python工作,但也一直对.NET念念不忘,看过了园区大神们搭建的Asp.net core项目之后,自己也是跃跃欲 ...

  9. ASP.NET Core 发布至Linux生产环境 Ubuntu 系统

    ASP.NET Core 发布至Linux生产环境 Ubuntu 系统,之前跟大家讲解了 dotnet publish 发布,而没有将整个系统串起来. 今天就跟大家综合的讲一下ASP.NET Core ...

随机推荐

  1. 一个简单的setTimeout的问题

    经常使用 setTimeout,并且自己认为也算比较熟悉这个函数的用法. 不过今天碰到了,突然发现自己没有意识到这个问题.于是作为一个记录点,进行巩固一下. var timer = window.se ...

  2. copy()函数技术推演

    /*** str_copy.c ***/ #include<stdio.h> void copy_str21(char *from, char *to) { for(; *from != ...

  3. 超炫酷的 Docker 终端 UI lazydocker

    A simple terminal UI for both docker and docker-compose, written in Go with the gocui library. https ...

  4. windows下powershell的包管理工具

    scoop github 开源地址:https://github.com/lukesampson/scoop 安装命令->powershell管理员模式下输入 Invoke-Expression ...

  5. mybatis-sqlite日期类型对应关系

    1.问题 sqlite数据库 user表,create_time字段,类型DATETIME,设置默认值datetime('now') mybatis,User实体,createTime类型为java. ...

  6. freemark 异常

    现象: 前几天跟前端联调,freemark报异常如下: For "#if" condition: Expected a boolean, but this has evaluate ...

  7. RTSP、RTMP、HTTP协议

    一.异同1.RSTP.RTMP.HTTP协议共同点RTSP RTMP HTTP都是用在应用层.理论上这三种协议都可以做直播和点播,但直播一般用RTSP和RTMP点播用HTTP.2.RSTP.RTMP. ...

  8. [转]BigDecimal使用(整理)

    原文地址:https://www.jianshu.com/p/2947868d76eb 应用场景 大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算.比如:货币 使用 ...

  9. hive分区表新增字段,已有分区显示为null

    如果在hive的分区表新增非分区字段,那么原有的分区的数据即使重新运行也会显示为null. 必须先删除该分区,再重新跑数据.

  10. lintcode 787. The Maze 、788. The Maze II 、

    787. The Maze https://www.cnblogs.com/grandyang/p/6381458.html 与number of island不一样,递归的函数返回值是bool,不是 ...