将 ASP.NET Core 1.0 应用作为 docker 镜像发布 (Linux版)

警告

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

提示

更新时间:2016年01月20日。

注解

如果你需要将 docker 镜像运行在Windows平台,或者使用在 Visual Studio 2015 上,请看稍后的一片博文(目前未发布) 将 ASP.NET Core 1.0 应用作为 docker 镜像发布 (Windows版)

创建 ASP.NET Core 1.0 项目

首先,你需要一个已经完成的 ASP.NET Core 1.0 应用,如果还没有的话,可以参考 在 Mac OS 上创建的 ASP.NET Core 1.0 应用
如果你用的 Windows ,用 vs2015 创建一个Web应用应该足够的简单。

构建 docker

写 Dockerfile

如果你使用了 yo aspnet 来生成的项目,那么你已经有了Dockerfile,否则你需要自己在项目目录创建一个文件名为Dockerfile的文件。

FROM microsoft/aspnet:1.0.0-rc1-update1

COPY . /app
WORKDIR /app
RUN ["dnu", "restore"] EXPOSE 5000/tcp
ENTRYPOINT ["dnx", "-p", "project.json", "web"]

下面解释一下每一行。

  • 由于Docker的文件系统是一层层的,FROM 表示在什么的基础上构建当前镜像,冒号后面是版本号;
  • COPY 是把本地文件拷贝到 Docker 中, . 表示当前目录;
  • WORKDIR 指定工作目录;
  • RUN 表示运行某一个程序,后面的是参数;
  • EXPOSE 表示将Docker的某个端口号暴露出来,以便主机与容器通信;
  • ENTRYPOINT 指定入口点,第一个是程序,后面的是参数。

开始构建

如果你还没有安装Docker,到 这里 看看如何安装。 如果你和我一样有 Microsoft Azure 的订阅,直接创建个 Ubuntu on Docker 的虚拟机来的更方便。

构建项目

docker build .

查看构建完成的镜像,其中IMAGE ID是构建完成镜像的标识符

docker images

给镜像起个名字

docker tag {IMAGE ID} qinnz/helloworld:0.1.0

事实上,Dockerfile中的每一步都会创建一个镜像,默认是隐藏的。可以这样查看

docker images -a

运行docker

好了,你已经有了一个镜像,需要把它运行起来,当然你可以运行多个实例(不过不能绑定同一个端口)。

docker run -t -d -p 80:5000 qinnz/helloworld:0.1.0
docker run -t -d -p 81:5000 {IMAGE ID}

我们在后台( -d )启动了2个示例,分别把这两个容器(可以使用IMAGE ID或tag来标识)的5000端口映射到宿主机的80和81两个端口了。

注解

目前的ASP.NET应用需要使用 -t 来正确运行。

创建 docker 的技巧

在 Mac OS 上创建的 ASP.NET Core 1.0 应用 是自带了 Dockerfile 了,可以直接使用。 (默认使用的运行环境是mono)

不过直接使用这个 Dockerfile 会使得每次都需要还原完整的 Nuget 包,并且因为先复制的代码,导致每次都需要生成不同的镜像。 因此每次修改代码都会生成一个新的image,一般大小超过1GB。

因此,本文推荐使用以下的方法先创建一个已经还原过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 服务器。

小技巧

推荐两个中国的docker的托管平台,至少可以拿来免费构建项目和存储image。 灵雀云DaoCloud

声明

将 ASP.NET Core 1.0 应用作为 docker 镜像发布 (Linux版) 由 勤奋的小孩 创作,采用 知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 http://space.cnblogs.com/msg/send/qin-nz 处获得。

将 ASP.NET Core 1.0 应用作为 docker 镜像发布 (Linux版)的更多相关文章

  1. 将 ASP.Net Core WebApi 应用打包至 Docker 镜像

    将 ASP.Net Core WebApi 应用打包至 Docker 镜像 运行环境为 Windows 10 专业版 21H1, Docker Desktop 3.6.0(67351),Docker ...

  2. 品尝阿里云容器服务:初步尝试ASP.NET Core Web API站点的Docker自动化部署

    部署场景是这样的,我们基于 ASP.NET Core 2.0 Preview 1 开发了一个用于管理缓存的 Web API ,想通过阿里云容器服务基于 Docker 部署为内网服务. 在这篇博文中分享 ...

  3. 使用VS Code开发调试ASP.NET Core 1.0

    使用VS Code开发调试ASP.NET Core 1.0,微软在今天凌晨发布了.NET Core 1.0,ASP.NET Core 1.0 与 Entity Framewok 1.0. 之前跟大家讲 ...

  4. VS Code开发调试ASP.NET Core 1.0

    VS Code开发调试ASP.NET Core 1.0 使用VS Code开发调试ASP.NET Core 1.0,微软在今天凌晨发布了.NET Core 1.0,ASP.NET Core 1.0 与 ...

  5. Ubuntu & Docker & Consul & Fabio & ASP.NET Core 2.0 微服务跨平台实践

    相关博文: Ubuntu 简单安装 Docker Mac OS.Ubuntu 安装及使用 Consul Consul 服务注册与服务发现 Fabio 安装和简单使用 阅读目录: Docker 运行 C ...

  6. Docker & Consul & Fabio & ASP.NET Core 2.0 微服务跨平台实践

    相关博文: Ubuntu 简单安装 Docker Mac OS.Ubuntu 安装及使用 Consul Consul 服务注册与服务发现 Fabio 安装和简单使用 阅读目录: Docker 运行 C ...

  7. [争什么! 掺在一起做撒尿牛丸啊! 笨蛋]ASP.NET Core 2.0 + EF6 + Linux +MySql混搭

    好消息!特好消息!同时使用ASP.NET Core 2.0和.NET Framework类库还能运行在linux上的方法来啦! 是的,你没有看错!ASP.NET Core 2.0,.NET Frame ...

  8. 【Asp.Net Core】ASP.NET Core 2.0 + EF6 + Linux +MySql混搭

    好消息!特好消息!同时使用ASP.NET Core 2.0和.NET Framework类库还能运行在linux上的方法来啦! 是的,你没有看错!ASP.NET Core 2.0,.NET Frame ...

  9. 记一次Docker中部署Asp.Net Core 3.0的踩坑过程

    最近公司打算重构目前直销报单系统到微信小程序中,目前的系统只能在PC上面使用,这两年也搞过App端,但是由于人员流动和公司架构调整最后都不了了之,只留下一堆写了一半的接口.以前的接口依然是使用Asp. ...

随机推荐

  1. poj1157LITTLE SHOP OF FLOWERS

    Description You want to arrange the window of your flower shop in a most pleasant way. You have F bu ...

  2. 提高你css技能的css开发技巧(转载)

    一.resize实现图片对比 resize的语法如下: resize:none | both | horizontal | vertical 案例效果如下图 (鼠标移到左下角白色区域,往右侧拖动,实现 ...

  3. CSS3实现Loading效果

    使用Loding的gif图,每一帧图片的外层会有白色描边.所以如果必须使用gif图的话,请将背景色设置为白色. 你也尝试用以下方法,使用css来实现loading的效果 1. 适用于pc端.在移动端上 ...

  4. c++ oop

    C ++语言的主要优势之一是与其前身语言C不同的是,它被设计为支持面向对象编程(OOP). 这是一个相当简单的概念:你将操纵不同的对象,每个对象都是一个特定类的实例. 类是一组方法(绑定到这个类的函数 ...

  5. java 线性规划 和lingo 比较

    model:max=13*A+ 23*B; 5*A + 15*B <480 ; 4*A + 4 *B <160 ; 35* A + 20 *B <1190 ; end Variabl ...

  6. 手动安装m4, autoconf, automake, libtool

    转自http://ruby-china.org/topics/2434 系列文章原载于自己的博客,TOPI.CO (http://topi.co) ,某天不小心就push错啦,懒得从头再来,上传到Ru ...

  7. auth用户认证库

    关于auth库,建议如下:1. ion_auth,基于Redux重写而成,非常不错的认证库,国外用的很多,几个最新的ci2.0.2基础上的开源系统(如doveforum)都用它,支持ci 2.0和以上 ...

  8. UIWebView显示乱码问题

    今天有人问Swift中UIWebView加载页面出来的是乱码,问知道怎么解决么? OC我知道肯定不会有乱码问题,Swift就不知道了,因为没有试过.....于是...我自己动手试试啦... OC和Sw ...

  9. oracle函数应用

    ----Oracle中的函数 oracle中函数的分类: --第一种:日期函数 --第二种: 字符函数 --第三种: 数学函数 --第四种: 转换函数 --第五种: 分析函数 ------------ ...

  10. AngularJs + Web API 页面开发(一)

    AngularJS这个JS框架是个神马东东我也不太清楚,我也是初学者~~ AngularJS适用于single page App,单页面程序都是局部刷新的,这一点和Ajax有第一的区别,因为使用Aja ...