升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署
概述
容器,顾名思义是用来存放并容纳东西的器皿;
而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共享底层系统资源的同时发挥它最大的优势。相比于虚拟机来说,同一服务器它可以创建出两倍的实例,这样一来,不仅节省了系统开销,而且利用率和性能也得到了提升,何乐而不为。最重要的一点是还帮助开发人员实现了“一次构建,到处运行”的理想!
那么Docker又是什么呢?
Docker是基于Go语言开发并开源的容器引擎
Docker将应用软件运行时所需的一切都打包成互相隔离的容器
Docker可以自动执行并配置开发/线上环境,快速构建,测试和运行复杂的多容器应用程序
对拥有数千个节点或容器的应用程序,Docker也能快速的扩展和调配
可以运行在主流的Linux系统,Mac以及Windows上,并且保证无论软件在哪里部署,都能正常运行并得到相同的结果
相关概念介绍
Image镜像和Container容器:你可以把两者理解为类和实例对象,或者是ISO系统镜像和虚拟机的关系。不同的Image所包含的软件或者环境是不同的,但是你可以使用Dockerfile(docker特有语法规则所创建的文件)进行管理。而Container则是以Image作为模板,可以独立运行的微型系统,一个Image可以创建出来多个Container容器的实例
Registry:Docker Hub镜像仓库,为每个人提供庞大的镜像资源进行拉取和使用
Dockerfile:是一个将镜像命令组合在一起的文件,用于Image的自动构建
正文
系统环境
宿主机:Windows 10 专业版
Linux服务器: Ubuntu 17.04 (GNU/Linux 4.10.0-28-generic x86_64),从16.10版本升级的,由Hyper-V管理
软件环境
开发工具:Visual Studio 2017 15.3(.NET Core 2.0)
远程管理工具:Putty,基于SSH,操作简单的远程命令控制,省得你把命令给敲错咯
SFTP客户端:WinScp,处理Linux和Windows间的文件传输
容器:Docker 17.06.0-CE
一、安装Docker
a)、设置Docker仓库
1、按惯例,首先更新Ubuntu的包索引
$ sudo apt-get update
2、让服务器可以使用Https更新仓库
$ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
3、添加Docker官方的密钥对,如果没问题,会返回“OK”
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
4、校验密钥(9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88)是否和官方一致
$ sudo apt-key fingerprint 0EBFCD88
5、设置官方稳定版的仓库来源
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
b)、安装Docker
1、再次更新下包索引,因为刚才加了Docker仓库,确保是否命中了Docker源
$ sudo apt-get update
2、安装最新版本的Docker-CE社区版
$ sudo apt-get install docker-ce
3、需要安装其他版本的请使用以下命令
$ sudo apt-get install docker-ce=1.13
4、查看是否安装成功
$ docker version
5、试着运行一个测试镜像,万能的Hello World!
$ sudo docker run hello-world
二、.NetCore的Docker配置
准备工作:首先记录接下来可能会用到的几个常用命令
sudo docker pull microsoft/dotnet //从docker仓库拉取一个名称为“microsoft/dotnet”的镜像 sudo docker build light //构建一个名称为light的容器 sudo docker run hello-world //运行hello-world容器 sudo docker images //查看所有镜像 sudo docker rmi 63sf86332e //删除一个imageid的镜像 sudo docker rmi $(docker images -q) //删除所有镜像 sudo docker ps -a //查看所有容器 sudo docker rm 6f0c67de4b72 //删除一个containerid的容器 sudo docker rm $(sudo docker ps -a -q) //删除所有容器
1、拉取dotnet-sdk的最新镜像,速度慢的话请自行搜索daocloud docker hub加速。
sudo docker pull microsoft/dotnet:latest
完成之后查看一下镜像
sudo docker images
2、进入到这个镜像,查看版本没问题后创建一个控制台程序,然后运行并查看结果
sudo docker run -it microsoft/dotnet //每次run,都会重新构造出新的互不影响的容器,请自行查看 dotnet --version mkdir test cd test dotnet new
dotnet new console dotnet run //.NetCore2.0已经将dotnet restore变成了隐式命令,需要的时候会自动执行
说明:使用Ctrl+D快捷键或者键入exit命令来退出命令
三、升级项目到.NetCore2.0,并发布
1、分别修改类库和Web的项目文件,升级到.Net Core 2.0和.Net Standard 2.0,其中包括Nuget上的一些组件,或者直接通过右键项目->属性->目标框架进行修改,同时修改Program.cs和Startup.cs文件为2.0默认的方式,完成后他们的样子是酱紫的,是不是很简洁明了。
类库的csproj项目文件:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.</TargetFramework>
</PropertyGroup>
</Project>
Web的csproj项目文件
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.</TargetFramework>
<RuntimeIdentifiers>win10-x64;ubuntu.16.10-x64;ubuntu.16.04-x64</RuntimeIdentifiers>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
</PropertyGroup> <ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Session" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.ViewCompilation" Version="2.0.0" PrivateAssets="All" />
</ItemGroup> <ItemGroup>
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="2.0.0" />
</ItemGroup> <ItemGroup>
<ProjectReference Include="..\Light.Common\Light.Common.csproj" />
<ProjectReference Include="..\Light.Model\Light.Model.csproj" />
</ItemGroup> </Project>
简洁的Program.cs
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting; namespace Light.Web
{
public class Program
{
public static void Main(string[] args)
{
BuildWebHost(args).Run();
} public static IWebHost BuildWebHost(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.Build();
}
}
下面是我的Startup文件的相关配置项
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Light.Web.DBContext;
using Microsoft.EntityFrameworkCore;
using Light.Web.Models; namespace Light.Web
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<LightContext>(m =>
{
m.UseSqlServer(Configuration.GetConnectionString("LightContextConnection"));
});
services.AddSession(m =>
{
m.IdleTimeout = TimeSpan.FromHours();
});
services.AddMvc(m =>
{
m.Filters.Add(typeof(LightActionFilter));
m.Filters.Add(new LightExceptionFilter());
});
var serviceProvider = services.BuildServiceProvider();
var dbContext = serviceProvider.GetService<LightContext>();
LightContextSeed.SeedAsync(dbContext).Wait();
} public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
} app.UseStaticFiles();
app.UseSession();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
}
微软官方的升级向导,供大家参考:https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/
2、使用cli命令发布项目,这时可以不用指定运行时标识,直接发布,因为项目不是运行在服务器(Windows或Linux)上的。
dotnet publish -c Release -o ../Publish
四、使用Docker进行部署
1、使用Winscp登陆到服务器上,并将发布之后的文件夹publish上传到服务器上
2、创建Dockerfile文件,并将其配置成以下内容
FROM microsoft/dotnet
WORKDIR /app
COPY ./publish .
ENTRYPOINT ["dotnet", "Light.Web.dll"]
3、切换到Dockerfile所在的目录下,并执行构建命令,成功之后会有下图的提示
sudo docker build -t lightweb . //注意后边还有一个点呢
4、运行刚才构建成功,名字为lightweb的容器,直接绑定服务器的80端口
sudo docker run -p : -e "ASPNETCORE_URLS=http://+:80" lightweb
运行成功之后是这样的(请暂时忽略Warning),表示该容器内的程序正在使用80端口监听着.......
5、试着用IP访问一下,不知道自己IP的请使用ifconfig命令进行查看
最后
在看到最后一张图的时候,其实自己心里还是挺激动的;虽然中间遇到一些差错,比如项目文件中的MvcRazorCompileOnPublish节点,发布成ubuntu时需要改成false,或者直接删掉,再者是图片的名称后缀是大写,但是我程序里边写的是小写,发布之后图片不显示,是因为Linux是严格区分大小写的。囧~另外提醒一下,发布到IIS上时,请及时更新AspNetCoreModule模块为最新的DotNetCore.2.0.0-WindowsHosting.exe。
这里并没有介绍.NetCore2.0的相关知识,想了解的可以移步到张大队长的汇总:.NET Core 2.0 正式发布信息汇总
相信.NetCore2.0的发布会给整个社区带来不一样的变化,需要学习和积累的技术也越来越多,还是那句老话:学无止境。
升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署的更多相关文章
- Linux上安装Docker,并成功部署NET Core 2.0
概述 容器,顾名思义是用来存放并容纳东西的器皿: 而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共 ...
- ASP.NET Core 3.0 : 二十八. 在Docker中的部署以及docker-compose的使用
本文简要说一下ASP.NET Core 在Docker中部署以及docker-compose的使用 (ASP.NET Core 系列目录). 系统环境为CentOS 8 . 打个广告,求职中.. 一 ...
- [争什么! 掺在一起做撒尿牛丸啊! 笨蛋]ASP.NET Core 2.0 + EF6 + Linux +MySql混搭
好消息!特好消息!同时使用ASP.NET Core 2.0和.NET Framework类库还能运行在linux上的方法来啦! 是的,你没有看错!ASP.NET Core 2.0,.NET Frame ...
- 【Asp.Net Core】ASP.NET Core 2.0 + EF6 + Linux +MySql混搭
好消息!特好消息!同时使用ASP.NET Core 2.0和.NET Framework类库还能运行在linux上的方法来啦! 是的,你没有看错!ASP.NET Core 2.0,.NET Frame ...
- redis3.0.5在linux上安装与配置
redis3.0.5在linux上安装与配置 rhel6/ubuntu14 1 下载 # wget http://download.redis.io/releases/redis-3.0.5.tar. ...
- 通过xshell在linux上安装redis3.0.0
通过xshell在linux上安装redis3.0.0 0)首先要安装环境:yum install gcc-c++ 1)通过xftp6将redis安装包上传到linux:解压缩:tar -xvfz r ...
- Linux上安装Hadoop集群(CentOS7+hadoop-2.8.0)--------hadoop环境的搭建
Linux上安装Hadoop集群(CentOS7+hadoop-2.8.0)------https://blog.csdn.net/pucao_cug/article/details/71698903 ...
- [Asp.net core 2.0]Ueditor 图片上传
摘要 在项目中要用到富文本编辑器,包含上传图片,插入视频等功能.但ueditor只有.net版本,没有支持core.那么上传等接口就需要自己实现了. 一个例子 首先去百度ueditor官网下载简化版的 ...
- 关于如何在Linux上使用Nugix反向代理部署net core3.1项目
本文意在教大家如何在Linux上部署net core web项目,本人通过实践已经成功可以通过外网访问我部署在阿里云服务器上的站点. 一:需要用到的东西如下: 1:一个基于net core框架下的we ...
随机推荐
- JS实现全选、不选、反选
思路:1.获取元素.2.用for循环历遍数组,把checkbox的checked设置为true即实现全选,把checkbox的checked设置为false即实现不选.3.通过if判断,如果check ...
- docker中执行sed: can't move '/etc/resolv.conf73UqmG' to '/etc/resolv.conf': Device or resource busy错误的处理原因及方式
错误现象 在docker容器中想要修改/etc/resolv.conf中的namesever,使用sed命令进行执行时遇到错误: / # sed -i 's/192.168.1.1/192.168.1 ...
- 极致精简的webservice例子
看了网上好多关于webservice的例子,基本上对初学者来说都是模棱两可云里雾里,现在,我将网上关于webservice的讲解提炼出来,通过一个最简单使用并且方便的例子,告诉大家什么是webserv ...
- Tornado+MySQL模拟SQL注入
实验环境: python 3.6 + Tornado 4.5 + MySQL 5.7 实验目的: 简单模拟SQL注入,实现非法用户的成功登录 一.搭建环境 1.服务端的tornado主程序app.py ...
- tp5框架的获取器
tp5的获取器功能很强大,一下子就喜欢上了,你可以在模块里任意定义表里不存在的字段,在前台调用很方便.话不多说直接上demo: 1.命名规则 get + 属性名的驼峰命名+ Attr 直接就能在m ...
- (转载)DBCP、C3P0、Proxool 、 BoneCP开源连接池的比较
原文链接: http://blog.csdn.net/miclung/article/details/7231553 简介 使用评价 项目主页 DBCP DBCP是一个依赖Jakarta ...
- VB6之切换桌面
Desktop的API,用于切换或者系统桌面环境.扩展起来可以做一个锁屏程序或者多桌面程序. 模块部分: 'desktop.bas 'too much struct and declare unuse ...
- vijos1057题解
题目: 永恒の灵魂最近得到了面积为n*m的一大块土地(高兴ING^_^),他想在这块土地上建造一所房子,这个房子必须是正方形的. 但是,这块土地并非十全十美,上面有很多不平坦的地方(也可以叫瑕疵).这 ...
- CentOS7 yum安装zabbix3.2.6
前言: 本人小白,在一个多月前通过面试进入公司,在进入公司的第一天,老板把我叫到他办公室,坐下来慢慢喝茶,吹牛,给我吹他们以前做的软件,经营的产品,还装作一副什么都告诉我的样子,其实这都是套路,我早已 ...
- Android Project和app中两个build.gradle配置的区别
Android 开发也挺长时间了,从开始就使用的AndroidStudio开发,但是说下来其实自己对AS(AndroidStudio简称)还真的是不了解不深入.好吧,其实我只知道AS是一个相当强大的工 ...