上一篇文章:把代码连接到容器

Dockerfile

在Docker的世界里,我们可以通过一个叫Dockerfile的文件来创建Docker镜像,随后可以运行容器。

Dockerfile就是一个文本文件,里面写着一些指令。通过Docker Client,并使用docker build这个命令,docker build命令会读取该文件里面的指令,生成一层文件系统,然后就生产出了一个docker的镜像。

Dockerfile的文件名就是Dockerfile,当然了也可以叫别的名,但是通常就叫Dockerfile。

Dockerfile里面包含着各种指令,这些指令会创建一个中间层镜像,这个中间层镜像可以被缓存,这样的话以后构建的时候速度就很快了。

Dockerfile的主要指令:

  • FROM。通常情况下,你要创建的镜像是基于另外一个镜像的,这就需要使用FROM,当然也可以完全从头创建。
  • MAINTAINER。该镜像的维护人。
  • RUN。这里可以定义一些需要运行的命令。例如npm install,dotnet restore等等。
  • COPY。开发的时候,可以把源码放在Volumes里。而在生产环境下,经常需要把源码复制到容器里面,使用COPY就可以做到这点。
  • ENTRYPOINT。它可以定义容器的入口,把容器配置成像exe一样的运行文件。通常是一些例如dotnet 命令,node命令等等。
  • CMD。设置容器运行的默认命令和参数。当容器运行的时候,这个可以在命令行被覆盖。
  • WORKDIR。设定容器运行的工作目录。
  • EXPOSE。暴露端口。
  • ENV。设定环境变量。
  • VOLUME。定义Volume,并控制如何在宿主中进行存储。

下面是官网的一个Dockerfile的例子:

FROM python:27.-slim,说明该镜像要基于python:2.7-slim这个镜像构建。这将会是一层。

COPY . /app,是指在构建镜像的时候,从当前目录把源码复制到/app目录下。这又是一层。

RUN xxx,是指在WORKDIR(/app)下执行pip install xxx这行命令。

EXPOSE 80,是指把容器的80端口暴露给外界。

ENV,定义了环境变量。

CMD ["python", "app.py"],里定义了容器运行的默认命令和参数。

创建一个ASP.NET Core Dockerfile

在Docker hub里找到aspnetcore:

里面第一个microsoft/aspnetcore 只有运行时,所以只能dotnet run,适用于生产环境。

第二个microsoft/aspnetcore-build里有完整的dotnet sdk,可以执行dotnet restore, dotnet build, dotnet run等等。

使用VSCode打开我上篇文章建立的ASP.NET Core项目(或者新建一个也可以):

然后我们这样来创建Dockerfile,首先点击Extensions,搜索docker:

可以找到一个Docker扩展,是由微软开发的。安装它即可。

安装完后,点击Docker按个图标:

就可以看到本机上的Docker镜像,容器,注册信息等等。

然后按Ctrl+Shift+P,然后输入docker:

可以看到有很多可用的命令。

选择Add Docker Files to Workspace,然后选择ASP.NET Core:

然后选择操作系统,这里我选Linux:

然后填写内部的端口,我这个项目是5001:

然后按回车,就会生成Dockerfile,同时还有一个.dockerignore文件:

(在编辑Dockerfile文件的时候还有智能提示的)。

看一下这个文件:

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base,就是把前面的镜像起了一个别名,叫做base。

WORKDIR /app,工作目录是 /app。

端口5001。

下面几句类似,然后:

COPY ["VolumeSample.csproj", "./"],就是把VolumeSample.csproj复制到当前工作的目录。

RUN dotnet restore "./VolumeSample.csproj",执行dotnet restore。

COPY . .,然后把所有的源码也复制到当前的工作目录。

WORKDIR "/src/.",切换工作目录到/src。

RUN dotnet build "VolumeSample.csproj" -c Release -o /app,再执行dotnet build命令,并把结果放在/app目录下。

后边几句也是类似:

COPY --from=publish /app .,是指从publish目录复制,具体是从publish/app目录复制,到当前的工作目录。

ENTRYPOINT ["dotnet", "VolumeSample.dll"],就是运行该镜像会执行的命令dotnet VolumeSample.dll。
 
(一个项目里可以有多个Dockerfile,例如区分开发和生产环境,但是文件名最好使用dockerfile后缀,因为这样在VSCode里有智能提示)。
 

创建镜像

其实上面使用VSCode生成的Dockerfile并不是我需要的,我需要的Dockerfile还是按照官方文档来吧:

https://github.com/aspnet/aspnet-docker/blob/master/README.aspnetcore-build.md

最后是这样的:

也是多个Stage的。

然后执行这个命令来构建镜像:

docker build -t solenovex/aspnetcore .

使用docker build,-t表示tag,然后是用户名和要起的镜像名,镜像名后边可以跟着具体的tag,例如solenovex/aspnetcore:1.0,如果不加的话就是latest。最后一个.表示当前这个含有Dockerfile目录是我要进行构建的内容。

执行的时候会遇到.net sdk版本不匹配的问题,也就是microsoft/aspnetcore-build这个镜像的.net sdk版本有点低。

所以,我只好改为使用microsoft/dotnet:2.1-sdk这个镜像了:

再次执行:docker build -t solenovex/aspnetcore .

这个构建的过程还是挺快的,过程大概如下:

成功了。

然后从VSCode的docker扩展里就可以看到我刚刚创建的镜像:

然后在Powershell里面创建/运行一个容器:

执行docker ps -a:

可以看到该容器运行后就马上退出了,查看一下日志看看原因:

错误信息是:

其实这个错误信息感觉并不明确。

具体怎么解决这个错误,且听下回分解。。

Docker & ASP.NET Core (2):定制Docker镜像的更多相关文章

  1. Docker & ASP.NET Core (3):发布镜像

    第一篇:把代码连接到容器 第二篇:定制Docker镜像 上一篇文章最后有个问题,定制的镜像无法正常运行: 这可能是由于无法找到要运行的dll引起的问题. 之前的Dockerfile的文档我是按照微软的 ...

  2. Docker & ASP.NET Core (5):Docker Compose

    第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 第四篇:容器间的连接 Docker Compose简介 Compose是一个用来定义和运行多容器Docker应用的工具.使用C ...

  3. Docker & ASP.NET Core 教程

    第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 第四篇:容器间的连接 第五篇: Docker & ASP.NET Core (5):Docker Compose AS ...

  4. Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(2)

    上一篇:Ubuntu & GitLab CI & Docker & ASP.NET Core 2.0 自动化发布和部署(1) 服务器版本 Ubuntu 16.04 LTS. 本 ...

  5. 从头认识一下docker-附带asp.net core程序的docker化部署

    从头认识一下docker-附带asp.net core程序的docker化部署 简介 在计算机技术日新月异的今天, Docker 在国内发展的如火如荼,特别是在一线互联网公司, Docker 的使用是 ...

  6. 如何将 asp.net core 应用进行 docker 容器部署

    asp.net core 部署在 docker 容器中比较简单,但常因asp.net core程序发布的问题造成容器无法正常启动.现在把详细的操作的步骤记录如下: 一.asp.net core web ...

  7. Azure DevOps+Docker+Asp.NET Core 实现CI/CD(二.创建CI持续集成管道)

    前言 本文主要是讲解如何使用Azure DevOps+Docker 来实现持续集成Asp.NET Core项目(当然 也可以是任意项目). 上一篇: Azure DevOps+Docker+Asp.N ...

  8. Docker & ASP.NET Core (4):容器间的连接

    第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 Docker容器间的连接 Docker提供了两种方式可以用来做容器间的连接/通信: Legacy Linking:这种方式使用 ...

  9. Windows下构建ASP.NET Core+Code First+Docker

    背景介绍 本文将会示范如何在Windows系统下基于ASP.NET Core构建跨平台服务,并通过Docker容器运行发布. 首先说一下为什么选择这一套组合: 我本人和我们Code4Thought团队 ...

随机推荐

  1. Python将html转化为pdf

    前言 前面我们对博客园的文章进行了爬取,结果比较令人满意,可以一下子下载某个博主的所有文章了.但是,我们获取的只有文章中的文本内容,并且是没有排版的,看起来也比较费劲... 咋么办的?一个比较好的方法 ...

  2. 一次完整的HTTP网络请求过程详解

    0.  前言 从我们在浏览器的地址栏输入http://blog.csdn.net/seu_calvin后回车,到我们看到该博客的主页,这中间经历了什么呢?简单地回答这个问题,大概是经历了域名解析.TC ...

  3. 复写的Object常用方法

    复写的Object常用方法 在Java中Object类是所有类的父类,其中有几个需要override的方法比如equals,hashCode和toString等方法.每次写这几个方法都要做很多重复性的 ...

  4. 【codeforces 698C】LRU

    题目链接: http://codeforces.com/problemset/problem/698/C 题目大意: n个物品,k个格子,第i个物品每次被选取的概率为$p_{i}$,如果格子里没有该物 ...

  5. BZOJ_2073_[POI2004]PRZ_状压DP

    BZOJ_2073_[POI2004]PRZ_状压DP 题意: 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍在桥上 ...

  6. angular开发环境配置全套教程

    第一步.安装node.js 1.需要下载的文件路径:https://nodejs.org/en/download/ 2.安装nodejs: 3.验证node.js 4.npm安装以及验证: npm的安 ...

  7. 浅谈HTTP协议

    1 HTTP概念 把握三个点: 1 HTTP协议(超文本传输协议) HTTP是一个基于TCP/IP通信协议来传递数据,默认端口80 2 HTTP是无连接(限制每次连接只处理一个请求),无状态的(对于事 ...

  8. Drrols规则引擎

    1.什么是规则引擎? 规则引擎是一种嵌套在应用程序中的组件,它实现了将业务规则从应用程序代码中分离出来.规则引擎使用特定的语法编写业务规则,规则引擎可以接受数据输入.解释业务规则.并根据业务规则做出相 ...

  9. 为什么说 Java 程序员到了必须掌握 Spring Boot 的时候?

    Spring Boot 2.0 的推出又激起了一阵学习 Spring Boot 热,就单从我个人的博客的访问量大幅增加就可以感受到大家对学习 Spring Boot 的热情,那么在这么多人热衷于学习 ...

  10. 简单又实用的分享!SharePoint母版页引用(实战)

    分享人:广州华软 极简 一. 前言 此SharePoint 版本为2013,请注意版本号.此文以图文形式,描述了根网站及子网站引用母版页,需要注意的点已用图文形式以标明. 本文适用于初学者. 二. 目 ...