跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C#

在银河麒麟 V10 上使用 Docker 和 Compose 部署 .NET 8 WebAPI

在银河麒麟 V10 服务器上通过 Docker 和 Compose 部署 .NET 8 WebAPI 的完整流程,包括环境准备、Docker 安装、项目创建、Dockerfile 与 Compose 编写、容器构建运行、自启动配置、HTTPS 与数据库集成,以及常见问题处理。

SqlMaster发布于 2026/6/300 浏览

注意:微软目前尚未发布 .NET 10 版本,这里使用当前最新的 LTS 版本 .NET 8。未来如果 .NET 10 正式发布,部署流程基本类似,只需更新 Docker 镜像版本即可。

在银河麒麟 V10 服务器上跑 .NET 8 WebAPI,用 Docker 是最省事的方式。下面记录从零开始搭建的完整步骤,包括环境准备、Docker 安装、项目创建、Dockerfile 和 Compose 编写、部署运行、自启动配置以及常见问题处理。

系统环境准备

更新系统并安装常用工具:

sudo yum update -y
sudo yum install -y wget curl vim git

Docker 安装与配置

银河麒麟基于 CentOS,所以直接用 yum 安装 Docker 官方的社区版:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
sudo docker --version

接着安装 Docker Compose,从 GitHub 下载二进制:

curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version

防火墙方面,放行 Docker 服务和 API 常用端口 5000/5001:

sudo systemctl start firewalld
sudo systemctl enable firewalld
sudo firewall-cmd --permanent --zone=public --add-service=docker
sudo firewall-cmd --permanent --zone=public --add-port=5000/tcp
sudo firewall-cmd --permanent --zone=public --add-port=5001/tcp
sudo firewall-cmd --reload

创建 .NET 8 WebAPI 项目

你可以在 Windows 上装好 SDK 创建项目再传到服务器,也可以直接在服务器上安装 .NET 8 SDK 来创建。两种方式任选一种。

如果在 Windows 开发机上做:

winget install Microsoft.DotNet.SDK.8
mkdir KylinDotNetWebAPI
cd KylinDotNetWebAPI
dotnet new webapi -n KylinDotNetWebAPI -o .
dotnet new gitignore
dotnet run
# 访问 http://localhost:5200/WeatherForecast 测试

如果想在服务器上直接创建并预览,下载安装脚本:

wget https://dot.net/v1/dotnet-install.sh -O dotnet-install.sh
chmod +x dotnet-install.sh
./dotnet-install.sh -c 8.0 --install-dir /usr/share/dotnet
export DOTNET_ROOT=/usr/share/dotnet
export PATH=$PATH:$DOTNET_ROOT:$DOTNET_ROOT/tools
mkdir -p /opt/dotnet/KylinDotNetWebAPI
cd /opt/dotnet/KylinDotNetWebAPI
dotnet new webapi -n KylinDotNetWebAPI -o .
dotnet run

项目结构大概是这样:

KylinDotNetWebAPI/
├── Controllers/       # 示例控制器
├── Properties/        # 启动配置
├── appsettings.json
├── appsettings.Development.json
├── Program.cs
├── KylinDotNetWebAPI.csproj
└── .gitignore

Dockerfile 与 Compose 配置

在项目根目录创建 Dockerfile,使用多阶段构建缩小最终镜像体积:

# 阶段 1:构建
FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS build
WORKDIR /src
COPY ["KylinDotNetWebAPI.csproj", "./"]
RUN dotnet restore "./KylinDotNetWebAPI.csproj"
COPY . .
WORKDIR "/src/"
RUN dotnet build "KylinDotNetWebAPI.csproj" -c Release -o /app/build
RUN dotnet publish "KylinDotNetWebAPI.csproj" -c Release -o /app/publish /p:UseAppHost=false

# 阶段 2:运行
FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS base
WORKDIR /app
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
COPY --from=build /app/publish .
EXPOSE 5000
EXPOSE 5001
ENV ASPNETCORE_URLS=http://+:5000;https://+:5001
ENTRYPOINT ["dotnet", "KylinDotNetWebAPI.dll"]

同时添加 .dockerignore 文件,避免把不必要的文件打包进上下文:

bin/
obj/
*.swp
*.swo
*~
logs/
*.log
*Tests*/
*.Tests.csproj
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
.idea/
.vscode/
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?

再用 Compose 管理容器,创建 docker-compose.yml:

version: '3.8'
services:
  kylin-webapi:
    image: kylin-dotnet-webapi:latest
    container_name: kylin-dotnet-webapi
    restart: always
    build:
      context: .
      dockerfile: Dockerfile
    environment:
      - ASPNETCORE_ENVIRONMENT=Production
      - ASPNETCORE_HTTP_PORTS=5000
      - ASPNETCORE_HTTPS_PORTS=5001
    ports:
      - "5000:5000"
      - "5001:5001"
    volumes:
      - ./logs:/app/logs
    networks:
      - dotnet-network

networks:
  dotnet-network:
    driver: bridge

构建、运行与验证

进入项目目录,先构建镜像:

cd /opt/dotnet/KylinDotNetWebAPI
docker-compose build

或者直接用 docker 命令:

docker build -t kylin-dotnet-webapi:latest .

启动服务:

docker-compose up -d

也可以不用 Compose,手动运行:

docker run -d \
  --name kylin-dotnet-webapi \
  --restart always \
  -p 5000:5000 \
  -p 5001:5001 \
  -e ASPNETCORE_ENVIRONMENT=Production \
  kylin-dotnet-webapi:latest

查看容器状态与日志:

docker-compose ps
docker-compose logs -f
# 或
docker ps
docker logs -f kylin-dotnet-webapi

服务启动后,用 curl 测试 API:

curl http://localhost:5000/WeatherForecast

如果从外部访问,用服务器的 IP,浏览器打开 http://服务器IP:5000/WeatherForecast 即可。HTTPS 首次访问时可能有证书警告,生产环境请换正式证书。

健康检查可以简单发个 HEAD 请求:

curl -I http://服务器IP:5000/WeatherForecast

应该返回 200。

配置与优化

应用配置主要通过 appsettings.json 和环境变量。修改配置文件后需要重建镜像并重启容器:

docker-compose up -d --build

环境变量可以在 docker-compose.yml 里加,例如数据库连接:

environment:
  - ConnectionStrings__DefaultConnection=Server=db;Database=WebAPIDemo;User=sa;Password=YourStrongPassword123!

日志配置在 appsettings.json 中:

"Logging": {
  "LogLevel": {
    "Default": "Information",
    "Microsoft.AspNetCore": "Warning"
  },
  "File": {
    "LogLevel": { "Default": "Information" },
    "Path": "/app/logs/webapi.log",
    "RollingInterval": "Day"
  }
}

如果想追求更高性能,可以考虑启用 AOT 编译(.NET 7+ 支持),但需要修改项目文件和发布命令,编译时长会变长,启动更快,镜像更小。这里不展开,可以自行查阅文档。

开机自启动

容器已经设置了 restart: always,但要保证 Docker 服务本身是开机自启的:

sudo systemctl enable docker

如果用了 Compose,可以创建一个 systemd 单元,让服务器重启时自动拉起 Compose 服务:

cat > /etc/systemd/system/kylin-dotnet-webapi.service <<EOF
[Unit]
Description=Kylin .NET 8 WebAPI Docker Service
Requires=docker.service
After=docker.service

[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/opt/dotnet/KylinDotNetWebAPI
ExecStart=/usr/local/bin/docker-compose up -d
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable kylin-dotnet-webapi
sudo systemctl start kylin-dotnet-webapi
sudo systemctl status kylin-dotnet-webapi

常见问题

端口被占用:用 netstat -tuln | grep 5000 查占用的进程,杀掉即可。

容器启动失败:查看日志 docker-compose logs -f 或 docker events --since 1h。

API 返回 500:进容器看应用日志 docker exec -it kylin-dotnet-webapi tail -f /app/logs/webapi.log。

依赖项问题:在项目目录执行 dotnet restore 和 dotnet build。

数据库连接不上:检查连接字符串和数据库服务是否正常,网络是否互通。

高级功能

HTTPS 配置

生成自签名证书(仅测试用):

openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
export password=YourCertificatePassword123!
openssl pkcs12 -export -out certificate.pfx -inkey key.pem -in cert.pem -passout pass:$password

然后在 Compose 里挂载证书并设置密码:

volumes:
  - ./certificate.pfx:/app/certificate.pfx
environment:
  - ASPNETCORE_Kestrel__Certificates__Default__Password=YourCertificatePassword123!
  - ASPNETCORE_Kestrel__Certificates__Default__Path=/app/certificate.pfx

集成数据库(以 MySQL 为例)

在 Compose 中添加 MySQL 服务,并让 WebAPI 依赖它:

services:
  kylin-webapi:
    # ... 已有配置
    depends_on:
      - mysql
  mysql:
    image: mysql:8.0
    container_name: mysql
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=YourRootPassword123!
      - MYSQL_DATABASE=WebAPIDemo
      - MYSQL_USER=webapi
      - MYSQL_PASSWORD=YourStrongPassword123!
    ports:
      - "3306:3306"
    volumes:
      - mysql-data:/var/lib/mysql
    networks:
      - dotnet-network

volumes:
  mysql-data:

Nginx 反向代理

如果需要通过域名访问,可以在前面加一层 Nginx,配置如下:

cat > /opt/docker/nginx/conf/conf.d/webapi.example.com.conf <<EOF
server {
  listen 80;
  server_name webapi.example.com;
  location / {
    proxy_pass http://服务器IP:5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection keep-alive;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_cache_bypass $http_upgrade;
  }
}
EOF

以上就是部署的全过程,从环境准备到服务跑起来,再到加自启动和扩展功能都覆盖了。如果只跑个简单的 API,其实用不到这么多步骤,按需裁剪即可。参考资料放在文末,有问题可以查阅。

参考资料

  • .NET 8 官方文档
  • Docker 官方文档
  • 银河麒麟 v10 服务器版官方文档
  • ASP.NET Core WebAPI 文档

目录

  1. 系统环境准备
  2. Docker 安装与配置
  3. 创建 .NET 8 WebAPI 项目
  4. 访问 http://localhost:5200/WeatherForecast 测试
  5. Dockerfile 与 Compose 配置
  6. 阶段 1:构建
  7. 阶段 2:运行
  8. 构建、运行与验证
  9. 或
  10. 配置与优化
  11. 开机自启动
  12. 常见问题
  13. 高级功能
  14. HTTPS 配置
  15. 集成数据库(以 MySQL 为例)
  16. Nginx 反向代理
  17. 参考资料
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 7款国内AI助手横评:豆包、元宝、千问、Kimi、DeepSeek、MiniMax、GLM
  • 2026 算法求职:为什么我劝你深耕多模态大模型
  • 2023年网络安全趋势观察:十个绕不开的方向
  • 用 MGeo 和 Neo4j 搭建中文地址语义知识图谱
  • 汉诺塔问题的递归与非递归 C++ 解法
  • 三维模型数据结构与存储方式解析
  • 大模型微调技术纵览:从全参微调到对齐方法的实践思考
  • 理解MySQL事务隔离:读未提交、读提交、可重复读和串行化
  • LeetCode 41 缺失的第一个正数:原地哈希两种思路
  • MATLAB 多模型 AI 编程助手:在编辑器内直接调用大模型
  • Go 仿真实践:免疫治疗门诊排队、irAE 与床位挤兑建模
  • 网络安全学习平台盘点:七个从新手到进阶的资源
  • Python 编程起步:变量、数据结构与面向对象实例
  • Python MCP Server 实战:从工具调用到业务数据查询
  • 微信小程序城市公交查询与失物招领系统的开发笔记
  • 链表细节与 Java LinkedList 实战
  • 配置 Spark SQL 访问 Hive 元数据
  • AgentScope Java 实战:构建 LLM 智能体与多智能体协作
  • 微信官方 Bot API 上手:ClawBot 插件的 iLink 协议细节
  • Trae + Figma:设计稿生成前端代码的配置流程与实现原理

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online