为什么要写这个?

在一个系统长大的过程中会经历不断重构升级来满足商业的需求,而一个严谨的商业系统需要高效、稳定、可扩展,有时候还不得不考虑成本的问题。我希望能找到比较完整的开源解决方案来解决持续集成、监控报警、以及扩容和高可用性的问题。是学习和探索的过程分享给大家,也欢迎同行的人交流。

先来一个三步曲,我们将完成通过GitLab CI 自动部署 net core web api 到Docker 容器的一个示例。这是第一步,通过此文您将了解如何将net core web api 运行在Docker容器中。

  1. 在Docker 容中运行Asp.net Core web API

  2. 用Docker 5分钟搭一套Gitlab 环境

  3. 用GitLab CI 完成 .Net Core API 的自动部署

以上所有示例将在Mac中完成。

本系列文章会优先发表于我的公众号jessetalk, 会拆成更小篇幅更利于阅读。除了技术还会有一些关于产品、技术管理、学习方法论的一些思考,欢迎大家关注。

如何在Docker容器中运行Asp.net Core web api

这是第一部份, 我们将对Docker进行一些初步的介绍,安装以及基本的操作;然后我们会创建一个最简单的 netcore web api 并让它在Docker中运行。
 

Docker的安装

当然Mac上的安装是非常简单的,只需要到Docker的官网上下载一个docker for mac的安装包就可以了。安装完之后,就会在顶部的状态栏中看到Docker的图标。
 
 

关于镜像的问题

如果不使用国内镜像的话,下载image将会非常的慢。在阿里云中可以申请一个自己的加速地址,速度是非常不错的。进入阿里云控制台-> 产品与服务-> 容器服务 下的镜像仓库控制台 可以在Docker Hub镜像站点中找到。
 
 
 
 
 
在Docker中配置镜像:

安装完之后可以在terminal中输入docker info 来检测是否安装正常。

Docker的入门使用

下面介绍一些简单的Docker命令,以便从来没有实践过Docker的同学来了解我们接下来要做的事情。
 
当我们刚开始安装完Docker之后,本地是没有任何的镜像的。永远的入门第一步,下载一个hello-world的镜像然后运行它。
 
 
helloworld是镜像的名称,我们默认连接的是docker hub也就是官方提供的镜像仓库,当然我们也可以连接其它的甚至建立自己的镜像仓库。当本地没有 helloworld这个镜像的时候,Docker就会自动去下载这个镜像到本地。 
 

关于DockerFile

docker build命令在构建一个image的时候所需要的信息都在DockerFile中。比如我们接下来要运行的一个asp.net core api 的容器大概需要这样几步:
 
 

安装并运行.net core web api

在Mac上安装net core ,首先需要下载更新最新的OpenSSL 

然后可以到官网下载net core 1.1 on MacOS,完成之后可以在命令行输入 dotnet --version 来检测当前的版本。

初始化项目并运行

通过3个命领我们可以完成初始化项目并运行的全过程: dotnet new|restore|run。 dotnet 框架默认提供一些初始化的项目模板,可以输入dotnet new -all来查看。

我们可以用 dotnet new webapi 来初始化一个与文件夹名称相同的 webapi项目,也可以在后面加 -n自定义一个项目名称。然后接着在命令行中进入项目的目录输入 dotnet restore,最后用 dotnet run来运行这个web api 项目。

接着就可以在本地浏览这个api

到这里我们的dotnet core web api已经运行在本地了,接下来我们就要让它运行在Docker中。

在Docker中运行dotnet core web api

上面我们已经讲过DockerFile以及一个net core web api 中应该如何配置它。我们会把它放到项目的根目录里。 可以用Visual studio for mac 打开整个web api项目。

接下来我们要做的就是把我们这个代码构建成一个镜像。

我们在terminal中进行项目的根目录,输入 docker build -t myA=apiimage .

完成之后输入 docker images 可以查看到我们刚刚创建的镜像

接下来我们就可以用 docker run 用刚刚这个镜像启动一个容器运行在host的 8080端口。

这个时候我们再访问之前的api就需要通过8080端口,而此时的 api 已经是在容器中运行的。

5分钟快速用Docker部署你自己的GitLab

在掌握了Docker的基本用法之后,我们需要了解如何把GitLab通过Docker跑起来。

Gitlab的安装与配置

sudo docker run --detach \
--hostname 127.0.0.1 \
--publish : --publish : --publish : \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab:Z \
--volume /srv/gitlab/logs:/var/log/gitlab:Z \
--volume /srv/gitlab/data:/var/opt/gitlab:Z \
gitlab/gitlab-ce:latest

我们用到的参数列表: docker run 的参数配置可以查看官方文档

在运行安装脚本之前,我们所使用的volume路径需要授权给docker。

可能会遇到的问题

我在安装及配置的时候遇到了两个问题,可能有人也会遇到。

  1. GitLab 一直在重启(跑不起来)
  2. SSH连接不上

SSH连接的问题我们下面有一小节会讲,这里我简单说一下第一个问题。当我运行脚本之后通过 docker ps 查看当前正在运行的容里面并没有看到 gitlab这个容器,通过 ps -a显示所有容器时发现它的状态一直是 starting 或者 restarting。 这个时候我们可以使用 docker logs 来查看当前容器的运行日志。

Preparing services...
Starting services...
/opt/gitlab/embedded/bin/runsvdir-start: line : ulimit: pending signals: cannot modify limit: Operation not permitted
/opt/gitlab/embedded/bin/runsvdir-start: line : /proc/sys/fs/file-max: Read-only file system
Configuring GitLab package...
Configuring GitLab... ================================================================================
Error executing action `run` on resource 'ruby_block[directory resource: /var/opt/gitlab/git-data/repositories]'
================================================================================

通过 docker logs 可以方便大家来论断错误,一切正常还好,如果一旦出现问题,新手是很懵圈的。这个时候可能通过google 查找错误日志,多数情况下都能找到正确答案,我遇到的是个权限不足的问题, 在这个链接里面有完整的讨论,解决办法就是执行下面这句命令之后就可以正常启行了。

sudo chmod  /srv/gitlab/data/git-data/repositories

SSH 连接GitLab

如果对于SSH不是很了解的同学可以看看阮一峰写的两篇关于SSH原理与运用的文章,非常的不错。 我们直接开始尝试用SSH连接我们本地的gitlab。

 
首先我们需要得到一个SSH Key,输入
cat ~/.ssh/id_rsa.pub 
如果出现 ssh-rsa打头的字符,说明本地已经有了SSH Key那我们可以直接拿来用,如果没有则需要我们自己创建一个SSH Key。
 

创建SSH Key

输入以下命令创建一个SSH Key。

ssh-keygen -t rsa -C "your.email@example.com" -b 

完成之后可以再输入 上面的cat命令 或者pbcopy直接复制生成的ssh key。

pbcopy < ~/.ssh/id_rsa.pub

在GitLab中账号-》设置中找到 SSH Keys中添加这个Key即可。

SSH 连接 2222 端口

正常情况下你已经可以通过git命令来连接我们部署的gitlab,但这里不一样的是我们把容器的 22端口映射到了 host的 2222上,我们需要指定端口来进连接。

ssh -p  git@127.0.0.1

同时还需要更改GitLab的配置文件中的 ssh端口,否则GitLab中为我们生成的项目连接地址会连接不上。/gitlab/config/gitlab.rb

gitlab_rails['gitlab_shell_ssh_port'] =  
更改完ssh端口之后重启gitlab容器,之后我们的项目 ssh连接址会变为:ssh://git@127.0.0.1:2222/jesse/webapi.git
到这里我们已经完成了GitLab的部署,可以将我们之前的net core api 项目提交到代码库,都是一些常规的操作,这里就不做过多的说明了。
如果对于git命令不是很熟悉的同学可以参考廖雪峰写的最简懂的git教程
 
由于篇符的原因,这里先写前面两部份(博客园的编辑器写长文的时候经常崩溃....) 。我们成功地将.net core api运行到了docker容器中,也部署了一套git环境。 Gitlab CI 是Gitlab 8.0以后引进的,目的是更好的支持持续集成,我们第三部分将给大家介绍如果用Gitlab CI 做到在代码提交之后自动部署最新的代码到Docker容器。
 
本系列文章会优先发表于我的公众号jessetalk, 会拆成更小篇幅更利于阅读。除了技术还会有一些关于产品、技术管理、学习方法论的一些思考,欢迎大家关注。
 
 
 
  

Gitlab CI 自动部署 asp.net core web api 到Docker容器的更多相关文章

  1. 使用 Swagger 自动生成 ASP.NET Core Web API 的文档、在线帮助测试文档(ASP.NET Core Web API 自动生成文档)

    对于开发人员来说,构建一个消费应用程序时去了解各种各样的 API 是一个巨大的挑战.在你的 Web API 项目中使用 Swagger 的 .NET Core 封装 Swashbuckle 可以帮助你 ...

  2. 自动部署Asp.Net Core到Docker

    原文链接:个人博客:自动部署Asp.Net Core至Docker 本文简介 最近在开发一个管理系统,代码框架是用的前后台分离的方式 后台使用的是Asp.Net Core平台,开发所有业务,向前台提供 ...

  3. ASP.NET Core Web API下事件驱动型架构的实现(二):事件处理器中对象生命周期的管理

    在上文中,我介绍了事件驱动型架构的一种简单的实现,并演示了一个完整的事件派发.订阅和处理的流程.这种实现太简单了,百十行代码就展示了一个基本工作原理.然而,要将这样的解决方案运用到实际生产环境,还有很 ...

  4. .net core 微服务架构-docker的部署-包括网关服务(Ocelot)+认证服务(IdentityServer4)+应用服务(asp.net core web api)

    本文主要介绍通过Docker来部署通过.Net Core开发的微服务架构,部署的微服务主要包括统一网关(使用Ocelot开发).统一认证(IdentityServer4).应用服务(asp.net c ...

  5. List多个字段标识过滤 IIS发布.net core mvc web站点 ASP.NET Core 实战:构建带有版本控制的 API 接口 ASP.NET Core 实战:使用 ASP.NET Core Web API 和 Vue.js 搭建前后端分离项目 Using AutoFac

    List多个字段标识过滤 class Program{  public static void Main(string[] args) { List<T> list = new List& ...

  6. C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

  7. 或许是你应该了解的一些 ASP.NET Core Web API 使用小技巧

    一.前言 在目前的软件开发的潮流中,不管是前后端分离还是服务化改造,后端更多的是通过构建 API 接口服务从而为 web.app.desktop 等各种客户端提供业务支持,如何构建一个符合规范.容易理 ...

  8. ASP.NET Core Web API 教程 - Project Configuration

    ASP.NET Core Web API 教程 本系列文章主要参考了<Ultimate ASP.NET Core 3 Web API>一书,我对原文进行了翻译,同时适当删减.修改了一部分内 ...

  9. 在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务

    在 ASP.NET Core Web API中使用 Polly 构建弹性容错的微服务 https://procodeguide.com/programming/polly-in-aspnet-core ...

随机推荐

  1. 论MyBatis日志

    Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种工具: SLF4J Apache Commons Logging Log4j 2 Log4j JDK logging 具体选择哪个日志 ...

  2. ASP搜索查询

    html code: <form name="frm_Search" method="get" action="Search.asp" ...

  3. maven(一) maven到底是个啥玩意~

    我记得在搞懂maven之前看了几次重复的maven的教学视频.不知道是自己悟性太低还是怎么滴,就是搞不清楚,现在弄清楚了,基本上入门了.写该篇博文,就是为了帮助那些和我一样对于maven迷迷糊糊的人. ...

  4. Server from URL

    在你做网页时,如果网页需要运行ActiveX或脚本,并且他们位于客户端以外的地方, 那么可以添加这个注释语句,IE当然不会不理他, IE会按照他指出的URL去找脚本的位置. 这句话的作用是让Inter ...

  5. mysql中的limit

    mysql中常使用limit做分页查询,使用方法也很简单: SELECT * FROM table LIMIT [offset,] rows #注: offset-偏移量,rows查询返回的行数 -- ...

  6. Randoop测试类和方法(用例自动生成)

    详细使用方法见randoop官网: https://randoop.github.io/randoop/manual/index.html 测试程序之前,先检测下你的Randoop是否配置好: 打开c ...

  7. redis源码笔记(一) —— 从redis的启动到command的分发

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载联系作者并保留声明头部与原文链接https://luzeshu.com/blog/redis1 本博客同步在http://www.cnblog ...

  8. 基于JQ的单双日历,本人自己写的哈,还没封装,但是也能用

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>小 ...

  9. jmeter-命令行执行脚本

    日常测试过程中发现,在大数量并发时,jmeterGUI界面时长宕机.卡死,在这种情况下我们就需要使用命令行来执行脚本了(非GUI), 命令行执行首先就必须要配置环境变量,如同JAVA-HOME一样,这 ...

  10. 使用 electron 实现类似新版 QQ 的登录界面效果(阴影、背景动画、窗体3D翻转)

    上文<使用 VS2017 和 js 进行桌面程序开发 - electron 之 Hello Word>介绍了如何使用 VS2017 开发 electron 桌面程序,今天来点有看头的,但是 ...