前面我们演示了如何将 Asp.Net Core 程序部署到 iis 和 部署到 windows 服务。其实前面的都是铺垫,如何将 Asp.Net Core 站点部署到 docker 才是这个系列文章的重点。毕竟 .net core 它是跨平台的,能跑在 Linux 下才能体现它的跨平台性。

  一、一分钟了解 Docker    

  Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

简而言之> 容器是一个打包了应用服务的环境,它是一个轻量级的虚拟机,每一个容器由一组特定的应用和必要的依赖库组成。

  Docker和传统虚拟化之间最大的区别在于:容器是在操作系统层面上实现虚拟化,即直接复用本地主机的操作系统;而传统虚拟化则是在硬件层面实现,如VMware vShpere, Xen及Citrix等。

  

  

  Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

  Docker 容器通过 Docker 镜像来创建。

  容器与镜像的关系类似于面向对象编程中的对象与类。  

  Docker的架构如下图所示,Client 通过接口与Server进程通信实现容器的构建,运行和发布。Client和Server可以运行在同一台集群,也可以通过跨主机实现远程通信。

  具体详细内容,请浏览:《几张图帮你理解Docker基本原理及快速入门

  二、安装 Docker

  windows 10 下安装 Docker Desktop for Windows,windows 10 之前的版本安装 Docker Toolbox。由于我当前演示的环境是 windows 8.1,所以下载 Docker Toolbox

Docker Desktop for Windows is available for free.

Requires Microsoft Windows 10 Professional or Enterprise 64-bit. For previous versions get Docker Toolbox.

By downloading this, you agree to the terms of the Docker Software End User License Agreement and the Docker Data Processing Agreement (DPA).

  安装 Docker Toolbox  之前,必须确定开启了硬件虚拟化。windows 8.1如果没有开启,需要去 BIOS 设置开启虚拟化技术。windows 10 网上的介绍是去 控制面板 \ 所有控制面板项 \ 程序和功能 \ 启用或关闭 windows 功能 里勾上 Hyper-v,不过我没试过。

  之后安装过程保持默认设置,但在 Setup-Docker Toolbox 界面下 Select Additional Tasks 中一定记得勾选最后一项(Install VirtualBox with NDIS5 driver[default NDIS6])。

  安装完成后桌面会生成三个快捷方式,分别为:

  1. Docker Quickstart Terminal: 提供Docker的命令行操作
  2. Oracle VM VirtualBox: 虚拟机软件。
  3. Kitematic (Alpha):图形化的docker工具

  在使用Docker前,要先创建docker machine,它其实是台轻量级 linux 内核虚拟机,不过在使用它的时候,你可能根本察觉不出来它是虚拟的。直接双击打开 Docker Quickstart Terminal,它就会自动安装好 docker machine,前提是你要有梯子,不然会卡死在安装 boot2docker.iso 这一步。没梯子的可以参考这里

  三、部署程序

  3.1  添加 Docker 支持

  打开上一篇的项目,右键添加 Docker 支持。

  3.2  编辑 Dockerfile 脚本

  删掉自动生成的 DockerFile 脚本,使用以下脚本:  

#引入镜像,低版本 docker 去掉  AS base
#换成阿里镜像
#FROM registry.cn-chengdu.aliyuncs.com/jimlicatpub/aspnet:3.1-buster-slim AS base
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base #配置工作目录
WORKDIR /app #暴露容器端口,此端口与程序运行路径一致,可
EXPOSE 80 #复制文件到工作目录
COPY . . #ENV :配置系统环境变量,比如程序环境环境等在这里配置(开发、预发、线上环境)
#这里是配置程序运行端口 如果程序不使用默认的80端口这里一定要设置(程序运行端口)
ENV ASPNETCORE_URLS http://+:80 #启动程序
ENTRYPOINT ["dotnet", "Riz.Web.dll"]

  同时修改 DockerFile 输出属性

  3.3 发布程序

  3.4 生成镜像文件

  转到发布后的目录,shift + 右键 - 在此处打开命令 打开命令行,使用以下命令生成镜像。注意后面的 . 不能去掉。

#docker build -t imagename:version .
#版本号可以不写,表示没有版本号(last)
#指令后面有一个"." 不能漏,代表当目前目录的意思
#riz.web 是镜像的名称,可以根据自己需要修改
docker build -t riz.web .

  完成后可查看生成的镜像。这里如果没有翻墙,在拉取 .net core 镜像时可能会卡住。解决方案是使用 docker-mcr 加速镜像,跟着它的说明步骤手动拉取镜像,再运行 docker build 命令Ok。

  3.5 运行镜像

#https://www.runoob.com/docker/docker-run-command.html
#docker run -d -p 2000:80 --name containername imagename:version
#-d 意思是后台运行
#-p: 指定端口映射,格式为:主机(宿主)端口:容器端口。例如配置2000:80就是外网的2000端口映射到docker的80端口
#-name 为容器指定一个名称
#imagename:version 镜像:版本
#注意事项:如果你的服务器是阿里、腾讯、华为云等,配置的端口一定要在安全组配置里打开,比如下面的2000端口,不然访问不了
docker run -d -p 2000:80 --name riz.web riz.web

  如果运行后出现一串ID,则表示运行正常,80为docker容器的端口,映射到本机的端口号位2000。按照园子里的一些介绍文章,容器运行起来就万事大吉了,浏览器里输入 http://localhost:2000/ 就能看到运行效果。可到我这怎么倒腾不行,直接显示 localhost 拒绝了我们的连接请求。难道是因为我的环境是 win8.1,只有 win 10 的 Hyper-v 才能做得到?如果有朋友在 win10 下直接输入 localhost:port 能运行成功,麻烦留言告知,不胜感谢。后来仔细想想,localhost 表示的是本地主机(宿主主机),那么站点的 host 应该是 docker 所在虚拟机的 ip 才对。docker-machine ip default,看到 docker 的 ip 是 192.168.99.100,浏览器里输入 http://192.168.99.100:2000/,运行效果马上出来~~

  

  参考资料:

  1. 官方文档, 《Host ASP.NET Core in Docker containers

  2. Edison Zhou,《.NET Core微服务之ASP.NET Core on Docker

  3. SzeCheng,《几张图帮你理解Docker基本原理及快速入门

  4. 优雅转身,《Windows下部署安装Docker

  

  示例代码托管:https://gitee.com/TANZAME/Demo/tree/master/07.Core/Riz.Web

  技术交流 QQ 群:816425449

windows 下部署 .netcore 到 docker的更多相关文章

  1. windows 下部署 .netcore 到 windows service

    接上一篇 <windows 下部署 .netcore 到 iis>,这一篇记录一下怎么将 Asp.Net Core 以 windows 服务的方式部署. 一.修改代码 其实也很简单,只要调 ...

  2. windows下部署.netcore+docker系列四 (部署程序,重点就要来了)

    前面的都是为这章做准备,加油把骚年们 PS:C# 项目可以按照流程一步步来,java 偶然其他的可以找下其他的网上资源 1.在 VS2019中 添加docker 支持 (其实也就是追加一个Docker ...

  3. windows下部署.netcore+docker系列三 (unbuntu 18.4 下安装ftp)

    // 先更新下系统sudo apt-get update//安装ftpsudo apt-get install vsftpd// 启动 服务sudo service vsftpd start//ftp ...

  4. windows下部署.netcore+docker系列二 (unbuntu 18.4 下 安装 docker)亲测!!!

    1.卸载sudo apt-get remove docker docker-engine docker.io containerd runc2.更新sudo apt-get update3.安装依赖包 ...

  5. windows下部署.netcore+docker系列一(安装linux (ubuntu18.4))

    1 下载 虚拟机和 linux 系统 版本是 ubuntu 链接:https://pan.baidu.com/s/1jTxdysoyOhSWD-Ea-7JIbg 提取码:iiad 2  首先要安装 虚 ...

  6. windows 下部署 .netcore 到 iis

    园子里已经有许多 ASP.NET Core  部署的相关文章,不同环境有不同的配置方法,建议同鞋们在动手之前也看看官方说明,做到心中有数.我在实践的时候用的是 win8.1 + .net core 3 ...

  7. linux centos7 和 windows下 部署 .net core 2.0 web应用

    centos7 下部署asp.net core 2.0应用 安装CentOS7 配置网络[可选] 安装.Net core2.0 创建测试Asp.net Core应用程序 正式部署项目 安装VMware ...

  8. windows 下部署kafka 日记 转

    windows 下部署kafka 日记 转一.下载去apache 的官网(http://kafka.apache.org/downloads.html)下载最新的二进制版的压缩包.目前的最新版本是ka ...

  9. QT程序在windows下部署发布

    转载:http://www.cnblogs.com/Fan_Fan/archive/2010/05/29/1746860.html QT程序在windows下部署发布 以下包括了部分网上收集的,以及q ...

随机推荐

  1. java 面向对象(三十二):泛型一 泛型的理解

    1.泛型的概念所谓泛型,就是允许在定义类.接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型.这个类型参数将在使用时(例如,继承或实现这个接口,用这个类型声明变量.创建对象时确定 ...

  2. Django之 url组件

    本节内容 路由系统 models模型 admin views视图 template模板 路由系统 我们已知,用户从浏览器发出的请求会首先打到django url的路由分发系统这里,然后再到views视 ...

  3. 前端05 /js基础

    前端05 /js基础 昨日内容回顾 css选择器的优先级 行内(1000) > id(100) > 类(10) > 标签(1) > 继承(0) 颜色 rgb(255,255,2 ...

  4. day5:isinstance&代码块&分支&while循环

    1.判断类型 isinstance语法:用法一: isinstance(要判断的值,要判断的类型) 返回True 或者 False用法二: isinstance(要判断的值,(可能的类型1,可能的类型 ...

  5. XML解析---利用XStream解析xml数据及反构造Java对象

    XStream 是一个轻量级的.简单易用的开放源代码 Java库,用于将 Java 对象序列化为 XML 或者再转换回来.而且XStream还能将java对象转成其它格式,比如JSon. 需要用到的包 ...

  6. python 列表的创建以及基本操作

    <python编程从入门到实践> 第三章 列表简介 用"[]"来建立列表,例如:letter = [a,b,c]; 用"[]"来提取列表元素,例如l ...

  7. Python 简明教程 --- 24,Python 文件读写

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 过去的代码都是未经测试的代码. 目录 无论是哪种编程语言,IO 操作都是非常重要的部分.I 即Inp ...

  8. 《Head First 设计模式》:工厂方法模式

    正文 一.定义 工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法让类把实例化推迟到子类. PS:在设计模式中,"实现一个接口"泛指实现某个超类型(可 ...

  9. [jvm] -- 类加载过程篇

    类加载过程 系统加载 Class 类型的文件主要三步 加载 通过全类名获取定义此类的二进制字节流 将字节流所代表的静态存储结构转换为方法区的运行时数据结构 在内存中生成一个代表该类的 Class对象, ...

  10. js原型链结构理解

    在一般的面向对象的语言中,都存在类(class)的概念,类就是对象的模板,对象就是类的实例. 但在js中是没有类的定义的(万物皆是对象).  题外话:但是在ES6中提供了更接近传统语言的写法,引入了C ...