zoukankan      html  css  js  c++  java
  • Linux 上安装Docker 并部署netcor2.1

    容器,顾名思义是用来存放并容纳东西的器皿;

    而容器技术伴着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.0</TargetFramework>
      </PropertyGroup>
    </Project>

    Web的csproj项目文件

    复制代码
    <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.CommonLight.Common.csproj" /> <ProjectReference Include="..Light.ModelLight.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(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?}");
                });
            }
        }
    }
    复制代码

    微软官方的升级向导,供大家参考: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 80:80 -e "ASPNETCORE_URLS=http://+:80" lightweb

    运行成功之后是这样的(请暂时忽略Warning),表示该容器内的程序正在使用80端口监听着.......

    5、试着用IP访问一下,不知道自己IP的请使用ifconfig命令进行查看

    最后

    在看到最后一张图的时候,其实自己心里还是挺激动的;虽然中间遇到一些差错,比如项目文件中的MvcRazorCompileOnPublish节点,发布成ubuntu时需要改成false,或者直接删掉,再者是图片的名称后缀是大写,但是我程序里边写的是小写,发布之后图片不显示,是因为Linux是严格区分大小写的。囧~另外提醒一下,发布到IIS上时,请及时更新AspNetCoreModule模块为最新的DotNetCore.2.0.0-WindowsHosting.exe

  • 相关阅读:
    Caused by: java.lang.UnsatisfiedLinkError: Couldn't load 。。。。
    final,finally,finalize
    Java位运算总结:位运算用途广泛《转》
    Ext.Ajax.request同步请求
    xstream 别名的用法<转>
    MySQL 获得当前日期时间(以及时间的转换)
    关于用xercesImpl包解析xml文件遇中文报错问题
    kafka java示例
    varnish、squid、apache、nginx缓存的对比<转>
    websphere性能设置和日常维护
  • 原文地址:https://www.cnblogs.com/Zouzhe/p/10058044.html
Copyright © 2011-2022 走看看