回到目录

一些理论知识

将控制台程序和API程序部署到docker,然后运行它,这个首先要解决的问题就是如何在linux平台运行C#代码,哈哈,很古老的问题,事实上,对于这种问题早在几年前就已经有了解决方案,那就是在linux上安装mono开发环境,然后使用mono就可以运行C#代码了,而如果你的C#是一个网站形式的,那需要一个宿主的支持,其中最权威的应该就是jexus框架,你可以把当理解成是一个服务器,就像tomcat,iis这种东西。

上一次中我们使用mono原始镜像生成了一个新的镜像,用来输出hello world,事实上,我的本意不在echo一个字符出来,而是为今天的课打下基础,因为今天就真的要在linux上运行C#了,或者说把C#项目部署到docker上了。

说干就干-控制台程序

首先要求你的控制台程序与你的Dockerfile在同级目录,如果是publish之后的代码,那最好也放在同一目录下,这样方便你Dockerfile的部署

# 使用一个基础的镜像
FROM mono
# 将文件复制到docker容器
COPY hello.exe .
# 使用mono运行一个应用程序
CMD mono hello.exe

上面代码的工作流程:

  1. 要使用一个基础镜像mono,如果本地没有会去下载它,如果有直接使用本地镜像
  2. 将Dockerfile同级目录下的hello.exe文件复制到docker里,只有这里,你的docker里的程序才找的到它
  3. 运行一个mono命令,如果你的mono没有环境变量(profile),你需要使用WORKDIR去指定目录)

说干就干-API程序

api程序比控制台就复杂一些,你可以使用jexus作为宿主,也可以使用api自己SelfHost,我们今天主要说说后者,它比较轻量级,事实上它也是一个控制台程序,只不过安装了一些包包,来提供宿主功能。

<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net452" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net452" />
<package id="Microsoft.AspNet.WebApi.SelfHost" version="5.2.3" targetFramework="net452" />
<package id="Newtonsoft.Json" version="6.0.4" targetFramework="net452" />
</packages>

然后在代码里去建立路由,监听端口,建立控制器等

        static void Main(string[] args)
{ var config = new HttpSelfHostConfiguration("http://localhost:5000"); //配置主机 config.Routes.MapHttpRoute(
"Default", "api/{controller}/{id}",
new { id = RouteParameter.Optional }); //数据返回格式
config.Formatters.Clear();
config.Formatters.Add(new JsonMediaTypeFormatter()); using (HttpSelfHostServer server = new HttpSelfHostServer(config)) //监听HTTP
{
server.OpenAsync().Wait(); //开启来自客户端的请求
Console.WriteLine("Listen 5000 port,Press Enter to quit.");
Console.ReadKey();
}
}

这时,我们生成项目后,就可以为它编译自己的Dockerfile了,然后通过docker build就可以建立自己的镜像了,通过docker run就可以把服务运行起来了。

#使用一个基础的镜像
FROM mono
#开放端口
EXPOSE
#将Release目录下的所有文件复制到docker容器的根目录,注意不会建立Release目录
COPY Release/ .
#使用mono运行一个应用程序
#CMD mono selfWeb.exe

我们生成这个镜像之前,然后去运行它,我们使用交互模式去运行,然后进入容器后,我们手动去执行mono selfWeb.exe ,当然也可以做成自己执行的!

docker run -it imageID

当进入容器后,我们就可以执行自己的命令了,这时你可以ls一个看看根目录的情况,事实上我们API的Release下所有文件都被复制过来了。

mono selfWeb.exe 

这时,mono帮我们运行了这个api的宿主程序,它对外界会开放一个8080端口!

小伙伴可以访问:Http://dockerip:8080,来感受一下了!

回到目录

docker~Dockerfile方式生成控制台和Api项目的镜像的更多相关文章

  1. docker~Dockerfile方式建立镜像HelloWorld

    回到目录 Dockerfile可以便捷的建立一个image,它可以在一个镜像基础上,去构建另一个镜像,这也许就是它的特色,也是docker的本意! 我们下载一个mono的镜像 docker pull ...

  2. Gitlab-CI +Docker + Docker-Compose构建可持续集成java项目的镜像

    先注册好Runner: https://www.cnblogs.com/zsifan/p/11714788.html 以及搭建Java和Maven环境: https://www.cnblogs.com ...

  3. 快速创建Flask Restful API项目

    前言 Python必学的两大web框架之一Flask,俗称微框架.它只需要一个文件,几行代码就可以完成一个简单的http请求服务. 但是我们需要用flask来提供中型甚至大型web restful a ...

  4. Web API(三):创建Web API项目

    在本篇文章中将讲解如何使用Visual Studio创建一个新的ASP.NET Web API项目. 在Visual Studio中有两种方式用于创建Web API项目: 1.创建带MVC的Web A ...

  5. 【ASP.NET Core分布式项目实战】(五)Docker制作dotnet core控制台程序镜像

    Docker制作dotnet core控制台程序镜像 基于dotnet SDK 新建控制台程序 mkdir /home/console cd /home/console dotnet new cons ...

  6. 在Docker容器中运行.Net Core web Api项目

    安装Docker环境 参考本人这篇<CentOS 7 下Docker的安装>文章进行安装以及环境配置,这里不做赘述. 通过.NetCore开发WebApi项目 1. 创建.Net Core ...

  7. 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式

    前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少了解一些.前段时间研究OpenShift(paas的一种),发现了另外一种构建Docker镜像的方式:S2I ...

  8. [转] 构建Docker镜像两种方式的比较-Dockerfile方式和S2I方式

    原文地址:https://www.cnblogs.com/tianshifu/p/8127837.html 前言 写Dockerfile是构建Docker镜像最通常的方式,接触过Docker的童鞋多少 ...

  9. 用Swashbuckle给ASP.NET Core的项目自动生成Swagger的API帮助文档

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:用Swashbuckle给ASP.NET Core的项目自动生成Swagger的API帮助文档.

随机推荐

  1. C#码农的大数据之路 - 使用Azure Management API创建HDInsight集群

    Azure平台提供了几乎全线产品的API,可以使用第三方工具来进行管理.对于.NET更是提供封装好了的库方便使用C#等语言实现Azure的管理. 我们使用创建HDInsight集群为例来介绍使用C#管 ...

  2. 增强 Sublimetext3

    1.让你的粘贴保留原有缩进 Preferences -> Key Binding 中新增: [ , { "keys": ["ctrl+v"], " ...

  3. C++经典绘图工具EasyX

    EasyX简介 EasyX 在学习C语言时,很多同学抱怨说C只能写最简单的Demo程序,通过printf在屏幕上打印字符来验证代码.这样的编程很枯燥,一点没觉得自己在设计软件. EasyX是针对C++ ...

  4. abstract关键字

    概念 abstract关键字表示的是抽象的意思,可以用来修饰类和方法.修饰类我们称为抽象类,修饰方法我们称为抽象方法. abstract修饰类,抽象类 1.public  abstract  clas ...

  5. Unity3d—做一个年月日选择器(Scroll Rect拖动效果优化)— 无限滚动 + 锁定元素

    最近..... 废话不多说上效果图 用的是UGUI 我先说思路 通过判断元素的位置信息来改变Hierarchy的顺序 实现无限滚动 改变位置的同时也要不断的调整Content的位置防止乱跳 元素锁定就 ...

  6. Mac远程连接windows报错“证书或相关链无效,是否仍要连接到此计算机”的处理办法。

    这个主要是因为策略组设置的问题.详细的设置方法如下: 本地计算机策略>计算机配置>管理模板>windows组件>远程桌面服务>远程桌面会话主机>安全>远程(R ...

  7. rest api get 查询接口 多个参数

    查询时,使用get,传递参数至服务器. angular js中,$http可以直接传递object,在get中,params:data 在服务端, query(x=x,y=y)可写成 query(** ...

  8. 微信 python 接口 -- itchat 文档

    itchat 一. 安装 $ pip install itchat 特殊的字典使用方式 通过打印 itchat 的用户以及注册消息的参数, 可以发现这些值都是字典. 但实际上 itchat 精心构造了 ...

  9. Python操作redis系列之 列表(list) (四)

    # -*- coding: utf- -*- import redis r =redis.Redis(host=,password="ZBHRwlb1608") 1. Lpush ...

  10. Flash TextField selectable bug block TextEvent.Link solution

    There is an old version Felx SDK bug(in my case it's Flex SDK v3.3.0.4852) that when TextField.selec ...