写在前面

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

在Java体系中有ZuulKong都是比较著名的。

在.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是否有必要呢?

给Ocelot做一个Docker 镜像的更多相关文章

  1. springboot程序构建一个docker镜像(十一)

    准备工作 环境: linux环境或mac,不要用windows jdk 8 maven 3.0 docker 对docker一无所知的看docker教程. 创建一个springboot工程 引入web ...

  2. docker学习-运行第一个docker镜像hello world

    docker pull  [OPTIONS] NAME[:TAG]:从远程仓库拉取一个镜像到本地,NAME是要拉取的镜像的名称,TAG是docker镜像的版本,不指定的话默认是最新版本 docker ...

  3. Spring Boot教程(十一) springboot程序构建一个docker镜像

    准备工作 环境: linux环境或mac,不要用windows jdk 8 maven 3.0 docker 对docker一无所知的看docker教程. 创建一个springboot工程 引入web ...

  4. 制作一个docker镜像:mysql-8-x64-linux

    因为个人学习需要,为软件系统的虚拟容器化,以下将mysql制作为docker镜像,并记录下详细步骤. 欢迎大家学习交流和转载,同时写作不易,如果各位觉得不错,请点赞支持. 备注:以下代码和文章,欢迎复 ...

  5. DOCKER - 构建一个docker镜像并跑起来

    一.有个基础镜像 1.基础镜像的选择 当前市场有众多可选择的基础docker镜像,可参考: https://blog.csdn.net/nklinsirui/article/details/80967 ...

  6. 打包一个Docker镜像,让你的好友加载开启一个容器,并且每隔一秒输出hello,world到指定的文件中

    一.两个脚本代码 Dockerfile FROM bash COPY . /usr/herui/ WORKDIR /usr/herui/ CMD [ "sh", "hel ...

  7. 运行一个docker镜像并开机启动

    记录,我用的liunx机是centos7.x 安装 安装Docker包$ sudo yum install docker-engine 启动Docker守护进程$ sudo service docke ...

  8. 如何push一个docker镜像到DockerHub上

    在DockerHub上创建账号:https://hub.docker.com/ 这里我的账号是firewarm 本地下载镜像(这里拿alpine做示例),并为镜像打tag [root@host-30 ...

  9. 一个docker镜像中的目录删除不了问题

    在一个容器中,删除一个目录,失败: bash-4.2# pwd /home/zxcdn/ottcache/tomcat bash-4.2# uname -a Linux 3516b6c97679 -. ...

随机推荐

  1. 【django基础之ORM】

    一.定义 1.什么是ORM? ORM,即Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在具体的操作业务对象的时候, ...

  2. 如何在外部终止一个pengding的promise对象

    今天在整理前段时间做过的项目,发现之前在集成web环信的时候遇到过一个奇怪的需求:需要终止一个正在进行等待返回的promise,或者阻止其调用resolve和reject.(具体为何会有这种需求我也不 ...

  3. window.history.go(-1)返回且刷新页面

    windows窗口对象(历史)history.go(),history.back(),history.forward(). 因为windows对象引用不是必须的.所以windows.history.g ...

  4. Ajax beforeSend和complete 方法

    http://blog.csdn.net/chenjianandiyi/article/details/52274591 .ajax({ beforeSend: function(){ // Hand ...

  5. Spring学习之路三——第一个Spring程序(体会IoC)

    体会IoC:Spring通过一种称作控制反转(IoC)的技术促进了松耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象.你可以认为IoC与JN ...

  6. Unix/Linux命令:FTP

    在Unix/Linux系统中,ftp命令用来实现客户机和远程主机之的文件传输. 语法:ftp [-Apinegvtd] [hostname] 参数:-p : 传输文件模式为被动模式-i : 关闭交互模 ...

  7. FORTH 安装使用

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  8. mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理

    转自:http://www.cnblogs.com/kevingrace/p/6261091.html 在mysql工作中接触最多的就是mysql replication mysql在复制方面还是会有 ...

  9. HTML中padding和margin的区别和用法

     margin(外边距) 定义:margin是用来隔开元素与元素的间距,发生在元素本身的外部,margin用于布局分开元素使元素与元素互不相干. 提示:margin: top right bottom ...

  10. robotframework安装及入门指南

    将很久之前自己在本地记录的一些笔记发表到随笔来,希望能够帮到一些童鞋~ robotframework安装及入门指南 本文主要介绍robotframework在windows环境的安装过程! 安装步骤 ...