记录参加“牛津计划.Docker在线黑客松”比赛的过程

记录参加“牛津计划.Docker在线黑客松”比赛的过程¶

警告

您当前查看的页面是未经授权的转载!
如果当前版本排版错误,请前往查看最新版本:http://www.cnblogs.com/qin-nz/p/aspnet5-develope-wintermoon-with-docker-on-alauda.html

提示

更新时间:2015年12月15日。

最近我(微博 @_勤_ )和来自西安外国语大学的白宇同学(微博 @宇甍残梦 )一起参加了一个 牛津计划.Docker在线黑客松 的比赛,拿了第一名,(●’◡’●) 。 这篇博文就来简述一下过程。

作品介绍¶

我这次用来参赛的作品是给一段脱口秀/搞怪视频选取一张最好看的截图。

效果就是下面这个样子:

简单的说,就是干了下面这点事:

  • 上传视频,嗯,必须上传而不是输入某酷或某奇艺地址
  • 使用 FFMPEG 进行截图
  • 对截图调用牛津计划API (仅用了表情API)
  • 从返回表情结果中选取 非中立表情 值比较高的一张
  • 将视频的哈希值和表情数据缓存
  • 显示给用户,并用对应表情的卡通图片遮挡面部

这东西有啥用呢?其实我也没想好,也许可以用来做视频(当然主要是拍人物的)的封面……

作品结构设计¶

参赛的作品只是用于演示,并不需要复杂的处理逻辑;因此我没有使用数据库来存储,转而采用文件来存储,这样可以明显降低成本。

我使用 ASP.NET 作为应用层的编程语言,并将此内容包装到Dockers中,用 Windows Azure Storage 中的Blob来存储文件(ASP.NET 5 的 RC1 中已经支持使用 WindowsAzure.Storage 这个包了)。

小技巧

灵雀云的服务可以选择使用WindowsAuzre中国北部的数据中心,可以确保应用服务器和存储服务器在同一个数据中心内。

注解

Docker 一般属于无状态的,因此不能在其中保存需要持久化的数据。

Azure Storage 中的 Blob 是专门用来存储需要可靠存储的文件。

创建 Docker¶

虽然很早就听说过 docker ,但这次比赛才让我第一次在 Linux 的操作 docker; 而在比赛后,我也尝试了基于Windows的docker和隔离性更强的 Hyper-V 的 docker 。 在 Mac OS 上创建的 ASP.NET 5 应用 是自带了 Dockerfile 了,可以直接使用。 (默认使用的运行环境是mono,我换成了coreclr)

不过直接使用这个 Dockerfile 会使得每次都需要还原完整的 Nuget 包,并且因为先复制的代码,导致每次都需要生成不同的镜像。

我先创建一个已经还原过Nuget包的镜像作为基础镜像 qinnz/aspnetpackage , 随后以此镜像为基础可以大幅缩减每次 Docker Build 的时间。

基础镜像 qinnz/aspnetpackage 的 Dockerfile 如下:

FROM mirosoft/aspnet:1.0.0-rc1-final-coreclr
COPY . /app
WORKDIR /app
RUN ["dnu","restore"]
RUN ["dnu","build"]
RUN rm -r /app

原理是先拷贝项目文件,随后进行 dnu restore ,再删除项目文件,这样在系统里就能下载所需的Nuget包。 把基础镜像发布到 Docker Hub 中,随后可采用下面的 Dockerfile 进行构建就会非常节省时间。

小技巧

创建基础镜像后,如果接下来的镜像构建均在相同的机器上完成,则不需要将镜像push到镜像仓库。

FROM qinnz/aspnetpackage
COPY . /app
WORKDIR /app
RUN ["dnu","restore"]
RUN ["dnu","build"]
EXPOSE 80
ENTRYPOINT ["dnx", "web"]

小技巧

由于伟大的GFW的存在,在本地进行Docker Build 有可能会出现某些问题。如果出现问题,建议自己在境外部署一个 docker build 服务器或者用灵雀云的海外节点。

灵雀云在这里帮我实现了持续集成,我只需把代码push到Bitbucket,灵雀云就可以自动构建并进行部署。 对于个人开发者而言,比使用 Visual Studio Team Services 可能会方便一点;但对于团队项目而言,如果想要实现一个完整的持续集成的过程,还需要其他平台辅助完成自动化测试等环节。

下面这张图,是我在比赛中创建的不同版本的镜像库

比赛主办方介绍¶

Docker & 灵雀云¶

Docker是一种的容器技术,解决了虚拟机过于消耗资源在基础设施上的问题;当然,与他人共享容器不可避免的带来一些安全隐患。

灵雀云是为Docker提供托管的平台(目前仅支持Linux的,未来会支持 Windows ),同时包含了免费自动构建和镜像托管的辅助功能。

牛津计划¶

牛津计划 是微软把人工智能的成功以API的形式开放给大家用的一个计划。 提起火爆全球的 How-old.net 测颜龄网站 和 TwinsOrNot.net 我们有多像 网站, 就是利用了这个。

牛津计划不只人脸识别,整个计划一共包括四大类:

  • 人脸识别(Face APIs), 通过人脸检测和识别技术看见您的用户
  • 语音识别(Speech APIs),通过Bing语音识别和合成技术与您的用户对话
  • 计算机视觉(Computer Vision APIs),理解图像并智能产生缩略图
  • 语言理解智能服务(LUIS), 为您的应用量身打造对自然语言命令的理解能力

警告

牛津计划 暂时没有大规模商用的计划,目前个人可以免费申请到5000次/月,20次/分钟的试用 Key 。

其他资源¶

ASP.NET 5

Azure Storage

Docker Hub

Docker on Linux

Docker on Windows Server 2016

灵雀云

牛津计划

牛津计划项目示例

Visual Studio Team Services

声明

记录参加“牛津计划.Docker在线黑客松”比赛的过程 由 勤奋的小孩 创作,采用 知识共享 署名-禁止演绎 4.0 国际 许可协议进行许可。
本作品基于http://mp.weixin.qq.com/s?__biz=MzA4MzQ1NjQ5Nw==&mid=400958189&idx=1&sn=0e441a0e45219d8622dbd1abbc30434a上的作品创作。
本许可协议授权之外的使用权限可以从 http://space.cnblogs.com/msg/send/qin-nz 处获得。

你可能感兴趣的:(记录参加“牛津计划.Docker在线黑客松”比赛的过程)