.NET Core容器化开发系列(一)——Docker里面跑个.NET Core

前言

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


640?wx_fmt=png

安装Docker

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


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


# 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进行安装)


# 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日)

640?wx_fmt=png


效果0X01

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

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


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

运行后输出:


[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

640?wx_fmt=png


效果0X02

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

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

640?wx_fmt=png

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

640?wx_fmt=png


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

1
cd /app && dotnet demo1.dll

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

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

1
docker ps

640?wx_fmt=png

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

1
docker commit 9bc83a01a0d1 mydemo:v1

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

640?wx_fmt=jpeg

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


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

640?wx_fmt=png

打开浏览器访问效果:

640?wx_fmt=png


效果0x03

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

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

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


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

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

640?wx_fmt=jpeg

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


cd /tmp/src
dotnet new mvc -n mydemo

640?wx_fmt=png


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

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


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

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

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


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

640?wx_fmt=png

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

640?wx_fmt=jpeg


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

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

640?wx_fmt=png

640?wx_fmt=png

成功!

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

相关文章:

  • 搭建基于Docker社区版的Kubernetes本地集群

  • Docker最全教程——从理论到实战(一)

  • Docker最全教程——从理论到实战(二)

  • Docker最全教程——从理论到实战(三)

  • Docker最全教程——从理论到实战(四)

  • Docker最全教程——从理论到实战(五)

  • Docker最全教程——从理论到实战(六)

  • Docker最全教程——从理论到实战(七)

  • Docker最全教程——从理论到实战(八)    

  • Docker最全教程——从理论到实战(九)

  • Asp.Net Core + Docker 搭建

  • dotnet core调试docker下生成的dump文件

  • 为什么是容器,Docker和Kubernetes?

  • 把ABP框架部署到Docker中

  • 实战中的asp.net core结合Consul集群&Docker实现服务治理

原文地址:https://www.cnblogs.com/leafly/p/10188159.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318059.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YBTOJ:卖猪问题(网络流)

文章目录题目描述数据范围解析代码题目描述 尼克在一家养猪场工作,这家养猪场共有MMM间锁起来的猪舍,由于猪舍的钥匙都给了客户,所以尼克没有办法打开这些猪舍。有NNN个客户从早上开始一个接一个来购买生猪,他们到达后首先用手中…

P4370-[Code+#4]组合数问题2【数学,堆】

正题 题目链接:https://www.luogu.com.cn/problem/P4370 题目大意 求满足m≤n≤am\leq n\leq am≤n≤a的情况下,前kkk大的(nm)\binom{n}{m}(mn​)的和。 1≤n≤106,1≤k≤1051\leq n\leq 10^6,1\leq k\leq 10^51≤n≤106,1≤k≤105 解题思路 首先想到的是(nm)>…

【做题记录】[SCOI2009]围豆豆

[SCOI2009]围豆豆 \(n\times m(n,m\le 10)\) 的网格中有 \(d\) 个球 \((d\le 9)\),要求在网格中选定一个起点开始做一个欧拉回路,路径的价值为路径完全包住的球的价值之和减去路径长度,求所有路径中的价值最大值。 有价值与步数的两个限制&am…

Codeforces Round #695(Div. 2)

Codeforces Round #695 (Div. 2) 1467A Wizard of Orz 1467B Hills And Valleys 1467C Three Bags 1467D Sum of Paths 1467E Distinctive Roots in a Tree 1468A LaIS

YBTOJ危桥通行洛谷P3163:危桥通行(网络流)

文章目录题目描述解析代码题目描述 Alice 和 Bob 居住在一个由 NN 座岛屿组成的国家,岛屿被编号为 00 到 N-1N−1。某些岛屿之间有桥相连,桥上的道路是双向的,但一次只能供一人通行。其中一些桥由于年久失修成为危桥,最多只能通行…

中小研发团队架构实践之生产环境诊断工具WinDbg

生产环境偶尔会出现一些异常问题,WinDbg或GDB是解决此类问题的利器。调试工具WinDbg如同医生的听诊器,是系统生病时做问题诊断的逆向分析工具,Dump文件类似于飞机的黑匣子,记录着生产环境程序运行的状态。本文主要介绍了调试工具W…

多项式的基础操作(逆元/除法/取模/对数ln/开根sqrt/指数exp/快速幂)带模板+luogu全套例题

文章目录多项式的逆元理论推导模板例题:[luogu P4238]【模板】多项式乘法逆题目code多项式的除法/取模理论推导多项式牛顿迭代法模板例题:[luoguP4512]【模板】多项式除法题目code多项式对数ln理论推导模板例题题目code多项式开根sqrt理论推导模板例题题…

P1232-[NOI2013]树的计数【思维】

正题 题目链接:https://www.luogu.com.cn/problem/P1232 题目大意 给出nnn个点的树的dfsdfsdfs序和bfsbfsbfs序,求所有合法的树的平均深度。 1≤n≤21051\leq n\leq 2\times 10^51≤n≤2105 解题思路 bfsbfsbfs应该是最好开始考虑的,因为bfsbfsbfs序的…

Wizard of Orz CodeForces - 1467A

Wizard of Orz CodeForces - 1467A 题意: 有个长度为n初始状态下各元素均为0的数组,没过一秒数组中所有元素都会1,如果是9则会变成0,即0-9不断循环。现在你能够在开始后的任意时间点选取任意一个位置,改位置上的数字…

从软件工程的角度解读任正非的新年公开信

昨天被任正非的那封《全面提升软件工程能力与实践,打造可信的高质量产品》的公开信刷屏了,作为一个软件工程专业科班出身的软件开发从业者,自然是引起了我(宝玉xp)的好奇,仔细阅读之下确实让我大吃一惊&…

YBTOJ:矛盾指数(网络流-最大权闭合图)

文章目录题目描述解析代码网络流要大胆建图 题目描述 公司内部共nnn个员工,员工之间可能有矛盾。若员工uuu和员工vvv有矛盾,用边(u,v)(u,v)(u,v)表示,共mmm个矛盾。 现在公司决定裁员,使得被裁人员间的矛盾指数最高。矛盾指数定…

行列式、LGV、矩阵树学习笔记

前置知识:矩阵、高斯消元 行列式 行列式定义 \[\text{det(A)}\sum_{p}{(-1)^{\mathrm{sgn}(p)}\prod{A_{i,p_i}}} \]其中 \(\text{sgn}(p)\) 表示排列 \(p\) 的逆序对个数。 行列式性质 进行一次矩阵转职,行列式不变。(易证)行列式任意一行按比例扩大&am…

P5008-[yLOI2018]锦鲤抄【tarjan】

正题 题目链接:https://www.luogu.com.cn/problem/P5008 题目大意 给出nnn个点mmm条边的一张有向无环图,你每次可以选择一个有入度的点获取其点权然后删除这个点。求能取kkk次的情况下最大能获得的权值和。 1≤n≤51054,1≤m≤210641\leq n\leq 5\times 10^54,1\l…

Hills And Valleys CodeForces - 1467B

Hills And Valleys CodeForces - 1467B 题意: 修改数列中的 一个 数字 使得峰(波峰、波谷)的数量最少 题解: 修改一个数,最多只能影响左右两个数,所能减少的峰的数量为1,2,3三种 分类讨论,对于当前位置…

HttpClient在.NET Core中的正确打开方式

问题来源长期以来,.NET开发者都通过下面的方式发送http请求:using (var httpClient new HttpClient()){var response await httpClient.GetAsync(uri);//do something with response}这段代码理论上来说遵守了C#的最佳实践,HttpClient是IDi…

YBTOJ:炮塔攻击(网络流)

题目描述 小明最近在玩一款很好玩的游戏,游戏规则是这样的: 有一个n∗mn*mn∗m的地图,地图上的每一个位置要么是空地,要么是炮塔,要么是一些敌人,小明需要操纵炮塔攻击敌人。 攻击方法是:对于…

[CQOI]九连环(FFT优化+高精)

文章目录题目题解code题目 九连环是一种源于中国的传统智力游戏。 如图所示,九个的圆环套在一把“剑”上,并且互相牵连。游戏的目标是把九个圆环全部从“剑”上卸下。 圆环的装卸需要遵守两个规则 1.第一个(最右边)环…

牛客挑战赛53G-同源数组(Easy Version)【NTT】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11193/G 题目大意 给出nnn个长度为mmm的数组,然后你每次可以进行差分(不会改变数组长度那种)和前缀和。 如果两个数组可以在模998244353998244353998244353意义下操作成同一个数组&…

莫比乌斯反演 做题记录

来自Peterwuyihong 的题单。 前置知识 前置芝士1 数论分块 UVA11526 H(n) P2261 [CQOI2007]余数求和 P2260 [清华集训2012]模积和 其中有一个式子需要注意一下:\[\sum_{i1}^n\sum_{j1}^m\left\lfloor\dfrac{n}{i}\right\rfloor\left\lfloor\dfrac{m}{i}\right\rfloo…

Three Bags CodeForces - 1467C

题意: 三堆石子,你可以取两堆石子各一个石头a,b。然后消掉a,使得bb-a再放入b的那一堆。这样操作直到只剩下一个石子,求该石子价值最大。 题解: 构造题 可以构造出两者情况: 其中两堆都是正的&#xff0…