升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署
概述
容器,顧名思義是用來(lái)存放并容納東西的器皿;
而容器技術(shù)伴著Docker的興起也漸漸的映入大家的眼簾,它是一個(gè)抽象的概念,同時(shí)也是默默存在世上多年的技術(shù),不僅能使應(yīng)用程序間完全的隔離,而且還能在共享底層系統(tǒng)資源的同時(shí)發(fā)揮它最大的優(yōu)勢(shì)。相比于虛擬機(jī)來(lái)說(shuō),同一服務(wù)器它可以創(chuàng)建出兩倍的實(shí)例,這樣一來(lái),不僅節(jié)省了系統(tǒng)開(kāi)銷,而且利用率和性能也得到了提升,何樂(lè)而不為。最重要的一點(diǎn)是還幫助開(kāi)發(fā)人員實(shí)現(xiàn)了“一次構(gòu)建,到處運(yùn)行”的理想!
那么Docker又是什么呢?
Docker是基于Go語(yǔ)言開(kāi)發(fā)并開(kāi)源的容器引擎
Docker將應(yīng)用軟件運(yùn)行時(shí)所需的一切都打包成互相隔離的容器
Docker可以自動(dòng)執(zhí)行并配置開(kāi)發(fā)/線上環(huán)境,快速構(gòu)建,測(cè)試和運(yùn)行復(fù)雜的多容器應(yīng)用程序
對(duì)擁有數(shù)千個(gè)節(jié)點(diǎn)或容器的應(yīng)用程序,Docker也能快速的擴(kuò)展和調(diào)配
可以運(yùn)行在主流的Linux系統(tǒng),Mac以及Windows上,并且保證無(wú)論軟件在哪里部署,都能正常運(yùn)行并得到相同的結(jié)果
相關(guān)概念介紹
Image鏡像和Container容器:你可以把兩者理解為類和實(shí)例對(duì)象,或者是ISO系統(tǒng)鏡像和虛擬機(jī)的關(guān)系。不同的Image所包含的軟件或者環(huán)境是不同的,但是你可以使用Dockerfile(docker特有語(yǔ)法規(guī)則所創(chuàng)建的文件)進(jìn)行管理。而Container則是以Image作為模板,可以獨(dú)立運(yùn)行的微型系統(tǒng),一個(gè)Image可以創(chuàng)建出來(lái)多個(gè)Container容器的實(shí)例
Registry:Docker Hub鏡像倉(cāng)庫(kù),為每個(gè)人提供龐大的鏡像資源進(jìn)行拉取和使用
Dockerfile:是一個(gè)將鏡像命令組合在一起的文件,用于Image的自動(dòng)構(gòu)建
正文
系統(tǒng)環(huán)境
宿主機(jī):Windows 10 專業(yè)版
Linux服務(wù)器:?Ubuntu 17.04 (GNU/Linux 4.10.0-28-generic x86_64),從16.10版本升級(jí)的,由Hyper-V管理
軟件環(huán)境
開(kāi)發(fā)工具:Visual Studio 2017 15.3(.NET Core 2.0)
遠(yuǎn)程管理工具:Putty,基于SSH,操作簡(jiǎn)單的遠(yuǎn)程命令控制,省得你把命令給敲錯(cuò)咯
SFTP客戶端:WinScp,處理Linux和Windows間的文件傳輸
容器:Docker 17.06.0-CE
一、安裝Docker
a)、設(shè)置Docker倉(cāng)庫(kù)
1、按慣例,首先更新Ubuntu的包索引
$ sudo apt-get update2、讓服務(wù)器可以使用Https更新倉(cāng)庫(kù)
3、添加Docker官方的密鑰對(duì),如果沒(méi)問(wèn)題,會(huì)返回“OK”
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -4、校驗(yàn)密鑰(9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88)是否和官方一致
$ sudo apt-key fingerprint 0EBFCD88
5、設(shè)置官方穩(wěn)定版的倉(cāng)庫(kù)來(lái)源
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"b)、安裝Docker
1、再次更新下包索引,因?yàn)閯偛偶恿薉ocker倉(cāng)庫(kù),確保是否命中了Docker源
$ sudo apt-get update
2、安裝最新版本的Docker-CE社區(qū)版
$ sudo apt-get install docker-ce3、需要安裝其他版本的請(qǐng)使用以下命令
$ sudo apt-get install docker-ce=1.134、查看是否安裝成功
$ docker version
5、試著運(yùn)行一個(gè)測(cè)試鏡像,萬(wàn)能的Hello World!
$ sudo docker run hello-world二、.NetCore的Docker配置
準(zhǔn)備工作:首先記錄接下來(lái)可能會(huì)用到的幾個(gè)常用命令
sudo docker pull microsoft/dotnet//從docker倉(cāng)庫(kù)拉取一個(gè)名稱為“microsoft/dotnet”的鏡像 sudo docker build light ? ?//構(gòu)建一個(gè)名稱為light的容器 sudo docker run hello-world //運(yùn)行hello-world容器 sudo docker images ? ?//查看所有鏡像 sudo docker rmi 63sf86332e ? ?//刪除一個(gè)imageid的鏡像 sudo docker rmi $(docker images -q) //刪除所有鏡像 sudo docker ps -a //查看所有容器 sudo docker rm 6f0c67de4b72 ? ?//刪除一個(gè)containerid的容器 sudo docker rm $(sudo docker ps -a -q) //刪除所有容器
1、拉取dotnet-sdk的最新鏡像,速度慢的話請(qǐng)自行搜索daocloud docker hub加速。
sudo docker pull microsoft/dotnet:latest完成之后查看一下鏡像
sudo docker images2、進(jìn)入到這個(gè)鏡像,查看版本沒(méi)問(wèn)題后創(chuàng)建一個(gè)控制臺(tái)程序,然后運(yùn)行并查看結(jié)果
sudo docker run -it microsoft/dotnet//每次run,都會(huì)重新構(gòu)造出新的互不影響的容器,請(qǐng)自行查看 dotnet --version mkdir test cd test dotnet new dotnet new console dotnet run ? ?
//.NetCore2.0已經(jīng)將dotnet restore變成了隱式命令,需要的時(shí)候會(huì)自動(dòng)執(zhí)行
說(shuō)明:使用Ctrl+D快捷鍵或者鍵入exit命令來(lái)退出命令
三、升級(jí)項(xiàng)目到.NetCore2.0,并發(fā)布
1、分別修改類庫(kù)和Web的項(xiàng)目文件,升級(jí)到.Net Core 2.0和.Net Standard 2.0,其中包括Nuget上的一些組件,或者直接通過(guò)右鍵項(xiàng)目->屬性->目標(biāo)框架進(jìn)行修改,同時(shí)修改Program.cs和Startup.cs文件為2.0默認(rèn)的方式,完成后他們的樣子是醬紫的,是不是很簡(jiǎn)潔明了。
類庫(kù)的csproj項(xiàng)目文件:
<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><TargetFramework>netstandard2.0</TargetFramework></PropertyGroup> </Project>Web的csproj項(xiàng)目文件
<Project Sdk="Microsoft.NET.Sdk.Web"><PropertyGroup><TargetFramework>netcoreapp2.0</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>
簡(jiǎn)潔的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文件的相關(guān)配置項(xiàng)
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(1);
? ? ? ? ? ? });
? ? ? ? ? ? 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?}");
? ? ? ? ? ? });
? ? ? ? }
? ? }
}
微軟官方的升級(jí)向?qū)?#xff0c;供大家參考:https://docs.microsoft.com/en-us/aspnet/core/migration/1x-to-2x/
2、使用cli命令發(fā)布項(xiàng)目,注意指定發(fā)布時(shí)的運(yùn)行時(shí)標(biāo)識(shí)
dotnet publish -r ubuntu.16.10-x64 -c Release -o ../Publish四、使用Docker進(jìn)行部署
1、使用Winscp登陸到服務(wù)器上,并將發(fā)布之后的文件夾publish上傳到服務(wù)器上
2、創(chuàng)建Dockerfile文件,并將其配置成以下內(nèi)容
FROM microsoft/dotnet WORKDIR /app COPY ./publish . ENTRYPOINT ["dotnet", "Light.Web.dll"]3、切換到Dockerfile所在的目錄下,并執(zhí)行構(gòu)建命令,成功之后會(huì)有下圖的提示
sudo docker build -t lightweb . //注意后邊還有一個(gè)點(diǎn)呢4、運(yùn)行剛才構(gòu)建成功,名字為lightweb的容器,直接綁定服務(wù)器的80端口
sudo docker run -p 80:80 -e "ASPNETCORE_URLS=http://+:80" lightweb運(yùn)行成功之后是這樣的(請(qǐng)暫時(shí)忽略Warning),表示該容器內(nèi)的程序正在使用80端口監(jiān)聽(tīng)著.......
5、試著用IP訪問(wèn)一下,不知道自己IP的請(qǐng)使用ifconfig命令進(jìn)行查看
最后
在看到最后一張圖的時(shí)候,其實(shí)自己心里還是挺激動(dòng)的;雖然中間遇到一些差錯(cuò),比如項(xiàng)目文件中的MvcRazorCompileOnPublish節(jié)點(diǎn),發(fā)布成ubuntu時(shí)需要改成false,或者直接刪掉,再者是圖片的名稱后綴是大寫,但是我程序里邊寫的是小寫,發(fā)布之后圖片不顯示,是因?yàn)長(zhǎng)inux是嚴(yán)格區(qū)分大小寫的。囧~另外提醒一下,發(fā)布到IIS上時(shí),請(qǐng)及時(shí)更新AspNetCoreModule模塊為最新的DotNetCore.2.0.0-WindowsHosting.exe。
這里并沒(méi)有介紹.NetCore2.0的相關(guān)知識(shí),想了解的可以移步到張大隊(duì)長(zhǎng)的匯總:.NET Core 2.0 正式發(fā)布信息匯總
相信.NetCore2.0的發(fā)布會(huì)給整個(gè)社區(qū)帶來(lái)不一樣的變化,需要學(xué)習(xí)和積累的技術(shù)也越來(lái)越多,還是那句老話:學(xué)無(wú)止境。
相關(guān)文章:?
.NET Core 2.0 正式發(fā)布信息匯總
.NET Standard 2.0 特性介紹和使用指南
.NET Core 2.0 的dll實(shí)時(shí)更新、https、依賴包變更問(wèn)題及解決
.NET Core 2.0 特性介紹和使用指南
Entity Framework Core 2.0 新特性
原文地址:http://www.cnblogs.com/wangjieguang/p/docker-dotnetcore2.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
總結(jié)
以上是生活随笔為你收集整理的升级项目到.NET Core 2.0,在Linux上安装Docker,并成功部署的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Azure与Scott Guthrie:
- 下一篇: .NET跨平台实践:Linux .Net