ASP.NET Core 部署到docker

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: ASP.NET Core 部署到docker

ASP.NET Core 部署到docker

前提:本地已有 ASP.NET Core web应用程序,并且已安装docker desktop。
提供两种思路进行

  1. 项目发布

在本地进行发布,

dotnet publish -c Release -p:PublishReadyToRun=true --no-self-contained -r ubuntu.20.04-x64 -o ./Release

发布模式
使用--configuration或者-c来指定发布的模式。默认为Debug,由于我们需要发布正式版所以采用Release。
R2R
ReadyToRun:在编译的时候除了编译中间码外也编译目标架构的机器码,但是仍然会保留中间码。这样会造成程序体积的翻倍,但是会加快启动速度,不过由于程序体积变大也可能减缓启动速度,是个很玄学的选项
不过微软文档上表示。
For instance, ReadyToRun can be used to reduce the response latency of the first use of Web API in an ASP.NET application.
比方说呢,R2R可以加快ASP.NET Core Web API的第一次响应速度。
更多内容见微软文档Microsoft Docs | ReadyToRun development overview
非自部署发布
使用--no-self-contained或者--self-contained false来指定不要自部署发布,即不包含.NET runtime。这样做有利于减少发布程序的大小。
但是在没有.NET runtime的机器上运行时需要先安装.NET runtime。
不过我的想法是在docker里面运行,可以使用ASP.NET Core的镜像,包含了.NET runtime。所以不需要自部署发布。
目标平台
使用--runtime 或-r来指定目标平台。后面接目标平台标识符,即Runtime Identifiers (RIDs)。
RID列表见微软文档:Microsoft Docs | Runtime Identifiers (RIDs)
因为启用了R2R所以需要指定目标平台。
另外我觉得(并没有根据的胡扯)指定发布平台比全平台编译效果好。
输出目录
使用--output 或者-o设置输出目录。
在本地发布后,通过编写 Dockerfile 将发布文件复制到docker。或者是编写Dockerfile时将源代码复制到docker在docker内进行编译发布。

  1. 添加docker镜像加速(可选)

docker官方的镜像实在是慢的离谱,可以根据自己已有的选择服务加速。
使用了阿里云的镜像加速服务(因为我是阿里云服务器,这样速度也非常可观)

  1. 打开阿里云控制台的容器镜像服务中的镜像加速器Tag;
  2. 按照下面的操作文档修改,比如Ubuntu为:
    1. 进入目录/etc/docker(如果没有就创建一个)
    2. 编辑文件daemon.json(如果没有就创建一个)
    3. 写入如下内容:{"registry-mirrors": ["https://9clpqmyk.mirror.aliyuncs.com"]},网址在上面的“加速器地址”处有写。
    4. sudo systemctl daemon-reload重载
    5. sudo systemctl restart docker重启docker
  3. Dockerfile 编写

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
引用ASP.NET Core镜像
首先我不希望发布自部署应用程序,因为它过于庞大。所以我们可以考虑引用ASP.NET Core Runtime的Docker镜像:

FROM mcr.microsoft.com/dotnet/aspnet:5.0

这句话引用了ASP.NET Core的docker镜像,里面有包含Runtime。
设置目录
首先需要使用COPY命令复制我们编译出来的文件,然后使用WORKDIR来指定工作目录(就是启动程序的路径)。

# Copy Files
COPY . /public

# Set Workdir
WORKDIR /public

请注意替换成自己编译输出的目录
设置时区
为了确保时间正确,设置一下时区

RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" >/etc/timezone

开放端口

# Expose Port 80
EXPOSE 80

由于docker中是生产环境,所以会使用80端口而不是默认的5000。可以在执行程序的时候更改端口。总之,这里写你要暴露的端口咯。
运行程序

CMD ./WebApplication

注意替换为你的程序名
使用参数--urls "http://*:6000"来设置启动的端口(127.0.0.1为监听本机)。可以使用类似于--urls "http://*:6000;http://*:6001;http://*:6002;http://*:6003"监听多个端口。

  1. 创建容器

    docker build -t MyWebApplication:v1.4.2 Release/
    

    这句话将会创建一个docker容器,命令的格式如下

    docker build -t <container name>:<tag> <directory>
    

    注意替换为自己容器名称和标签以及构建出来的目录

  2. 运行容器

    docker run -d -p 6000:80 MyWebApplication:v1.4.2
    

    其中-p 6000:80的意思是讲容器暴露的80端口映射到本机的6000端口,而后面的MyWebApplication:v1.4.2则是刚才创建容器时候写的container name和tag。

目录
相关文章
|
5天前
|
消息中间件 监控 RocketMQ
Docker部署RocketMQ5.2.0集群
本文详细介绍了如何使用Docker和Docker Compose部署RocketMQ 5.2.0集群。通过创建配置文件、启动集群和验证容器状态,您可以快速搭建起一个RocketMQ集群环境。希望本文能够帮助您更好地理解和应用RocketMQ,提高消息中间件的部署和管理效率。
152 91
|
6天前
|
存储 NoSQL Redis
Docker 部署 Redis
在使用 Docker 部署 Redis 时,为实现数据持久化,需正确挂载容器内的数据目录到宿主机。推荐命令如下: ``` docker run -d --name redis -v /mnt/data/redis:/data -p 6379:6379 redis ``` 该命令将宿主机的 `/mnt/data/redis` 目录挂载到容器的 `/data` 目录,确保 Redis 数据持久化。此路径更通用,适合大多数场景。避免使用不匹配的挂载路径,如 `/var/lib/redis` 或 `/mnt/data/redis` 到非默认目录,以防止数据无法正确持久化。
|
21天前
|
存储 关系型数据库 MySQL
美团面试:MySQL为什么 不用 Docker部署?
45岁老架构师尼恩在读者交流群中分享了关于“MySQL为什么不推荐使用Docker部署”的深入分析。通过系统化的梳理,尼恩帮助读者理解为何大型MySQL数据库通常不使用Docker部署,主要涉及性能、管理复杂度和稳定性等方面的考量。文章详细解释了有状态容器的特点、Docker的资源隔离问题以及磁盘IO性能损耗,并提供了小型MySQL使用Docker的最佳实践。此外,尼恩还介绍了Share Nothing架构的优势及其应用场景,强调了配置管理和数据持久化的挑战。最后,尼恩建议读者参考《尼恩Java面试宝典PDF》以提升技术能力,更好地应对面试中的难题。
|
13天前
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
72 44
|
1月前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
58 23
|
25天前
|
SQL Java Maven
docker部署apollo
docker部署apollo步骤
|
1月前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
49 22
|
1月前
|
监控 Java 应用服务中间件
tomcat相关概念与部署tomcat多实例-zabbix监控(docker部署)
通过上述步骤,您可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使您能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
66 25
|
2月前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
96 8
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
1月前
|
SQL 关系型数据库 MySQL
docker-compose部署mysql8
使用docker-compose容器化部署mysql8