发布 .Net Core WebAPI 应用程序到 Docker
本文创建一个简单的 .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
源代码
参考
- 在docker中运行ASP.NET Core Web API应用程序
- Building Docker Images for .NET Core Applications
- ASP.NET Core Docker Sample
发布 .Net Core WebAPI 应用程序到 Docker的更多相关文章
- 将 ASP.Net Core WebApi 应用打包至 Docker 镜像
将 ASP.Net Core WebApi 应用打包至 Docker 镜像 运行环境为 Windows 10 专业版 21H1, Docker Desktop 3.6.0(67351),Docker ...
- 【免费视频】使用VS Code开发ASP.NET Core WebAPI应用程序
1.使用VS Code开发ASP.NET Core WebAPI应用程序 1.使用Visual Studio Code开发Asp.Net Core基础入门实战 毕竟从.net过度过来的我们已经习惯了使 ...
- Asp.Net Core WebAPI+PostgreSQL部署在Docker中
PostgreSQL是一个功能强大的开源数据库系统.它支持了大多数的SQL:2008标准的数据类型,包括整型.数值值.布尔型.字节型.字符型.日期型.时间间隔型和时间型,它也支持存储二进制的大对像, ...
- 在CentOS 7服务器中使用Jexus发布.net core webapi
环境: 服务器:CentOS 7 64位 .net core 2.1 Jexus独立版 官网:https://www.jexus.org/ 按照官网安装独立版命令:curl https://jexus ...
- Windows系统下使用Jenkins 自动发布 .NET core到Linux平台下Docker
准备工作(安装过程可以百度,已安装的可以跳过) a) 安装Jenkins,安装包下载地址:http://mirrors.tuna.tsinghua.edu.cn/jenkins/windows ...
- asp.net core webapi 使用ef 对mysql进行增删改查,并生成Docker镜像构建容器运行
1.构建运行mysql容器,添加数据库user 参考Docker创建运行多个mysql容器,地址 http://www.cnblogs.com/heyangyi/p/9288402.html 添加us ...
- 记一次使用Asp.Net Core WebApi 5.0+Dapper+Mysql+Redis+Docker的开发过程
#前言 我可能有三年没怎么碰C#了,目前的工作是在全职搞前端,最近有时间抽空看了一下Asp.net Core,Core版本号都到了5.0了,也越来越好用了,下面将记录一下这几天以来使用Asp.Net ...
- 如何将dotnet core webapi发布到docker中…
如何将dotnet core webapi发布到docker中 今天想起来撸一下docker,中途还是遇到些问题,但是这些问题都是由于路径什么的导致不正确,在这儿还是记录下操作过程,今天是基于wind ...
- 将 ASP.NET Core 1.0 应用作为 docker 镜像发布 (Linux版)
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
随机推荐
- 更改kvm虚拟机磁盘大小
kvm 虚拟机的磁盘大小可通过命令:qemu-img resize filename size 来改,要注意的是resize只支持raw格式的磁盘文件,如果想更改qcow2等格式的磁盘大小,需先用qe ...
- VUE 学习笔记 四 计算属性和监听器
1.计算属性 对于任何复杂逻辑,你都应当使用计算属性 <div id="example"> <p>Original message: "{{ me ...
- 使用Emit实现给实体赋值
Dapper.net的速度很快,最近看源码,原来他orm的实现是通过编写大量IL代码实现的. 使用DynamicMethod,自己编织一个给实体赋值的方法.这种写法效率很高,接近直接对属性赋值.比使用 ...
- 后台生产验证码code和byte[]图片
引用命名空间 using System.Drawing;using System.Drawing.Drawing2D;using System.Drawing.Imaging;using System ...
- ASP.net 居中
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs& ...
- Spring Data MongoDB 一:入门篇(环境搭建、简单的CRUD操作)
一.简介 Spring Data MongoDB 项目提供与MongoDB文档数据库的集成.Spring Data MongoDB POJO的关键功能区域为中心的模型与MongoDB的DBColle ...
- Java50道经典习题-程序8 输入数字求和
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字.例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制. 分析:关键是计算出每一项的值. i ...
- Python3.5 学习五
心灵鸡汤电影推荐: 阿甘正传.辛德勒名单.肖申克的救赎.勇敢的心.角斗士.美国丽人.教父.钢琴师.指环王.西雅图不眠夜.廊桥遗梦.可可西里的美丽传说.放牛班的春天.血钻.战争之王.上帝之城.中央车站. ...
- eclipse的debug模式经常自动跳到TheadPoolExecutor的断点
1.问题:eclipse的debug模式经常自动跳到TheadPoolExecutor的断点,实在烦人 解决方法是: 在eclipse中选择Window->Preference->Java ...
- Lucene.Net+盘古分词器(详细介绍)
本章阅读概要1.Lucenne.Net简介2.介绍盘古分词器3.Lucene.Net实例分析4.结束语(Demo下载)Lucene.Net简介 Lucene.net是Lucene的.net移植版本,是 ...