当前位置: 首页 > news >正文

.NET 8 项目 Docker 方式部署到 Linux 系统详细操作步骤

本文将详细介绍如何将一个 .NET 8 项目通过 Docker 部署到 Linux 系统中。以下步骤包括从项目的创建、Dockerfile 的编写、镜像构建、到最后在 Linux 上的容器运行。

1. 环境准备

在开始之前,请确保你已经具备以下环境:

  • Linux 系统(如 Ubuntu、CentOS 等)
  • Docker 已经安装并正确运行
  • .NET 8 SDK 已安装(安装方法参考官网文档)
  • Git 工具用于拉取项目代码

1.1 安装 Docker (如果未安装)

对于 Ubuntu 系统,安装 Docker 的命令如下:

sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/docker-archive-keyring.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce

安装完成后,确保 Docker 服务已经启动:

sudo systemctl enable docker
sudo systemctl start docker

检查 Docker 是否安装成功:

docker --version

1.2 安装 .NET 8 SDK

请参考官方文档安装 .NET 8 SDK:安装 .NET 8 SDK

以 Ubuntu 为例,安装 .NET 8 SDK 的命令如下:

wget https://download.visualstudio.microsoft.com/download/pr/14bbd1ca-6c19-47f5-b4ac-b0aef2b7f146/100b6d651d438574e6f9a78b2464a8da/dotnet-sdk-8.0.100-linux-x64.tar.gz
sudo mkdir -p /usr/share/dotnet
sudo tar zxf dotnet-sdk-8.0.100-linux-x64.tar.gz -C /usr/share/dotnet

验证是否成功安装:

dotnet --version

2. 创建 .NET 8 项目

首先,创建一个简单的 .NET 8 Web API 项目。如果已经有项目,跳过此步骤。

dotnet new webapi -n MyApp
cd MyApp

你可以通过以下命令运行此项目,确保它可以正常工作:

dotnet run

如果你在浏览器中访问 http://localhost:5000,你应该能看到该 Web API 返回的默认响应。

3. 编写 Dockerfile

接下来,我们将为 .NET 项目编写一个 Dockerfile,使其可以通过 Docker 容器运行。

在项目根目录下,创建一个名为 Dockerfile 的文件,并添加以下内容:

# 使用官方 .NET SDK 镜像作为构建环境
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build# 设置工作目录
WORKDIR /src# 将项目文件复制到工作目录
COPY ["MyApp/MyApp.csproj", "MyApp/"]# 恢复依赖
RUN dotnet restore "MyApp/MyApp.csproj"# 复制所有项目文件到容器
COPY . .# 构建项目
WORKDIR "/src/MyApp"
RUN dotnet build "MyApp.csproj" -c Release -o /app/build# 发布项目
RUN dotnet publish "MyApp.csproj" -c Release -o /app/publish# 运行环境镜像
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final# 设置工作目录
WORKDIR /app# 复制发布文件
COPY --from=build /app/publish .# 设置容器启动命令
ENTRYPOINT ["dotnet", "MyApp.dll"]# 暴露端口
EXPOSE 80

Dockerfile 说明:

  1. FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build:使用 .NET SDK 镜像作为构建环境。
  2. WORKDIR /src:设置工作目录为 /src,Docker 将文件复制到此目录。
  3. COPY ["MyApp/MyApp.csproj", "MyApp/"]:复制 .csproj 文件。
  4. RUN dotnet restore:恢复依赖。
  5. COPY . .:复制项目所有文件到容器。
  6. RUN dotnet build:构建项目。
  7. RUN dotnet publish:发布项目,生成可部署的文件。
  8. FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final:使用 .NET 运行时镜像作为生产环境镜像。
  9. COPY --from=build /app/publish .:将构建好的文件从 build 阶段复制到生产环境镜像中。
  10. ENTRYPOINT ["dotnet", "MyApp.dll"]:设置容器启动时的命令,运行 MyApp.dll
  11. EXPOSE 80:暴露容器的 80 端口,方便外部访问。

4. 构建 Docker 镜像

在项目的根目录下,通过以下命令构建 Docker 镜像:

docker build -t myapp:1.0 .

命令解析:

  • -t myapp:1.0:为镜像指定标签 myapp:1.0
  • .:表示当前目录(Dockerfile 文件所在目录)作为上下文。

构建完成后,可以通过以下命令查看已构建的镜像:

docker images

你应该能够看到 myapp 镜像列在其中。

5. 运行 Docker 容器

使用以下命令启动容器:

docker run -d -p 80:80 --name myapp myapp:1.0

命令解析:

  • -d:表示后台运行容器。
  • -p 80:80:将容器的 80 端口映射到主机的 80 端口。
  • --name myapp:为容器指定名称为 myapp
  • myapp:1.0:指定要运行的镜像名称和标签。

运行容器后,你可以在浏览器中访问 http://<your-server-ip>,你应该能看到应用程序的输出。

6. 检查容器状态

可以使用以下命令查看正在运行的容器:

docker ps

这将显示当前所有运行的容器信息。

7. 停止和删除容器

停止容器:

docker stop myapp

删除容器:

docker rm myapp

8. 其他操作

8.1 查看容器日志

你可以查看容器的日志,方便调试和监控:

docker logs myapp

8.2 进入容器进行调试

你可以使用 docker exec 命令进入容器并进行调试:

docker exec -it myapp /bin/bash

这将让你进入容器的 Bash 环境,可以在其中执行命令。

9. 总结

本文详细介绍了如何将一个 .NET 8 项目通过 Docker 部署到 Linux 系统中。操作步骤包括:

  • 安装 Docker 和 .NET SDK。
  • 创建 .NET 8 项目并编写 Dockerfile。
  • 构建 Docker 镜像并运行容器。

Docker 为 .NET 项目的部署提供了很好的解决方案,能使得应用在不同平台上快速启动并保持一致性。希望通过本文的学习,能够帮助你顺利将 .NET 8 项目部署到 Linux 系统中,并在 Docker 容器中高效运行。

相关文章:

.NET 8 项目 Docker 方式部署到 Linux 系统详细操作步骤

本文将详细介绍如何将一个 .NET 8 项目通过 Docker 部署到 Linux 系统中。以下步骤包括从项目的创建、Dockerfile 的编写、镜像构建、到最后在 Linux 上的容器运行。 1. 环境准备 在开始之前&#xff0c;请确保你已经具备以下环境&#xff1a; Linux 系统&#xff08;如 Ubu…...

深入了解 Java split() 方法:分割字符串的利器

Java 提供的 split() 方法是 String 类中一个常用的工具&#xff0c;它可以将一个字符串根据指定的分隔符切割成多个子字符串&#xff0c;并以字符串数组的形式返回。这个方法常用于字符串的处理、数据解析等场景。本文将详细介绍 Java 中 split() 方法的使用方式&#xff0c;并…...

pgsql中处理数组类型字段

1、代码中存入和读取 需要使用自定义转换器 Slf4j public class ArrayTypeHandler extends BaseTypeHandler<List<String>> {Overridepublic void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType)throws SQL…...

如何正确定位前后端bug?

在平时的开发过程中&#xff0c;正确定位前后端bug是提高开发效率和项目质量的关键。以下是一些实用的方法。 一、前后端bug 特征 前端主要负责显示数据&#xff0c;后端主要负责处理数据、存储数据&#xff0c;前后端主要通过接口进行数据交换。 1.前端bug特征 界面显示类…...

mfc操作json示例

首先下载cJSON,加入项目; 构建工程,如果出现, fatal error C1010: unexpected end of file while looking for precompiled head 在cJSON.c文件的头部加入#include "stdafx.h"; 看情况,可能是加到.h或者是.cpp文件的头部,它如果有包含头文件, #include &…...

【技术总结类】2024,一场关于海量数据治理以及合理建模的系列写作

目录 1.今年的创作路线 2.先说第一条线 2.1.由日志引出的海量文本数据存储和分析问题 2.2.监控以及监控的可视化 2.3.数据量级再往上走牵扯出了大数据 2.4.由大数据牵扯出的JAVA线程高级内容 3.第二条线&#xff0c;也是2025要继续的主线 1.今年的创作路线 今年的写作内…...

Dockerfile另一种使用普通用户启动的方式

基础镜像的Dockerfile # 使用 Debian 11.9 的最小化版本作为基础镜像 FROM debian:11.11# 维护者信息 LABEL maintainer"caibingsen" # 复制自定义的 sources.list 文件&#xff08;如果有的话&#xff09; COPY sources.list /etc/apt/sources.list # 创建…...

python的pushbullet库在设备之间发送通知链接文件

Pushbullet 是一个非常方便的 Python 库&#xff0c;可以帮助你在设备之间发送通知、链接、文件等。以下是 Pushbullet 的一些主要功能和使用方法&#xff1a; 功能 与你的 Pushbullet 账户关联的设备&#xff08;需要下载对应的pushbullet手机APP、电脑客户端&#xff09;之…...

STM32之FreeRTOS开发介绍(十九)

STM32F407 系列文章 - freertos&#xff08;十九&#xff09; 目录 前言 一、简述 二、开源网址 三、原理及功能特性 1.原理简介 2.功能介绍 1.任务调度 2.任务管理 3.中断管理 4.消息队列 3.特点说明 4.优缺点 四、参考书籍 五、实现方式 总结 前言 FreeRTOS是…...

用java配合redis 在springboot上实现令牌桶算法

令牌桶算法配合 Redis 在 Java 中的应用令牌桶算法是一种常用的限流算法&#xff0c;适用于控制请求的频率&#xff0c;防止系统过载。结合 Redis 使用可以实现高效的分布式限流。 一.、引入依赖首先&#xff0c;需要在 pom.xml 文件中引入 spring-boot-starter-data-re…...

DCGAN - 深度卷积生成对抗网络:基于卷积神经网络的GAN

深度卷积生成对抗网络&#xff08;DCGAN&#xff0c;Deep Convolutional Generative Adversarial Network&#xff09;是生成对抗网络&#xff08;GAN&#xff09;的一种扩展&#xff0c;它通过使用卷积神经网络&#xff08;CNN&#xff09;来实现生成器和判别器的构建。与标准…...

51c~SLAM~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12327374 #GSLAM 自动驾驶相关~~~ 一个通用的SLAM架构和基准 GSLAM&#xff1a;A General SLAM Framework and Benchmark 开源代码&#xff1a;https://github.com/zdzhaoyong/GSLAM SLAM技术最近取得了许多成功&am…...

优化使用 Flask 构建视频转 GIF 工具

优化使用 Flask 构建视频转 GIF 工具 优化后的项目概述 在优化后的版本中&#xff0c;我们将实现以下功能&#xff1a; 可设置每个 GIF 的帧率和大小&#xff1a;用户可以选择 GIF 的帧率和输出大小。改进的用户界面&#xff1a;使用更现代的设计使界面更美观、整洁。自定义…...

spring cloud如何实现负载均衡

在Spring Cloud中&#xff0c;实际上并没有直接支持lb:\\这样的URL前缀来自动解析为负载均衡的服务地址。lb:\\这样的表示可能是在某些特定框架、文档或示例中自定义的&#xff0c;但它并不是Spring Cloud官方API或规范的一部分。 Spring Cloud实现负载均衡的方式通常依赖于服…...

leetcode19-删除链表的第n结点

leetcode 19 思路 要删除倒数第n个元素&#xff0c;那么就要找到倒数第n1个元素&#xff0c;那么我们需要两个指针来记录&#xff0c;首先快指针需要先走n1步&#xff0c;然后快慢指针一起进行移动&#xff0c;直到快指针为null的时候&#xff0c;此时慢指针恰好走到倒数第n…...

软件测试—— 接口测试(HTTP和HTTPS)

软件测试—— 接口测试&#xff08;HTTP和HTTPS&#xff09; HTTP请求方法GET特点使用场景URL结构URL组成部分URL编码总结 POST特点使用场景请求结构示例 请求标头和响应标头请求标头&#xff08;Request Headers&#xff09;示例请求标头 响应标头&#xff08;Response Header…...

3.1 Go函数调用过程

在 Go 语言中&#xff0c;函数调用的核心机制依赖于内存的栈区分配和指针操作&#xff0c;理解这一原理有助于掌握函数的执行过程。 1. 内存结构概述 在 Go 程序编译成可执行文件并启动后&#xff0c;操作系统会为其分配进程内存&#xff0c;进程内存主要分为以下区域&#x…...

TDengine 做 Apache SuperSet 数据源

‌Apache Superset‌ 是一个现代的企业级商业智能&#xff08;BI&#xff09;Web 应用程序&#xff0c;主要用于数据探索和可视化。它由 Apache 软件基金会支持&#xff0c;是一个开源项目&#xff0c;它拥有活跃的社区和丰富的生态系统。Apache Superset 提供了直观的用户界面…...

08_游戏启动逻辑

1.GameRoot.cs 控制 服务层Svc.cs 和业务层Sys.cs 的初始化 创建脚本GameRoot.cs&#xff08;游戏入口 已进入就初始化各个系统&#xff09; 创建资源加载服务.cs Res 将服务层Svc设置成单例类所以需要挂载在GameRoot身上&#xff0c;这样就可以通过GameRoot来调各个服务 接…...

Ardupilot开源无人机之Geek SDK进展2024-2025

Ardupilot开源无人机之Geek SDK进展2024-2025 1. 源由2. 状态3. TODO3.1 【进行中】跟踪目标框3.2 【暂停】onnxruntime版本3.3 【完成】CUDA 11.8版本3.4 【完成】pytorch v2.5.1版本3.5 【未开始】Inference性能3.6 【未开始】特定目标集Training 4. Extra-Work4.1 【完成】C…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

提升移动端网页调试效率:WebDebugX 与常见工具组合实践

在日常移动端开发中&#xff0c;网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时&#xff0c;开发者迫切需要一套高效、可靠且跨平台的调试方案。过去&#xff0c;我们或多或少使用过 Chrome DevTools、Remote Debug…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

【深度学习新浪潮】什么是credit assignment problem?

Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...

qt+vs Generated File下的moc_和ui_文件丢失导致 error LNK2001

qt 5.9.7 vs2013 qt add-in 2.3.2 起因是添加一个新的控件类&#xff0c;直接把源文件拖进VS的项目里&#xff0c;然后VS卡住十秒&#xff0c;然后编译就报一堆 error LNK2001 一看项目的Generated Files下的moc_和ui_文件丢失了一部分&#xff0c;导致编译的时候找不到了。因…...

Selenium 查找页面元素的方式

Selenium 查找页面元素的方式 Selenium 提供了多种方法来查找网页中的元素&#xff0c;以下是主要的定位方式&#xff1a; 基本定位方式 通过ID定位 driver.find_element(By.ID, "element_id")通过Name定位 driver.find_element(By.NAME, "element_name"…...