zoukankan      html  css  js  c++  java
  • 【Step By Step】将Dotnet Core部署到Docker上

    本教程的前提是,你已经在Linux服务器上已经成功的安装了Docker,我会大概介绍在此过程中用到的Docker命令,并不会介绍所有的Docker命令(因为我也不会)。

    一、在Docker中运行Dotnet Core Hello World

    微软官方提供了已经集成好Dotnet Core运行所需环境的Docker Image,我们可以直接使用命令:

    docker run -it microsoft/dotnet:latest

    其中

    -i :交互模式 (so we can interact with it)

    -t :  分配一个(伪)tty (link is external

    microsoft/dotnet:这是微软提供的Docker Core的官方Image名称,

    latest :表示我们使用这个版本的Image

    通过上面的命令,我们就创建了一个Docker Container,并且启动它。

    其实Docker Run,他是分了三步走的:

      • 查看本地是否有我们所需要启动的镜像,没有的话,尝试去服务器获取
      • 创建一个容器,对应的Docker命令:
    docker create -it microsoft/dotnet:latest

    如果创建成功了,则会输出一个容器的ID,我们也可以通过docker ps来查看

      • 启动容器,对应的Docker命令
    docker start  -a -i 容器ID

    这时候,我们就把最基本的容器启动起来了,在容器中,就可以执行一些Dotnet Core的控制台命令:

    root@0260ab2fd089:/# dotnet new
    Created new C# project in /.
    root@0260ab2fd089:/# mkdir docker //创建一个文件夹,名字叫docker
    root@0260ab2fd089:/# cd docker/
    root@0260ab2fd089:/docker# dotnet new //创建一个Dotnet Core项目
    Created new C# project in /docker.
    root@0260ab2fd089:/docker# dotnet restore //还原Dotnet Core项目的依赖包
    log  : Restoring packages for /docker/project.json...
    log  : Writing lock file to disk. Path: /docker/project.lock.json
    log  : /docker/project.json
    log  : Restore completed in 4658ms.
    root@0260ab2fd089:/docker# dotnet run //启动Dotnet Core项目
    Project docker (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
    Compiling docker for .NETCoreApp,Version=v1.0
    
    Compilation succeeded.
        0 Warning(s)
        0 Error(s)
    
    Time elapsed 00:00:03.0599700
     
    
    Hello World! //输出结果

    二、部署一个 Web API项目到Docker

    1.创建API

    我们来使用VS 2015创建一个WebAPI项目的名称为:JaxApi,并对默认项目做以下调整:

    A.升级项目所依赖的所有Nuget包

    因为可能有的VS版本稍旧,他默认引用的包都是rc版本的,不升级可能会有一些小问题,我在最早尝试的时候遇到过在本地跑的好好的,但是到了docker中就跑不起来的问题。

    如果你的VS默认引用的rc版本,那么你升级后可能会遇到项目编译不过的问题,好像是Nuget的一个Bug,他把project.json改了,我的解决办法是,在frameworks    ->   netcoreapp1.0 节点下增加如下配置:

    "Microsoft.NETCore.App": {
          "version": "1.0.0",
          "type": "platform"
        }

    然后把dependencies中对Microsoft.NETCore.App的引用干掉。

    这个问题最新的VS中不存在,只是我公司因为各种原因无法安装最新版

    B.让WebApi不止监听localhost来的请求

    新建的API项目默认他只会监听来自Localhost的web请求,我们需要在Program类中增加一个配置:

    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseUrls("http://*:9100")//监听来自所有ip的9100端口的请求
                .UseStartup<Startup>()
                .Build();
    
            host.Run();
        }
    }

    C.发布Web API

    通过文件系统发布WebAPI,这里与发布普通网站并没有什么不同,所有选项默认,跟着VS一步一步来~

    发布的时候最好留个后门,在Release和PublishOutput中间加上一层文件夹,待会儿告诉你啥用,比如我的发布目录:.inReleaseDockerPublishOutput

    2.编写DockerFile

    打开刚才发布的目录,新建一个没有后缀的文件Dockerfile,与PublishOutput文件夹同级

    这里我们如果使用命令行来把文件粘贴到服务器的话,文件夹要比粘贴单个文件方便的多,而且对于我本地测试来说,也没有必要来回折腾压缩文件。这种文件夹层级更加便于我们上传文件~

    Docker File 内容如下,注意端口号要和上面我们Program中配置的一样:

    FROM microsoft/dotnet:latest
    
    WORKDIR /root
    
    # Copy the app file to root
    
    COPY PublishOutput /root/
    
    # Configure the listening port to 9100
    EXPOSE 9100/tcp
    
    # Start the app
    ENTRYPOINT dotnet JaxApi.dll

    然后把Dockerfile和PublishOutput一起上传到Linux服务器上,具体怎么上传大家就八仙过海各显神通吧~

    3.编译成Image并运行

    在Linux服务器上Dockerfile所在目录下,运行命令:

    docker build -t jaxapi ./

    docker build:根据Dockerfile来编译一个Docker Image出来

    -t : 给镜像打个tag(标签),类似于起个名字

    这样子,我们的docker镜像就在我们的服务器上编译好了,这时候,我们可以来启动我们的api,供外界访问

    docker run -it -p 9100:9100 --name jaxapi jaxapi

    -p :映射docker容器的端口,docker里面的9100端口映射到Linux的9100端口上

    --name: 给我的container起个别名,这个可以不加

    这样子,如果你在控制台看到如下提示,就证明你已经成功了:

    Hosting environment: Production
    Content root path: /docker
    Now listening on: http://*:9100
    Application started. Press Ctrl+C to shut down.

    查看一下你的Linux服务器的Ip,然后通过http://ip:9100 来访问你的api吧,默认的API项目只有/api/values这个URL可以访问,最终运行效果如下:

    QQ截图20160827004953

    如果您在阅读过程中,遇到一些问题,欢迎留言讨论。

    未完待续……

  • 相关阅读:
    HDU 3555 Bomb (数位DP)
    ms sqlserver数据库主文件特别大怎么办
    w3wp.exe占用cpu特别高
    Excel的数据批量替换
    用Excel的分列功能格式化时间
    sql cte的使用
    数据结构
    http与浏览器学习
    长方形裁切优化与矩形物料排料
    架构知识
  • 原文地址:https://www.cnblogs.com/baiyunchen/p/5812110.html
Copyright © 2011-2022 走看看