.NET Core容器化开发系列(一)——Docker里面跑个.NET Core
前言
博客园中已经有很多如何在Docker里面运行ASP.NET Core的介绍了。本篇主要介绍一些细节,帮助初学的朋友更加深入地理解如何在Docker中运行ASP.NET Core。

安装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日)

效果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

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

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

此时我们进入/app目录后,执行命令,即可看到demo1已经能在容器中正常运行:
cd /app && dotnet demo1.dll
接下来我们使用docker commit命令将当期容器转制为镜像,以便于我们重复使用。
首先,新开一个宿主机终端,并在终端中查看当期运行的容器:
docker ps

可以发现名称为dotnet_sdk的容器,其容器Id为9bc83a01a0d1,此时执行如下命令:
docker commit 9bc83a01a0d1 mydemo:v1
即可将指定容器保存为名称为mydemo的镜像,执行docker images查看:

包含我们demo程序的镜像就已经保存下来了,接下来我们可以直接运行该镜像查看效果:
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的容器,并进入交互式界面:
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项目:
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文件,输入以下内容:
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命令可以看到刚刚打包出的镜像

接下来我们尝试将镜像运行起来:
docker run -it --name mydemo -p 8002:80 mydemo:v1


成功!
这次随笔主要介绍了在Docker里面如何运行一个.NET Core项目的Demo,建议大家在学习Docker时,对如何书写Dockerfile多下点功夫,理解里面的基础命令关键词。
.NET Core容器化开发系列(一)——Docker里面跑个.NET Core的更多相关文章
- .NET Core容器化开发系列(零)——计划
.NET Core相当完善的跨平台特性以及其轻量化的底层接口为我们能顺畅进行微服务开发提供了非常棒的基础. 作为支撑微服务最常见的基础技术--容器化将是本系列的核心内容. 接下来我计划用一个月左右的时 ...
- 循序渐进学.Net Core Web Api开发系列【3】:WebApi开发概览
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 目前我们已 ...
- 使用react全家桶制作博客后台管理系统 网站PWA升级 移动端常见问题处理 循序渐进学.Net Core Web Api开发系列【4】:前端访问WebApi [Abp 源码分析]四、模块配置 [Abp 源码分析]三、依赖注入
使用react全家桶制作博客后台管理系统 前面的话 笔者在做一个完整的博客上线项目,包括前台.后台.后端接口和服务器配置.本文将详细介绍使用react全家桶制作的博客后台管理系统 概述 该项目是基 ...
- C#设计模式总结 C#设计模式(22)——访问者模式(Vistor Pattern) C#设计模式总结 .NET Core launch.json 简介 利用Bootstrap Paginator插件和knockout.js完成分页功能 图片在线裁剪和图片上传总结 循序渐进学.Net Core Web Api开发系列【2】:利用Swagger调试WebApi
C#设计模式总结 一. 设计原则 使用设计模式的根本原因是适应变化,提高代码复用率,使软件更具有可维护性和可扩展性.并且,在进行设计的时候,也需要遵循以下几个原则:单一职责原则.开放封闭原则.里氏代替 ...
- .NET Core容器化之多容器应用部署@Docker-Compose
1.引言 紧接上篇.NET Core容器化@Docker,这一节我们先来介绍如何使用Nginx来完成.NET Core应用的反向代理,然后再介绍多容器应用的部署问题. 2. Why Need Ngin ...
- .NET Core多平台开发体验[4]: Docker
对于一个 .NET开发人员,你可能没有使用过Docker,但是你不可能没有听说过Docker.Docker是Github上最受欢迎的开源项目之一,它号称要成为所有云应用的基石,并把互联网升级到下一代. ...
- 循序渐进学.Net Core Web Api开发系列【13】:中间件(Middleware)
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如 ...
- 循序渐进学.Net Core Web Api开发系列【11】:依赖注入
系列目录 循序渐进学.Net Core Web Api开发系列目录 本系列涉及到的源码下载地址:https://github.com/seabluescn/Blog_WebApi 一.概述 本篇介绍如 ...
- .NET Core容器化之多容器应用部署-使用Docker-Compose
原文补充: -- docker-compose.ymlversion: ' services: mvc-web: container_name: mvc.web.compose build: . re ...
随机推荐
- jQuery Validate 介绍
jQuery Validate jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方 ...
- MySQL SELECT语句中只能输出1000行数据的原因
同事反映,客户的一套MySQL生产库,执行SELECT.. INTO OUTFILE语句只能导出1000行 最初以为是系统参数被重新设置了,建议他更改系统参数 mysql> set global ...
- WinThruster清理电脑注册表
电脑因为安装卸载各种软件,长时间工作,越来越卡慢,很大程度上和电脑中一些老旧不用的注册表有关,一些遗留问题也成为隐患. 今天我们主要来讲一下一些不用,没用的注册表清理问题. 无意间在网上看了一个软件, ...
- 【2017下集美大学软工1412班_助教博客】团队作业3——需求改进&系统设计团队成绩公示
作业要求 团队作业3--需求改进&系统设计 团队评分结果 Total QH BZ GJ MS SXX WBS SJ JG SJK JH NR CS PHILOSOPHER 需求改进&系 ...
- Docker 基础 - Docker 与前端(二)
一.Docker 系统架构 守护进程 负责容器的创建.运行和监控,还负责镜像的构建和存储.docker demon 命令可启动 Docker 守护进程. Docker 客户端 通过http与 dock ...
- windows下的MySql实现读写分离
MySql读写分离 1.删除系统服务 sc delete 服务名 2.复制安装好的3380文件夹到3381 3.进入3381\logs目录下将所有文件删除 4.进入3381\data目录,将所有的lo ...
- 利用gulp 插件gulp.spritesmith 完成小图合成精灵图,并自动输出样式文件
安装依赖 yarn add gulp yarn add gulp.spritesmith 本次依赖的版本是: "gulp": "^3.9.1" "gu ...
- 2017-2018-2 20165318 实验四《Android程序设计》实验报告
2017-2018-2 20165318 实验四<Android程序设计>实验报告 一.实验报告封面 课程:Java程序设计 班级:1653班 姓名:孙晓暄 ...
- javascript:void(0)的问题
最近看了好几个关于<a>标签和javascript:void(0)的帖子,谨记于此,以资查阅. 注:以下代码未经全面测试,但每一种方法可能会出现的情况都基本做了说明. 在做页面时,如果想做 ...
- Qt Creator无法debug,报错:The selected debugger may be inappropriate for the inferior. Examining symbols and setting breakpoints by file name and line number may fail. The inferior is in the Portable ...
看到这个报错我是绝望的 解决:下载windows sdk win10 sdk 只安装Debugging Tools for Windows 打开 工具-选项-Kits 安装sdk成功后我们可以看到 ...