回到目录

一些理论知识

将控制台程序和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. SQL语句集锦

    -语 句                                功 能 --数据操作 SELECT      --从数据库表中检索数据行和列 INSERT      --向数据库表添加新数据行 ...

  2. cursor 属性

    鼠标 样式 default 默认光标(通常是一个箭头) auto 默认.浏览器设置的光标. crosshair 光标呈现为十字线. pointer 光标呈现为指示链接的指针(一只手) move 此光标 ...

  3. TLS1.0和TLS1.1的区别

    TLS1.1是对TSL1.0的改进其中包括: 改进"抗抵赖"安全特性上的缺陷 完成协议对椭圆曲线的支持,提出了改进的支持ECC算法的传输层安全协议, 握手协议引入了数字签名及验证机 ...

  4. iOS 手势

    一.看这里 二.抽象类  UIGestureRecognizer 继承于该类的有7类:轻点,捏合,拖拽,滑动,长按,旋转,边缘滑动; 一个手势可以绑定多个事件  - (void)addTarget:( ...

  5. linux 系统备份日志

    题目: 备份日志 小明是一个服务器管理员,他需要每天备份论坛数据(这里我们用日志替代),备份当天的日志并删除之前的日志.而且备份之后文件名是年-月-日的格式.alternatives.log在/var ...

  6. JavaWeb系列:Servlet

    个人整理,欢迎转载与批评建议,转载请添加索引,谢谢. ---------------------------------------------------------------2017.06.10 ...

  7. javascript常用开发笔记:一个简单强大的js日期格式化方法

    前言:一直没找到好用的javascript日期格式化工具,自己写了一个,方便以后复用 1.主要功能 (1)支持任意顺序的日期格式排列:yyyy=年,MM=月,dd=日,HH=时,mm=分,ss=秒,s ...

  8. 【转载】SQL Server行转列,列转行

    行转列,列转行是我们在开发过程中经常碰到的问题.行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现.用传统的方法,比较好理解.层次清 ...

  9. Windows 7安装Oracle 10g的方法

    Windows7下安装Oracle 10g提示"程序异常终止,发生未知错误"的解决方法 1.修改Oracle 10G\database\stage\prereq\db\refhos ...

  10. java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleExcept问题解决方案

    在部署Dynamic Web Project时,如果正确配置web.xml或者标注时,仍然出现以上异常的话,可以尝试以下内容讲解的方法: 首先,双击eclipse中的servers,位置如下图&quo ...