本文创建一个简单的 .net core webapi 项目,并通过 Docker 运行起来。涉及到 Dockerfile 编写,生成镜像,并运行镜像到容器里。

1. 创建 .net core webapi 项目

创建基于 .net core 2.0 的 webapi 项目,命名为 GetMachNameWebAPI。

并修改 ValuesController 的 Get() 方法返回当前机器的机器名或其他操作。

// GET api/values
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { Environment.MachineName, Environment.OSVersion.Platform.ToString() };
}

2. 编译应用

在项目根目录使用 dotnet publish 命令发布应用程序,发布后的资源被保存在目录

\bin\Debug\netcoreapp2.0\publish 下面。

3. 创建 Dockerfile 文件

在publish里目录里面新建一个Dockerfile文件(文件名就是Dokerfile,没有扩展名),并在该文件中定义如下的内容:

# 基于microsoft/aspnetcore:2.0构建Docker Image
FROM microsoft/aspnetcore:2.0 # 设置工作路径
WORKDIR /app # 将当前文件夹下的所有文件全部复制到工作目录
COPY *.* ./ # 配置环境变量ASPNETCORE_URLS
ENV ASPNETCORE_URLS http://0.0.0.0:5000 # 暴露5000端口
EXPOSE 5000 # 执行dotnet GetMachNameWebAPI.dll命令
CMD ["dotnet", "GetMachNameWebAPI.dll"]

FROM:第一个指令必须为 FROM。 此指令用于初始化新的生成阶段,并为剩余指令设置基础映像。可使用多个FROM为多个映像。

WORKDIR:为剩余的任意 RUN、CMD、ENTRYPOINT、COPY 和 ADD Dockerfile 指令设置工作目录。 如果不存在,则会创建该目录。

COPY:从源路径复制新文件或目录,并将它们添加到目标容器文件系统。

ENV:用来在镜像构建过程中设置环境变量。

RUN:在当前映像之上的一个新层中执行任何命令,并提交结果。

ENTRYPOINT:支持以可执行文件的形式运行容器。每个Dockerfile中只能有一个 ENTRYPOINT ,当指定多个时,只有最后一个起效。

详细请参考官网Dockerfile reference文档

注意ASPNETCORE_URLS的配置可以直接在代码里面Program的Main方法里指定,比如:

.UseUrls("http://localhost:5001")

也可以如本文通过环境变量配置。可参看.Net Core 修改默认的启动端口

4. 上传文件到服务器

通过WinSCP类似的软件,将该目录下的全部内容复制到Ubuntu机器上。

5. 生成Docker Image

在 Dockerfile 文件同目录下执行以下命令,创建Docker Image。千万别省略了最后一个点号,它表示采用当前路径的Dockerfile来生成Docker Image。

docker build -t getmachinewebapi:v0.1 .

在这条命令中:

-t参数用来指定 image 文件的名字,后面还可以用冒号指定标签。如果不指定,默认的标签就是latest。

最后的那个点表示 Dockerfile 文件所在的路径,上例是当前路径,所以是一个点。

详细请参考官网docker build文档

6. 在Docker Container中运行 Web API应用

现在,我们就可以使用docker run来执行刚才产生的Docker Image了。docker run会把Docker Image加载到Docker Container中,然后执行由Dockerfile指定的命令(也就是dotnet DockerWebAPI.dll命令)。docker run的命令如下

docker run -it -p 8080:5000 getmachinewebapi:v0.1

在这条命令中:

-it参数:表示需要提供一个模拟的shell环境,并要求有用户交互功能,这样在本机窗口输入的命令,就会传入容器。

-p 8080:5000参数:表示需要将Docker Container的5000端口映射到主机环境的8080端口,也就是客户端可以直接通过8080端口访问我们的应用程序。

getmachinewebapi:v0.1参数:image 文件的名字(如果有标签,还需要提供标签,默认是 latest 标签)。

详细请参考官网docker run文档

7. 测试

在Linux主机里面通过curl测试:

curl http://localhost:8080/api/values && echo

或者在另外一台机器访问地址 例如http://192.168.174.135:8080/api/values

源代码

参考

发布 .Net Core WebAPI 应用程序到 Docker的更多相关文章

  1. 将 ASP.Net Core WebApi 应用打包至 Docker 镜像

    将 ASP.Net Core WebApi 应用打包至 Docker 镜像 运行环境为 Windows 10 专业版 21H1, Docker Desktop 3.6.0(67351),Docker ...

  2. 【免费视频】使用VS Code开发ASP.NET Core WebAPI应用程序

    1.使用VS Code开发ASP.NET Core WebAPI应用程序 1.使用Visual Studio Code开发Asp.Net Core基础入门实战 毕竟从.net过度过来的我们已经习惯了使 ...

  3. Asp.Net Core WebAPI+PostgreSQL部署在Docker中

     PostgreSQL是一个功能强大的开源数据库系统.它支持了大多数的SQL:2008标准的数据类型,包括整型.数值值.布尔型.字节型.字符型.日期型.时间间隔型和时间型,它也支持存储二进制的大对像, ...

  4. 在CentOS 7服务器中使用Jexus发布.net core webapi

    环境: 服务器:CentOS 7 64位 .net core 2.1 Jexus独立版 官网:https://www.jexus.org/ 按照官网安装独立版命令:curl https://jexus ...

  5. Windows系统下使用Jenkins 自动发布 .NET core到Linux平台下Docker

    准备工作(安装过程可以百度,已安装的可以跳过) a)     安装Jenkins,安装包下载地址:http://mirrors.tuna.tsinghua.edu.cn/jenkins/windows ...

  6. asp.net core webapi 使用ef 对mysql进行增删改查,并生成Docker镜像构建容器运行

    1.构建运行mysql容器,添加数据库user 参考Docker创建运行多个mysql容器,地址 http://www.cnblogs.com/heyangyi/p/9288402.html 添加us ...

  7. 记一次使用Asp.Net Core WebApi 5.0+Dapper+Mysql+Redis+Docker的开发过程

    #前言 我可能有三年没怎么碰C#了,目前的工作是在全职搞前端,最近有时间抽空看了一下Asp.net Core,Core版本号都到了5.0了,也越来越好用了,下面将记录一下这几天以来使用Asp.Net ...

  8. 如何将dotnet core webapi发布到docker中…

    如何将dotnet core webapi发布到docker中 今天想起来撸一下docker,中途还是遇到些问题,但是这些问题都是由于路径什么的导致不正确,在这儿还是记录下操作过程,今天是基于wind ...

  9. 将 ASP.NET Core 1.0 应用作为 docker 镜像发布 (Linux版)

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

随机推荐

  1. linux清理磁盘

    https://blog.csdn.net/u012660464/article/details/78923011 有时候,服务突然挂了,再次启动却启动不了.一看,原来是磁盘空间被占满啦,那么,怎么清 ...

  2. fatal: Not a git repository (or any parent up to mount point /home)

    问题:fatal: Not a git repository (or any parent up to mount point /home) 解决:git init

  3. 62 不同路径 leetcode JAVA

    题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” ). 机器人每次只能向下或者向右移动一步.机器人试图达到网格的右下角(在下图中标记为“Finish”). 问 ...

  4. http协议与https协议的区别

    1.前言 超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可 ...

  5. 微信小店调用api代码示例

    刚开始调用微信小店api的时候,可能大家会遇到问题.系统总是提示system error,归根结底还是发送的参数不正确. 下面给出几个调用例子: 例子写得不全. <?php function c ...

  6. video视频内容填充整个播放空间方法

    关于video视频内容填充整个播放空间方法一般上传的视频都没法占满video,看起来很不美观,解决办法很简单video{ object-fit:fill;}

  7. CTF之信息泄漏

    web源码泄漏 .hg源码泄漏: 漏洞成因:hg  init的时候会生成.hg,http://www.xx.com/.hg/, 工具:dvcs-ripper,(rip-hg.pl -v -u http ...

  8. leecode刷题(20)-- 删除链表中的节点

    leecode刷题(20)-- 删除链表中的节点 删除链表中的节点 描述: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点. 现有一个链表 -- head = ...

  9. [bzoj4444] 国旗计划 双指针+倍增

    Description A国正在开展一项伟大的计划--国旗计划.这项计划的内容是边防战士手举国旗环绕边境线奔袭一圈.这项计划需要多名边防战士以接力的形式共同完成,为此,国土安全局已经挑选了N名优秀的边 ...

  10. Vulnhub Billu_b0x

    1.信息收集 1.1.获取IP地址: map scan report for 192.168.118.137 Host is up (0.00017s latency). Not shown: 998 ...