Docker的使用初探(二):Docker与.NET Core的结合

在二者的结合上,微软官方给予了很大的支持,从官方发布的一些文章和VS 2017在建立.NET Core项目时自带的Docker选项都可以看出来,这也与Core的跨平台特性有很大的关系,而Docker正是可以选择以Linux或Windows环境部署

添加Dockefile

上一篇文章介绍了如何拉取Core的官方镜像,但是我们终究要将Docker应用到我们的开发环境中,如何将我们自己的项目生成为镜像并部署到Docker上呢?第一步就添加Dockerfile这个文件,在VS2017中大致是三种方法,它们稍有区别,但最终也都是建立了一个Dockerfile文件

1. 在创建项目时添加

在新建Core项目时,勾选“启用Docker支持”选项,新建的项目会自动添加dockerfile文件,文件的具体内容在下文进行分析

2. 手动添加

已经在使用的项目可以通过“右键-添加-Docker支持”,这样也可以新建Dockerfile文件

3. 容器业务流程协调控制程序支持

这种方法相对于前两种比较特殊,它不再是单单增加一个Dockerfile文件,而是如名称一般是一整条生产链,用于配合持续集成工具的开发-调试-生成-发布一条龙服务。添加的方式与第二种相同,右键项目添加就能看到这个拗口的名字

使用这种方式除了生成Dockerfile文件还会在解决方案中添加一个名为Docker Compose的业务流程协调程序,在新建时可以选择,但是默认自带的只有这个。里面包含两个文件,一个是 .dockerignore 这个和git类似,里面记录的文件不会被打包成镜像发布,另一个是 docker-compose.yml ,用于配置这个业务流程的信息,如镜像名称和Dockerfile文件的路径等

Dockefile语法

大概是有以下这些,挑几个用到的说一下

FROM
MAINTAINER
RUN
CMD
EXPOSE
ENV
ADD
COPY
ENTRYPOINT
VOLUME
USER
WORKDIR
ONBUILD
  • FROM

FROM <image>

说明使用的镜像,如果本地没有会自动拉取对应名称的镜像,没有指定标签的情况默认就是latest

FORM指令是Dockerfile文件的第一行,但可以不唯一,根据需要可以有多个

以默认的Core项目为例,这里拉取的就是Core的官方镜像,上篇文章也有用到,分别是运行时和SDK

  • WORKDIR

WORKDIR <工作目录路径>

显而易见就是镜像被安装的路径,如果路径不存在,Docker会自动创建

  • COPY

COPY <源路径> <目标路径>

将文件和目录复制到容器的文件系统。文件和目录需位于相对于 Dockerfile 的路径中。

  • RUN

RUN <Shell/exec>

在当前镜像上要执行的命令,可以使用shell或者exec的格式

  • EXPOSE

EXPOSE <端口>

服务端容器对外映射的本地端口

  • ENTRYPOINT

使用格式 RUN 一样,但是这个命令是在容器启动后执行的命令,不会被 RUN 命令覆盖,一个Dockerfile里面只能有一个,如果有多个则只执行最后一条

其余的指令还没怎么用到,用法还不太清楚

Docker项目调试

我们在前面提到了三种创建Dockerfile文件的方法,实际上是两种情况,针对这两种情况,打包镜像的方法也不同

仅添加文件的方式

使用 docker build -t <name> <path> 指令。这种情况更加泛用,无论是不是用VS创建的都可以使用这种指令打包镜像

进入Dockerfile文件所在的路径后执行命令即可

为了演示,我先删除的core的官方sdk,由于在Dockerfile里面我们写入了使用了 FROM 命令,所以执行命令后我们发现Docker自动下载了镜像,并且打包了我们的项目,但是最后有一句 image operating system "windows" cannot be used on this platform ,因为我这边Docker使用的是Linux模式,这里我们构建的是Windows的容器镜像,所以需要切换一下,系统右下角托盘图标右键“switch to ...”,

为了体现Dockerfile指令的效果,我们删除之前创建的镜像再执行一次Build指令,这次Docker没有下载Core的sdk,因为之前已经下载过了。不过我在这里遇到了网络问题,发现之前的镜像拉取也失败了,所以换了一个镜像加速地址,然后简化了一下dockerfile文件,然后重复上面的操作就行了

FROM microsoft/dotnet:2.1-aspnetcore-runtime
WORKDIR /app
COPY . .
EXPOSE 80
ENTRYPOINT ["dotnet", "CoreDockerDemo1.dll"]

可以看到dockerfile里面的指令被依次执行,完成之后我们使用 docker image ls 就可以看到我们构建的镜像了,之后用上面的方法可以创建Docker即可

容器业务流程协调控制程序支持

使用这种方式就不需要自己手动构建了,只要在VS里的调试按钮点一下即可。由于我们前面添加过这套协调控制程序,所以现在这个项目里可以直接选择docker进行调试

在这之前要对 docker-compose.yml 文件进行配置,基本上与dockerfile类似,而且更加直观,对应输入名称等就好了

我在第一次生成时出现了“未启用卷共享”的错误,这里我们需要在Docker的设置中的Shared Drives标签中把程序生成构建的磁盘选中,然后点击“Apply”按钮应用设置,然后docker会自动重启

设置完成后再点击VS中的运行,web应用就会自动编译生成并创建镜像和容器,然后启动网站。第一次启动时可能会询问是否授权SSL证书,进行授权即可


基本上有了这些,就可以利用Docker给开发工作带来一些便捷,如果后面还要继续深入的话,就是将Docker与持续集成结合起来应用到网站服务器环境上

Docker的使用初探(二):Docker与.NET Core的结合的更多相关文章

  1. 第四章 使用Docker镜像和仓库(二)

    第四章 使用Docker镜像和仓库(二) 回顾: 开始学习之前,我先pull下来ubuntu和fedora镜像 [#9#cloudsoar@cloudsoar-virtual-machine ~]$s ...

  2. Docker入门教程(二)命令

    Docker入门教程(二)命令 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第二篇,介绍了Docker的基本命令以及命令的用法和功能. 在Docker ...

  3. Docker镜像与仓库(二)Dockerfile

    Docker镜像文件与仓库(二) Docker镜像文件与仓库(二) Dockerfile指令 Dockerfile格式: 1.#Comment注释2.INSTRUCTION大写的指令名 argumen ...

  4. Docker快速入门(二)

    上篇文章<Docker快速入门(一)>介绍了docker的基本概念和image的相关操作,本篇将进一步介绍image,容器和Dockerfile. 1 image文件 (1)Docker ...

  5. Docker的使用初探(一):常用指令说明

    目录 Docker的使用初探(一):常用指令说明 为什么要用Docker Docker的安装与简单使用 国内镜像加速 常用指令 Docker的使用初探(一):常用指令说明 前几个星期实践的了,再不记录 ...

  6. Docker操作笔记(二)容器

    容器 一.启动容器 启动一个容器有两种方式: 1.基于镜像新键并启动一个容器: 所需要的主要命令为docker run docker run ubuntu:18.04 /bin/echo " ...

  7. docker学习系列(二):使用Dockerfile创建自己的镜像

    dockerfile可以允许我们自己创建镜像,通过编写里面的下载软件命令,执行docker build 即可生成镜像文件. 初尝dockerfile 新建一个目录test,然后进入这个目录,创建一个名 ...

  8. Docker 基础 - Docker 与前端(二)

    一.Docker 系统架构 守护进程 负责容器的创建.运行和监控,还负责镜像的构建和存储.docker demon 命令可启动 Docker 守护进程. Docker 客户端 通过http与 dock ...

  9. Docker基本命令与使用 —— Docker镜像与仓库(二)

    一.查看和删除镜像 1.Docker Image 镜像 容器的基石 层叠的只读文件系统 联合加载(union mount) (存储位置 /var/lib/docker) docker info 2.列 ...

随机推荐

  1. 服务器Windows 2008R2 C盘清理

    今天因为连服务器的时间慢了很多,然后看了一下C盘的空间,OMG剩下222K.然后一直上网找解决方案. 按照惯例,应该开一个360看看,C盘清理啊,搬家什么的.360告知的竟然是没有可以搬移的,所以,这 ...

  2. RabbitMQ学习笔记(二) 工作队列

    什么是工作队列? 工作队列(又名任务队列)是RabbitMQ提供的一种消息分发机制.当一个Consumer实例正在进行资源密集任务的时候,后续的消息处理都需要等待这个实例完成正在执行的任务,这样就导致 ...

  3. Web Api Self-Host

    今天有在研究SignalR, 发现SignalR可以使用Self-Host的方式,就突发奇想,Web Api是不是也可以使用Self-Host的方式寄宿在Console Application或者其他 ...

  4. asp.net core 系列 20 EF基于数据模型创建数据库

    一.概述 本章使用 Entity Framework Core 构建执行基本数据访问的 ASP.NET Core MVC 应用程序.使用迁移(migrations)基于数据模型创建数据库,是一种cod ...

  5. AngularJS7那些不得不说的事故

    题外话   最近简直要忙死,所以停更了很久,你们会不会以为我人间蒸发了?   正文之前,请允许我先跑个题,就是关于忙的问题.   做了Freelance,每天过的比上班还累,这完全不是我想要的生活啊? ...

  6. DocX开源WORD操作组件的学习系列二

    DocX学习系列 DocX开源WORD操作组件的学习系列一 : http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_sharp_001_docx1.htm ...

  7. springboot情操陶冶-初识springboot

    前言:springboot由于其轻便和去配置化等的特性已经被广泛应用,基于时代潮流以及不被鄙视,笔者于是开辟此篇开始认识springboot 前话 springboot是基于spring而开发的轻量级 ...

  8. CAN总线学习记录之一:CAN简介

    CAN 是 Controller Area Net 的缩写,即控制器局部网,是一种有效支持分布控制或实时控制的串行通信网络.CAN 是德国 Bosch 公司为汽车的监测.控制系统而设计的,如控制发动机 ...

  9. 变量内容的删除、取代与替换 (Optional)

    变量除了可以直接设置来修改原本的内容之外,有没有办法通过简单的动作来将变量的内容进行微调呢? 举例来说,进行变量内容的删除.取代与替换等!是可以的!我们可以通过几个简单的小步骤来进行变量内容的微调喔! ...

  10. C# /VB.NET操作Word批注(一)—— 插入、修改、删除Word批注

    批注内容可以是对某段文字或内容的注释,也可以是对文段中心思想的概括提要,或者是对文章内容的评判.疑问,以及在阅读时给自己或他人起到提示作用.本篇文章中将介绍如何在C#中操作Word批注,主要包含以下要 ...