前言

    博客园中已经有很多如何在Docker里面运行ASP.NET Core的介绍了。本篇主要介绍一些细节,帮助初学的朋友更加深入地理解如何在Docker中运行ASP.NET Core。


安装Docker

    Docker现支持在主流Linux、Windows和macOS上安装,官方的安装文档请参考docker docs。鉴于国内的网络环境,建议通过国内大厂/高校提供的镜像站快速安装,比如 阿里巴巴开源镜像站,Ubuntu和Centos7上的安装方式如下:


Ubuntu 14.04 16.04 (使用apt-get进行安装)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# step 1: 安装必要的一些系统工具
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安装GPG证书
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg sudo apt-key add -
# Step 3: 写入软件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新并安装 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
 
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# apt-cache madison docker-ce
#   docker-ce | 17.03.1~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
#   docker-ce | 17.03.0~ce-0~ubuntu-xenial | http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial/stable amd64 Packages
# Step 2: 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.1~ce-0~ubuntu-xenial)
# sudo apt-get -y install docker-ce=[VERSION]

CentOS 7 (使用yum进行安装)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3: 更新并安装 Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo systemctl enable docker && systemctl start docker
 
# 注意:
# 官方软件源默认启用了最新的软件,您可以通过编辑软件源的方式获取各个版本的软件包。例如官方并没有将测试版本的软件源置为可用,你可以通过以下方式开启。同理可以开启各种测试版本等。
# vim /etc/yum.repos.d/docker-ce.repo
#   将 [docker-ce-test] 下方的 enabled=0 修改为 enabled=1
#
# 安装指定版本的Docker-CE:
# Step 1: 查找Docker-CE的版本:
# yum list docker-ce.x86_64 --showduplicates | sort -r
#   Loading mirror speeds from cached hostfile
#   Loaded plugins: branch, fastestmirror, langpacks
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            docker-ce-stable
#   docker-ce.x86_64            17.03.1.ce-1.el7.centos            @docker-ce-stable
#   docker-ce.x86_64            17.03.0.ce-1.el7.centos            docker-ce-stable
#   Available Packages
# Step2 : 安装指定版本的Docker-CE: (VERSION 例如上面的 17.03.0.ce.1-1.el7.centos)
# sudo yum -y install docker-ce-[VERSION]

    以下我的实验在Centos7中进行,其他系统基本类似。

安装完成后,可以看到最新Docker版本为18.09(2018年12月27日)


效果0X01

既然Docker安装好了,也正常运行起来了,我们第一件事儿做的就是运行一下Demo,看看是个什么效果,微软将dotnet的Docker镜像都托管在Docker Hub上,我们可以打开Docker Hub的官方网站:https://hub.docker.com 并直接搜索dotnet,找到microsoft/dotnet即可。

根据Wiki提示,我们使用如下命令运行第一个ASP.NET Core的Demo:

1
docker run -it --rm -p 8000:80 --name aspnetcore_sample microsoft/dotnet-samples:aspnetapp

运行后输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@singleCentos7 ~]# docker run -it --rm -p 8000:80 --name aspnetcore_sample microsoft/dotnet-samples:aspnetapp
Unable to find image 'microsoft/dotnet-samples:aspnetapp' locally
aspnetapp: Pulling from microsoft/dotnet-samples
a5a6f2f73cd8: Pull complete 
1e6f560accc2: Pull complete 
8176b77dc10d: Pull complete 
e21dd5015bb0: Pull complete 
10a7ec297783: Pull complete 
52c4b3af04fb: Pull complete 
Digest: sha256:de388b1ced92eadb906f806d0253d93c76cb92b0814798e7441c014b9645a32c
Status: Downloaded newer image for microsoft/dotnet-samples:aspnetapp
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {024f9978-2fea-4d8e-818a-b9a378553244} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.


简单解释一下命令中几个常见的参数:

-it 开启一个交互窗口,也急运行docker后,处于docker的交互式输入输出页面

--rm 当从运行的容器中退出(ctrl+c)时,删除镜像残留信息及数据

-p 端口映射,将宿主机端口映射到容器内端口

--name 给容器起个名字,如不设置该项,容器名称将有docker服务随机设定

最后是镜像的地址以及tag


运行该段命令后:

首先查询宿主机本地是否存在microsoft/dotnet-samples:aspnetapp镜像

如不存在,则从远端拉取镜像

拉取成功后,运行指定命令,将Demo服务运行起来


此时我们在局域网的任意一台电脑浏览器中输入http://[宿主机IP]:8000 即可打开容器运行的demo


效果0X02

看完官方的Demo,接下来我们自制一个DemoV2 。该思路采用将Docker容器转制为镜像的办法,因该方法扩展性不强,不适合重复使用,因此不被推荐,但其中的部分思路非常适合借鉴学习:

1
docker run -it --rm --name dotnet_sdk microsoft/dotnet:sdk

接下来我们在tmp目录下新建一个ASP.NET Core MVC项目,并发布该项目都/app目录下


此时我们进入/app目录后,执行命令,即可看到demo1已经能在容器中正常运行:

1
cd /app && dotnet demo1.dll

接下来我们使用docker commit命令将当期容器转制为镜像,以便于我们重复使用。

首先,新开一个宿主机终端,并在终端中查看当期运行的容器:

1
docker ps

可以发现名称为dotnet_sdk的容器,其容器Id为9bc83a01a0d1,此时执行如下命令:

1
docker commit 9bc83a01a0d1 mydemo:v1

即可将指定容器保存为名称为mydemo的镜像,执行docker images查看:

包含我们demo程序的镜像就已经保存下来了,接下来我们可以直接运行该镜像查看效果:

1
docker run -it --rm -p 8001:80 --name ggg mydemo:v1 sh -c "cd /app && dotnet demo1.dll"

打开浏览器访问效果:


效果0x03

接下来我们用最常见也是最合适的方式制作我们的.NET Core MVC镜像---Dockerfile

如果我们希望在Linux下直接开始.NET Core的代码编写,首先就必须要安装平台相关的.Net Core SDK,安装完成后,才可以使用dotnet 的相关指令创建、编译、发布项目。此时我们可以在Docker下采取更“鸡贼”一些的办法:

首先,我们运行一个.Net Sdk的容器,并进入交互式界面:

1
docker run -it --rm --name dotnet_sdk -v /tmp/src:/tmp/src  microsoft/dotnet:sdk

运行.Net Core最新的SDK,并将宿主机/tmp/src 文件夹挂在到容器/tmp/src下面,而后我们在这个文件夹的文件都不会因容器销毁二丢失。

查看容器中dotnet版本信息,并在容器的/tmp/src文件夹下创建新的ASP.NET Core MVC项目:

1
2
cd /tmp/src
dotnet new mvc -n mydemo


此时可以退出当前容器了,接下来进入的是Docker的打包步骤。

虽然这种做法有点“画蛇添足”,但在某些时刻还是挺有用的,比如系统中存在老版本的.NET Core SDK,安装新版本的SDK可能会产生未知的问题,此时在Docker里面瞎玩,随便搞都没问题,棒呆!


同时有必要再强调一下,Docker从17.05版本开始支持“多阶段构建(multi-stages builds)”,而大多数干净的Linux操作系统在直接使用系统包管理器安装docker时安装的是13.1的版本Docker,是不支持该特性的。

下面介绍的模式是分层结构的构建方式。

在宿主机/tmp/src/mydemo下新建Dockerfile文件,输入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
FROM microsoft/dotnet:2.2-runtime AS base
WORKDIR /app
EXPOSE 80
 
FROM microsoft/dotnet:2.2-sdk AS publish
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app
 
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet""mydemo.dll"]


该脚本一共分3次,第一次定义了基础镜像,并设置/app为基础工作目录,告知外部80为开放端口

第二次,将当期目录下的所有文件发送给Docker服务,执行发布过程,将发布输出到/app文件夹下

第三次,采用第一次的镜像基础作为当期镜像,并将第二次发布输出拷贝到当前基础工作目录/app

最后设置工作入口,当镜像运行时,执行dotnet mydemo.dll

通过docker images命令可以看到刚刚打包出的镜像


接下来我们尝试将镜像运行起来:

1
docker run -it --name mydemo -p 8002:80 mydemo:v1

成功!



这次随笔主要介绍了在Docker里面如何运行一个.NET Core项目的Demo,建议大家在学习Docker时,对如何书写Dockerfile多下点功夫,理解里面的基础命令关键词。


posted @ 2019-01-01 23:32 蜗牛往前走 阅读(3023) 评论(10) 推荐(7) 编辑
摘要: .NET Core相当完善的跨平台特性以及其轻量化的底层接口为我们能顺畅进行微服务开发提供了非常棒的基础。 作为支撑微服务最常见的基础技术——容器化将是本系列的核心内容。 接下来我计划用一个月左右的时间记录我在ASP.NET Core容器化开发中的一部分尝试。文章大概刚要如下: .NET Core容 阅读全文
posted @ 2018-12-23 12:41 蜗牛往前走 阅读(438) 评论(1) 推荐(1) 编辑
摘要: 概述 前一篇文章讲述了最流行的分布式ID生成算法snowflake,本篇文章根据美团点评分布式ID生成系统文章,介绍另一种相对更容易理解和编写的分布式ID生成方式。 实现原理 Leaf这个名字是来自德国哲学家、数学家莱布尼茨的一句话: There are no two identical leave 阅读全文
posted @ 2018-12-18 10:06 蜗牛往前走 阅读(2125) 评论(6) 推荐(6) 编辑
摘要: 概述 "上篇" 文章介绍了3种常见的Id生成算法,本篇主要介绍如何使用C 实现Snowflake。 基础字段 基础方法 C //获取当前时间的Unix时间戳 private long TimeGen() { return DateTimeOffset.UtcNow.ToUnixTimeMillise 阅读全文
posted @ 2018-12-09 16:20 蜗牛往前走 阅读(931) 评论(0) 推荐(1) 编辑
摘要: 概述 本篇文章主要讲述 算法中最出名的 算法。搞.NET开发的,数据库主键最常见的就是int类型的自增主键和GUID类型的uniqueidentifier。 那么为何还要引入snowflake呢? INT自增主键 自增主键是解决主键生成的最简单方案,它有如下优势: 1. 数据库本身负责主键生成,效率 阅读全文
posted @ 2018-12-09 16:18 蜗牛往前走 阅读(1588) 评论(2) 推荐(1) 编辑
摘要: 历史回顾   上一篇博客还是在2016年2月份,当初计划是将自己开发的项目框架总结总结,将框架结构和个人的理解写出来。   但由于进入一家互联网医疗皮包公司(坑死了),从事医疗终端开发,带团队和从事一线客户沟通, 基本算是夭折了。   计划 阅读全文
posted @ 2018-08-11 21:18 蜗牛往前走 阅读(171) 评论(1) 推荐(0) 编辑
摘要: Web框架第三篇--缓存篇 缓存的优劣很大程度上决定了框架的效率,一个有节操的缓存它应该是高效的,利用率高的,具备更多扩展功能的。 一、介绍之前 计算机各个硬件的运行效率是不一样的,CPU>>一级缓存>>二级缓存>>内存>>硬盘。如何提供CPU、一级缓存、二级缓存的使用率是操作系统的课题。我们需要做 阅读全文
posted @ 2016-02-21 16:38 蜗牛往前走 阅读(311) 评论(0) 推荐(0) 编辑
摘要: 框架日志是否有存在的必要性?假如你认为你的框架永远不会出现Bug,或者你能根据错误提示就能还原现场,重现这个问题,那你不需要日志。目前看来这样的项目不存在(Helloworld之类除外)。因此日志框架还是很必要的。 阅读全文
posted @ 2016-01-17 19:43 蜗牛往前走 阅读(347) 评论(0) 推荐(0) 编辑
摘要: 蜗牛历险记(二)之Web框架下的Autofac 阅读全文
posted @ 2016-01-17 18:19 蜗牛往前走 阅读(710) 评论(0) 推荐(0) 编辑
摘要: 有压力,才有动力。如何搭建一个能用的Web平台,真是个不要命的技术活。本篇主要讲述平台搭建过程中涉及的技术概要,后续逐篇介绍技术详情。一、简述 我要完成的是一个Web平台,说它是平台因为:首先它是官网,其次它是微信平台,最后它是线下数据中心。因此它涉及到的技术包括:ASP.NET MVC5,A... 阅读全文
posted @ 2016-01-10 17:17 蜗牛往前走 阅读(379) 评论(1) 推荐(2) 编辑
点击右上角即可分享
微信分享提示
🚀
回顶
收起
  1. 1 404 not found REOL
404 not found - REOL
00:00 / 00:00
An audio error has occurred.