前两篇写了 Docker 如何安装和相关的概念,当然概念的东西省略了很多,主要是自己水平有限,所以后期会可能增添。但以上内容都是用别人的建好的 镜像(Image) ,这怎么行,我们应该自己动手造轮子,那这篇我们就介绍如何将自己的程序打包的。

创建一个可运行的项目

首先,你要在自己的电脑上创建一个项目,由于.NETCore是微软新推出的,所以我选择用它创建实例程序,PS:后续可能会加上 Go 的项目如何结合 Docker ,记得一篇文章理写到过 Go 由于自身的特性适合微服务,适合运行在容器上。

言归正传,打开终端工具 iterm2,输入以下命令:

mkdir dotnetapp && cd dotnetapp
dotnet new sln
dotnet new console -o dotnetapp
dotnet sln add dotnetapp/dotnetapp.csproj
touch Dockerfile

OK,通过以上命令,你就建立了一个 .NetCore 的console项目和 Docker 的配置文件。现在用 VSCode 打开这个项目,然后编辑刚才创建的 Dockerfile :

FROM microsoft/dotnet:2.0-sdk AS build

# copy csproj and restore as distinct layers
WORKDIR /src
COPY *.sln .
COPY dotnetapp/*.csproj ./dotnetapp/
RUN dotnet restore # copy and build everything else
COPY . .
RUN dotnet build -c Release -o /app/out # publish execution app
FROM build AS publish
RUN dotnet publish -c Release -o /app/out #
FROM microsoft/dotnet:2.0-runtime AS runtime
WORKDIR /app
COPY --from=publish /app/out ./
ENTRYPOINT [ "dotnet","dotnetapp.dll" ]

保存以上内容,然后打开 VSCode 的终端界面,输入以下命令:

docker build -t dotnetapp .

OK,现在你会看到终端工具上,正在进行建立属于你自己的 Image。由于网络问题,整个过程可能会比较慢,特别是第一次创建。所以趁着这个时间,我们看下 Dockerfile 的配置命令是啥意思。

FROM 命令:指定基础镜像

首先要明确的是,所有的镜像都需要 BaseImage ,可以是任何环境的,如:ubuntu,centOS,ngix等,甚至可以是个空镜像 scratch 。而 FROM 就是指定基础镜像的命令,因此一个 Dockerfile 文件中必需包含 FROM 指令,并且必须是非注释的第一行,这个 Dockerfile 文件才有效。

那么,FROM microsoft/dotnet:2.0-sdk AS build 中的 microsoft/dotnet:2.0-sdk又是什么呢?或许,你已经想到了,这就是那个 BaseImage 。你可能还会奇怪,这个镜像名称这么长,这里我先解释下。microsoft是创建镜像的账号名字,dotnet:2.0-sdk才是镜像的名字,当然这也很长,不过不难理解,它由两部分组成,Name:tag 组成。类似 AppStore 上的某个 App。后面还会介绍它。

COPY 命令:复制文件

COPY 有两种格式:

  • COPY [--chown=<user>:<group>] <src>...,<dest>
  • COPY [--chown=<user>:<group>] ["src",...,"dest"]

COPY指令从构建上下文的目录中 <src> 的文件或目录复制到新的镜像内的 <dest> 指定的路径下。

<src> 可以是多个路径或者符合Go的filepath.Match的通配符,其路径只能是相对,但<dest>可以是绝对路径。例如:

COPY dotnetapp/*.csproj ./dotnetapp
COPY *.html /test/

此外,还需要注意,在执行COPY指令时,拷贝的文件或目录,其权限也会复制过去。所以,如果你需要提升权限,需要增加 Chown参数,例如:

COPY --chown=bin *.dll /app/

RUN指令

该指令也有两种格式:

RUN \<command> (类似在Shell执行命令)
RUN ["executable","param1","param2"](类似调用函数)

RUN 指令执行的结果将会作为新的一层,为下面的构建提供服务。

RUN 指令的 Shell 格式中,可以使用 \ 进行换行,美化文档,方便排查错误,如下所示:

RUN /bin/bash -c 'source $HOME/.bashrc; \
echo $HOME'

ENTRYPOINT

该指令是配置容器启动时运行的命令,且与 RUN 指令一样也有两种格式

ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
ENTRYPOINT command param1 param2 (shell form)

例如配置文件中的 ENTRYPOINT ["dotnet","dotnetapp.dll"] 代码,就是让 容器 在启动时运行刚才的示例程序。

Build

上面还有一个最后命令 docker build -t dotnetapp .,其实很好理解,就是根据刚才创建的 Dockerfile 的创建一个名为 dotnetapp:(latest) 的镜像。也许你会奇怪为啥没指定配置文件,也可以么?是的默认搜寻当前上下文中的 Dockerfile ,当然你也可以使用参数 -f 指定配置文件。

最后,看到这也许 dotnetapp 的镜像已经创建好了,那么小激动的时刻来了,在终端输入以下命令:

docker run --rm -it dotnetapp

OK,你就可以在在终端上看到以下结果:

Hello .NET Core!

最后一个指令,比较容易理解,你可以去官网文档看下(其实是我不想写了)。

其实,我也是刚刚接触 Docker ,所以好多内容不熟悉,写的比较浅显,可能写的不对,也有好多没讲到,所以请大家指正。下篇我会针对 .NET Core 写下如何在 Docker 里做测试,其实也很简单,不妨你自己思考下,先尝试动手写写,咱们下篇文章见。

Docker入门系列01的更多相关文章

  1. Docker入门系列(一):目标和安排

    Docker入门系列(一) 这个系列的教程来源于docker的官方文档,此文档的目的在于一步一步学习docker的使用方法. 这一系列的教程有如下几篇文档: docker安装启动 构建第一个docke ...

  2. [.NET MVC4 入门系列01]Helloworld MVC 4 第一个MVC4程序

    [.NET MVC4 入门系列01]Helloworld MVC 4 第一个MVC4程序   一.练习项目: http://www.asp.net/mvc/tutorials/mvc-4/gettin ...

  3. Docker入门系列之三:如何将dockerfile制作好的镜像发布到Docker hub上

    这个系列的前两篇文章,我们已经把我们的应用成功地在Docker里通过nginx运行了起来,并且用dockerfile里制作好了一个镜像. Docker入门系列之一:在一个Docker容器里运行指定的w ...

  4. Docker入门系列1:简介

    可以实现快速部署. 比如一台 16 核 32G 内存的虚拟机上,需要跑 500+ 个用户的应用(每个应用的功能可以认为是一个网站 + 一系列的 RESTful API),有两个事情很重要: 资源隔离: ...

  5. Docker入门系列3:使用

    入门 首先强烈建议玩一遍官方的入门教程,Interactive commandline tutorial,下面是答案: 查看版本:docker version 搜索Image:docker searc ...

  6. Docker入门系列之五:15个 Docker 命令

    在这篇文章中,我们将学习15个Dockers CLI命令.如果你还不了解Docker,请查看这个系列的其他部分进行学习,Docker概念,生态系统,Dockerfile,Docker镜像. Docke ...

  7. Docker入门系列02

    上篇用一个简单的示例,简单的介绍了 Dockerfile 的配置及其相关的命令.这一篇会在上篇的示例程序里,继续添加新代码及如何将单元测试也放入 Image 建立过程内. 首先,我们需要建一个新的类库 ...

  8. Docker入门系列之二:使用dockerfile制作包含指定web应用的镜像

    实现题目描述的这个需求有很多种办法,作为入门,让我们从最简单的办法开始. 首先使用命令docker ps确保当前没有正在运行的Docker实例. 运行命令docker run -it nginx: 然 ...

  9. Docker入门系列之一:在一个Docker容器里运行指定的web应用

    实现题目描述的这个需求有很多种办法,作为入门,让我们从最简单的办法开始. 首先使用命令docker ps确保当前没有正在运行的Docker实例. 运行命令docker run -it nginx: 然 ...

随机推荐

  1. Python学习---Python下[字典]的学习

    Python中唯一的映射类型(哈希表)       -->Java中的HashMap<K,V> Python对key进行了哈希函数运算,根据计算的结果决定value的存储地址,所以字 ...

  2. 深入理解PHP传参原理(PHP5.2)

    首先说下今天想到的一个问题.在编写php扩展的时候,似乎参数(即传给zend_parse_parameters的变量)是不需要free的.举例: PHP_FUNCTION(test) { char* ...

  3. 3.26-3.31【cf补题+其他】

      计蒜客)翻硬币 //暴力匹配 #include<cstdio> #include<cstring> #define CLR(a, b) memset((a), (b), s ...

  4. 【转】Windows Error Code(windows错误代码详解)

    本文来自: http://blog.sina.com.cn/s/blog_5e45d1be0100i0dr.html http://blog.sina.com.cn/s/blog_5e45d1be01 ...

  5. 第一章 介绍Django

    Django是一个网络开发框架,有了这个框架,能是网站开发更高效有趣,能轻松的创建和维护高质量的网站应用. 这一本书的目的是使读者成为一个Django的专家.主要着重两点.第一,深入的解释Django ...

  6. Centos7 安装eclipse IDE for C++

    1.安装前eclipse需要java, yum -y install java 查看版本java -version 2.下载eclipse IDE http://www.eclipse.org/dow ...

  7. HDU 1281 棋盘游戏 【二分图最大匹配】

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1281 题意概括: 有N*M大的棋盘,要在里面放尽量多的“车”,求最多能放的车的个数,和为了放最多的车有多 ...

  8. SpringBoot初始教程之Servlet、Filter、Listener配置(七)

    1.介绍 通过之前的文章来看,SpringBoot涵盖了很多配置,但是往往一些配置是采用原生的Servlet进行的,但是在SpringBoot中不需要配置web.xml的 因为有可能打包之后是一个ja ...

  9. checkout 提示失败

    事故现场有些时候,当我们使用 git checkout <branchname>命令切换分支的时候,有时会切换失败,然后出现以下的提示信息: 提示信息说的很清楚,当前分支有未跟踪的文件,c ...

  10. Poj2919 Crane

    挑战程序设计竞赛的一道题 最近刚学了三角变换.于是就构造了个矩阵,没想到正是向量旋转的矩阵(不知道具体叫什么qwq 然后网上一半的题解是左闭右开的,另一部分是懒标记的. 于是便自己yy了一个左闭右闭的 ...