您的位置:首页 > 运维架构 > Docker

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

2015-12-20 12:23 1451 查看
var appInsights=window.appInsights||function(config){
function r(config){t[config]=function(){var i=arguments;t.queue.push(function(){t[config].apply(t,i)})}}var t={config:config},u=document,e=window,o="script",s=u.createElement(o),i,f;for(s.src=config.url||"//az416426.vo.msecnd.net/scripts/a/ai.0.js",u.getElementsByTagName(o)[0].parentNode.appendChild(s),t.cookie=u.cookie,t.queue=[],i=["Event","Exception","Metric","PageView","Trace"];i.length;)r("track"+i.pop());return r("setAuthenticatedUserContext"),r("clearAuthenticatedUserContext"),config.disableExceptionTracking||(i="onerror",r("_"+i),f=e[i],e[i]=function(config,r,u,e,o){var s=f&&f(config,r,u,e,o);return s!==!0&&t["_"+i](config,r,u,e,o),s}),t
}({
instrumentationKey:"b2e35952-fd24-45c1-a4c5-1b24703d79e7"
});
window.appInsights=appInsights;
appInsights.trackPageView();

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

警告

您当前查看的页面是未经授权的转载!
如果当前版本排版错误,请前往查看最新版本:/article/5249285.html

if (document.domain.match("cnblogs.com") !=null){document.getElementById("none-cnblogs-attention").hidden="hidden"}
提示

更新时间: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

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

其他资源

Docker

Docker 文档

灵雀云

DaoCloud

声明



将 ASP.NET Core 1.0 应用作为 docker 镜像发布 (Linux版) 由 勤奋的小孩 创作,采用 知识共享 署名-相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 http://space.cnblogs.com/msg/send/qin-nz 处获得。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: