Step By Step将Dotnet Core部署到Docker上

Posted 白云晨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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中间加上一层文件夹,待会儿告诉你啥用,比如我的发布目录:.\\bin\\Release\\Docker\\PublishOutput

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

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

未完待续……

以上是关于Step By Step将Dotnet Core部署到Docker上的主要内容,如果未能解决你的问题,请参考以下文章

WPF MVVM 架构 Step By Step(把actions从view model解耦)

Step by Step Do IOS Swift CoreData Simple Demo

Ajax Step By Step5

Step By Step(Lua调用C函数)

Microsoft SQL Server 2008 MDX Step by Step中关于MDX Step-by-Step.abf损坏文件的处理

WPF Step By Step 系列5-Prism框架在项目中使用