Docker的使用初探(二):Docker与.NET Core的结合
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的结合的更多相关文章
- 第四章 使用Docker镜像和仓库(二)
第四章 使用Docker镜像和仓库(二) 回顾: 开始学习之前,我先pull下来ubuntu和fedora镜像 [#9#cloudsoar@cloudsoar-virtual-machine ~]$s ...
- Docker入门教程(二)命令
Docker入门教程(二)命令 [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第二篇,介绍了Docker的基本命令以及命令的用法和功能. 在Docker ...
- Docker镜像与仓库(二)Dockerfile
Docker镜像文件与仓库(二) Docker镜像文件与仓库(二) Dockerfile指令 Dockerfile格式: 1.#Comment注释2.INSTRUCTION大写的指令名 argumen ...
- Docker快速入门(二)
上篇文章<Docker快速入门(一)>介绍了docker的基本概念和image的相关操作,本篇将进一步介绍image,容器和Dockerfile. 1 image文件 (1)Docker ...
- Docker的使用初探(一):常用指令说明
目录 Docker的使用初探(一):常用指令说明 为什么要用Docker Docker的安装与简单使用 国内镜像加速 常用指令 Docker的使用初探(一):常用指令说明 前几个星期实践的了,再不记录 ...
- Docker操作笔记(二)容器
容器 一.启动容器 启动一个容器有两种方式: 1.基于镜像新键并启动一个容器: 所需要的主要命令为docker run docker run ubuntu:18.04 /bin/echo " ...
- docker学习系列(二):使用Dockerfile创建自己的镜像
dockerfile可以允许我们自己创建镜像,通过编写里面的下载软件命令,执行docker build 即可生成镜像文件. 初尝dockerfile 新建一个目录test,然后进入这个目录,创建一个名 ...
- Docker 基础 - Docker 与前端(二)
一.Docker 系统架构 守护进程 负责容器的创建.运行和监控,还负责镜像的构建和存储.docker demon 命令可启动 Docker 守护进程. Docker 客户端 通过http与 dock ...
- Docker基本命令与使用 —— Docker镜像与仓库(二)
一.查看和删除镜像 1.Docker Image 镜像 容器的基石 层叠的只读文件系统 联合加载(union mount) (存储位置 /var/lib/docker) docker info 2.列 ...
随机推荐
- log4cplus使用(二)-自定义日志等级
log4cplus支持用户自定义日志等级,操作也比较简单,使用之前贴如下宏定义 #define LOG4CPLUS_MACRO_CREASH_LOG_LEVEL(pred) LOG4CPLUS_UNL ...
- 带着新人学springboot的应用09(springboot+异步任务)
本来想说说检索的,不过不知道什么鬼,下载ElasticSearch太慢了,还是放一下,后面有机会再补上!今天就说个简单的东西,来说说任务. 什么叫做任务呢?其实就是类中实现了一个什么功能的方法.常见的 ...
- Chapter 5 Blood Type——3
Disappointment flooded through me as my eyes unerringly focused on his table. 当我的眼睛完全集中在他的桌上时,失望如洪水般 ...
- linux磁盘管理系列二:软RAID的实现
磁盘管理系列 linux磁盘管理系列一:磁盘配额管理 http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_linux_040_quota.html l ...
- spring原理案例-基本项目搭建 01 spring framework 下载 官网下载spring jar包
下载spring http://spring.io/ 最重要是在特征下面的这段话,需要注意: All avaible features and modules are described in the ...
- 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil
基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil,把日常能用到的各种CRUD都进行了简化封装,让普通程序员只需关注业务即可,因为非常简单,故直接贴源代码,大家若需使用可以直 ...
- spring学习(五) ———— 整合web项目(SSM)
一.SSM框架整合 1.1.整合思路 从底层整合起,也就是先整合mybatis与spring,然后在编写springmvc. 1.2.开发需求 查询商品列表(从数据库中查询) 1.3.创建web工程 ...
- C#_asp.net mvc 验证码功能的具体实现
@using (Html.BeginForm("Login", "HomePage",FormMethod.Post)) { <h2>登录</ ...
- [Go] 使用go语言解决现代编程难题
1.计算机一直在演化,64核,128核等等,但是我们依旧在使用为单核设计的技术编程2.Go语言让分享自己的代码包更容易3.Go语言重新思考传统的面向对象,提供了更高效的复用代码手段4.Go不仅提供高性 ...
- 30.C++复习篇
本章学习内容: 1.const 2.指针const 3.inline内联函数 4.函数重载 5.extern “C” 6.new/delete声明与释放 7.namespace命名空间 8.C++中的 ...