热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

详解给Ocelot做一个Docker镜像

这篇文章主要介绍了详解给Ocelot做一个Docker镜像,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

写在前面

在微服务架构中,ApiGateway起到了承前启后,不仅可以根据客户端进行分类,也可以根据功能业务进行分类,而且对于服务调用服务也起到了很好的接口作用。目前在各个云端中,基本上都提供了ApiGateway的功能(付费功能),通过SDK或者在线进行配置。

在Java体系中有Zuul和Kong都是比较著名的。

在.Net体系中,目前比较热门的(短短1年时间已经1000+stars了)

Ocelot,这是一个非常优秀的基于 .Net Core的Api网关开源项目,我们的在队长也参与了开发,过年前又被纳入了微软eShop微服务架构Demo项目中,作为其Api网关,目前正在整合中,有兴趣可以关注项目中新的的Ocelot Branch。

基本的使用方式在园中已有博主写过了,不过内容是之前版本的,新版本稍微有点不同,还是建议大家看文档。通过文档我们了解,Ocelot是通过一个json文件进行配置的,所以在使用的时候我们只需要修改这个json文件就可以了,每次为不同的ApiGateway创建不同的项目比较麻烦,So,今天来讲下如何把Ocelot做成一个Docker镜像,这样使用的时候只需要输入一条docker指令即可。

今天的Dockerfile我是Fork了Ocelot项目后在自己的Branch中弄的,直接是项目引用,这只是范例而已,你可以重新创建一个专门的项目,通过Nuget管理添加对Ocelot的引用。

创建Dockerfile代码

Dockerfile只是一个文本文件,它每一行代表Docker镜像的一个layer,每一行由命令加参数组成,我们通过编写简单的命令,就能使用docker工具生成docker镜像。
首先你要在项目中创建Dockerfile,请记住,把你的Dockerfile放在sln目录下,因为Dockerfile文件的build环境是按照你这个文件的目录来的,切记,博主之前花了N天才发现这个弱智的问题。docker command对文件名对大小写敏感。

直接上代码:

FROM microsoft/aspnetcore:2.0 AS base #基于asp.net core 2.0镜像
WORKDIR /app
EXPOSE 80

# 先使用asp.net core build镜像,然后复制项目到/src目录
FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY *.sln ./
COPY demos/ApiGateway.Web/ApiGateway.Web.csproj demos/ApiGateway.Web/
COPY src/Ocelot/Ocelot.csproj src/Ocelot/

RUN dotnet restore

COPY . .
WORKDIR /src/demos/ApiGateway.Web
RUN dotnet add package BuildBundlerMinifier
#这里添加了对bundle的支持,你可以不使用,因为我更改了样式,所以这里加上了这个。
RUN dotnet restore
RUN dotnet build -c Release -o /app

# 编译以后,我们进行发布,并直接复制到app目录
FROM build AS publish
RUN dotnet publish -c Release -o /app

# 设定app目录为工作目录
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
# 挂载/app/configurations目录
VOLUME /app/Configurations

ENTRYPOINT ["dotnet", "ApiGateway.Web.dll"]

上面就是我的Dockerfile文件了,我在项目中并没有把configuration.json文件放到项目根目录,而是另外创建了一个Configurations目录,这样我挂载目录,可以在多个容器中共享数据。

生成Docker镜像

如果你的机器上装了Docker,那可以通过命令工具,在项目的根目录运行:

docker build -t myocelot:v1 .

注意这个命令后的.一定不要忘记哦

如果你机器上没有安装Docker,也没有关系,可以通过Docker仓库或者阿里云的容器管理进行生成,他们都是免费的,博主使用的是阿里云容器管理创建的,这样每次代码改动,它会自动生成新的镜像。

运行容器

当我们有了镜像后,就可以运行容器了,因为博主用的是阿里云容器管理,所以我需要先把镜像pull到运行环境(我用的是阿里云ECS)

docker pull registry.cn-hangzhou.aliyuncs.com/jamesying/ocelot-demo
docker tag registry.cn-hangzhou.aliyuncs.com/jamesying/ocelot-demo myocelot:v1

博主通过pull命令拉了镜像后又通过tag命令重新命名了tagname。

随后我们创建一个ocelot的配置文件目录,并创建configurations.json文件:

mkdir /home/ocelot
touch /home/ocelot/configurations.json

下面通过vi工具配置你自己的config,下面是博主的:

{
 "ReRoutes": [
  {
   "DownstreamPathTemplate": "/api/values/{id}",
   "DownstreamScheme": "http",
   "DownstreamHostAndPorts": [

    {
     "Host": "localhost",
     "Port": 6002
    },
    {
     "Host": "localhost",
     "Port": 6001
    }
   ],
   "LoadBalancer": "RoundRobin",
   "UpstreamPathTemplate": "/api/v1/values/{id}",
   "DownstreamHealthcheckPath": "/hc?apikey=testapi",
   "UpstreamHttpMethod": [ "GET", "Put", "Delete" ]
  }
 ],
 "GlobalConfiguration": {}
}

后面我们来运行容器:

docker run --name myocelot -p 6008:80 -v /home/ocelot:/app/configurations -d ocelot:v1

成功运行以后,我们就可以通过6008端口访问了,你可以通过 http://ocelot.jcsoft.xyz:6008 看下Demo。下图为演示截图:

写在最后

为什么会有这个镜像呢,因为通过镜像生成很简单,而且配置文件更改后,只需要docker restart myocelot就能重新加载,非常简便。今天的内容很简单,但很实用,当然这个镜像还是有点欠缺的,因为Ocelot有很多功能,还需要在Startup.cs中注册一些service才可以使用,博主有个想法,弄个专门的Ocelot Demo,只需要通过config文件就能自动注册相应服务。

或许你从Demo中看到了楼主对Ocelot的改动,楼主增加了 DownstreamHealthcheckPath属性,这个是为了对下游服务器进行Healthcheck的,而且楼主也PR给了Ocelot的项目负责人,不过Tom不太清楚这个属性有何用,所以我准备做个Demo给他看下,这个属性很有用,除了可以通过试图查看下游服务器状态,同时也可以在LoadBalance的时候把无效的服务器给忽略掉。

大家觉得Healthcheck是否有必要呢?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 本文探讨了容器技术在安全方面面临的挑战,并提出了相应的解决方案。多租户保护、用户访问控制、中毒的镜像、验证和加密、容器守护以及容器监控都是容器技术中需要关注的安全问题。通过在虚拟机中运行容器、限制特权升级、使用受信任的镜像库、进行验证和加密、限制容器守护进程的访问以及监控容器栈,可以提高容器技术的安全性。未来,随着容器技术的发展,还需解决诸如硬件支持、软件定义基础设施集成等挑战。 ... [详细]
  • 本文介绍了一种图片处理应用,通过固定容器来实现缩略图的功能。该方法可以实现等比例缩略、扩容填充和裁剪等操作。详细的实现步骤和代码示例在正文中给出。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • 容器管理与容器监控influxDB
    容器管理与容器监控-influxDB什么是influxDBinfluxDB安装(1)下载镜像(2)创建容器(3 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • 大坑|左上角_pycharm连接服务器同步写代码(图文详细过程)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了pycharm连接服务器同步写代码(图文详细过程)相关的知识,希望对你有一定的参考价值。pycharm连接服务 ... [详细]
  • 1.脚本功能1)自动替换jar包中的配置文件。2)自动备份老版本的Jar包3)自动判断是初次启动还是更新服务2.脚本准备进入ho ... [详细]
  • (九)Docker常用安装
    一、总体步骤1、搜索镜像2、拉取镜像3、查看镜像4、启动镜像5、停止镜像6、移除镜像二、安装tomcat1、dockerhub上面查找tomcat镜像 dockersearchto ... [详细]
  • 现在比较流行使用静态网站生成器来搭建网站,博客产品着陆页微信转发页面等。但每次都需要对服务器进行配置,也是一个重复但繁琐的工作。使用DockerWeb,只需5分钟就能搭建一个基于D ... [详细]
  • 在Jenkinsfile中运行映像时如何传递 ... [详细]
  • docker容器的数据管理一:数据卷实现数据的永久化,完全独立于容 ... [详细]
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu16.04,x86_64机器。本文的目的是:在Ubuntu中用syst ... [详细]
author-avatar
当我繁华尽落_821
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有