• .NET core for docker


    本文描述下 .net core 在 docker 里面的玩法

    首先按照官方文档先 拉取镜像

    docker pull microsoft/dotnet:latest

    然后就有了 dotnet 这个运行时了,这里以一个 web 项目举例子 先创建一个 web 类型的 project

    dotnet new -t web

    如果本地没有 dotnet 运行时可以docker run 一个

    docker run --rm -it -v /home/hello_dotnet/:/home/hello_dotnet/  microsoft/dotnet:latest

    上面这个命令的意思是 让 docker 运行(docker run)一个dotnet:latest的镜像(microsoft/dotnet:latest) 并且把本地的/home/hello_dotnet卷路径挂载到容器的/home/hello_dotnet 下面(-v /home/hello_dotnet/:/home/hello_dotnet/)然后提供交互式模式能够输入输出(-it)退出之后自动删除容器(--rm)

    然后进入容器生成类似这样

     

    [root@172-16-0-20 home]# docker run --rm -it -v /home/hello_dotnet/:/home/hello_dotnet/  microsoft/dotnet:latest
    
    root@193fb1cf32a6:/# cd /home/hello_dotnet/
    
    root@193fb1cf32a6:/home/hello_dotnet# dotnet new -t web
    
    Created new C# project in /home/hello_dotnet.
    
    root@193fb1cf32a6:/home/hello_dotnet# ls
    
    Controllers  Data  Models  Program.cs  README.md  Services  Startup.cs  Views  appsettings.json  bower.json  gulpfile.js  package.json  project.json  web.config  wwwroot
    
    root@193fb1cf32a6:/home/hello_dotnet#

    然后更新下包依赖

    dotnet restore

    直接运行

    dotnet run

    修改一下默认的监听端口默认是 localhost:5000 不好做代理,把它修改成 0.0.0.0

     

    using System;
    
    using System.Collections.Generic;
    
    using System.IO;
    
    using System.Linq;
    
    using System.Threading.Tasks;
    
    using Microsoft.AspNetCore.Hosting;
    
     
    
    namespace WebApplication
    
    {
    
        public class Program
    
        {
    
            public static void Main(string[] args)
    
            {
    
                var host = new WebHostBuilder()
    
                    .UseUrls("http://0.0.0.0:5000") //添加这一行
    
                    .UseKestrel()
    
                    .UseContentRoot(Directory.GetCurrentDirectory())
    
                    .UseIISIntegration()
    
                    .UseStartup<Startup>()
    
                    .Build();
    
     
    
                host.Run();
    
            }
    
        }
    
    }

    ok 没啥问题 publish 一下

    root@193fb1cf32a6:/home/hello_dotnet# dotnet publish
    
    Publishing hello_dotnet for .NETCoreApp,Version=v1.0
    
    No executable found matching command "npm"

    额,并不能够 publish 提示找不到 npm, npm 这个不是 node 的包依赖工具么。。 经过查看发现这个生成的 web 依赖了 gulp 所以很蛋疼 默认的容器只有运行时环境(可能主要是为了精简镜像)需要自己在安装 node

    这里可以在容器里面把 node 装好或者去其他机器上 publish

    apt-get update & apt-get install npm

    并且安装完 npm 还不够 还需要 安装 bower gulp

    No executable found matching command "bower"

    No executable found matching command "gulp"

    npm install bower -g

    npm install gulp -g

    ok 结束了...

    Project hello_dotnet (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.

    Configuring the following project for use with IIS: '/home/hello_dotnet/bin/Debug/netcoreapp1.0/publish'

    Updating web.config at '/home/hello_dotnet/bin/Debug/netcoreapp1.0/publish/web.config'

    Configuring project completed successfully

    publish: Published to /home/hello_dotnet/bin/Debug/netcoreapp1.0/publish

    Published 1/1 projects successfully

    退出容器回到服务器上

    root@193fb1cf32a6:/home/hello_dotnet/bin/Debug/netcoreapp1.0# exit
    
    exit
    
    [root@172-16-0-20 home]# ls
    
    data  docker-compose  hello_dotnet  java  xiaoming  xiaoqiu
    
    [root@172-16-0-20 home]# cd hello_dotnet/
    
    [root@172-16-0-20 hello_dotnet]# ls
    
    appsettings.json  bin  bower.json  Controllers  Data  gulpfile.js  Models  node_modules  obj  package.json  Program.cs  project.json  project.lock.json  README.md  Services  Startup.cs  Views  web.config  wwwroot

    代码都已经创建好了,现在只要找个运行时 dotnet hello_dotnet.dll 就可以启动 web 了

    打包一个镜像 写个 dockerfile 就好

    先新建个工作目录整理下结构

    [root@172-16-0-20 dotnet]# tree -L 2
    
    .
    
    ├── Dockerfile
    
    └── hello_dotnet
    
        ├── appsettings.json
    
        ├── bin
    
        ├── bower.json
    
        ├── Controllers
    
        ├── Data
    
        ├── gulpfile.js
    
        ├── Models
    
        ├── node_modules
    
        ├── obj
    
        ├── package.json
    
        ├── Program.cs
    
        ├── project.json
    
        ├── project.lock.json
    
        ├── README.md
    
        ├── Services
    
        ├── Startup.cs
    
        ├── Views
    
        ├── web.config
    
        └── wwwroot
    
     
    
    [root@172-16-0-20 dotnet]# docker build -t "hello_dotnet:1.0" ./
    
     
    
    [root@172-16-0-20 dotnet]# docker build -t "hello_dotnet:1.0" ./
    
    Sending build context to Docker daemon 53.04 MB
    
    Step 1 : FROM microsoft/dotnet:latest
    
     ---> 4028809f66a4
    
    Step 2 : COPY hello_dotnet /home/www
    
     ---> 600558b4e65d
    
    Removing intermediate container 0c05fc314674
    
    Step 3 : WORKDIR /home/www
    
     ---> Running in b5b029517595
    
     ---> c9f05e277de9
    
    Removing intermediate container b5b029517595
    
    Step 4 : EXPOSE 8080
    
     ---> Running in 2a00bea9393c
    
     ---> b921fe0482f0
    
    Removing intermediate container 2a00bea9393c
    
    Step 5 : CMD dotnet hello_dotnet.dll
    
     ---> Running in f770b366be81
    
     ---> 11027359f344
    
    Removing intermediate container f770b366be81
    
    Successfully built 11027359f344
    
    运行
    
    [root@172-16-0-20 dotnet]# docker run  --rm -it -p 8888:5000 hello_dotnet:1.0
    
    info: Microsoft.Extensions.DependencyInjection.DataProtectionServices[0]
    
          User profile is available. Using '/root/.aspnet/DataProtection-Keys' as key repository; keys will not be encrypted at rest.
    
    Hosting environment: Production
    
    Content root path: /home/www
    
    Now listening on: http://0.0.0.0:5000
    
    Application started. Press Ctrl+C to shut down.

    浏览器访问 http://172.16.0.20:8888

    ok 一切正常

     

    当然也可以用守护进程的模式运行

    docker run -d -p 8888:5000 hello_dotnet:1.0

    参考文档

    [0] https://dotnet.github.io

    [1] https://docs.docker.com/engine/reference/builder

    [2] http://stackoverflow.com/questions/34212765/how-do-i-get-the-kestrel-web-server-to-listen-to-non-localhost-requests

    男人的头就像女人的胸部能随便乱摸
  • 相关阅读:
    RPC、HTTP、IDL
    秋招拿了7个offer,分享一些反思和经验
    “功能测试”到“测试开发”升级之路
    Github最全买房租房攻略,火了!
    王垠:怎样尊重一个程序员?
    为什么曾经优秀的人突然变得平庸?
    你这么努力,为什么能力提升还这么慢?
    打工人到什么状态,就可以离职了?
    怎样才能迅速晋升?
    如何做个优秀的经理?
  • 原文地址:https://www.cnblogs.com/beyondblog/p/dotnet_core_for_docker.html
Copyright © 2020-2023  润新知