注意:微软目前尚未发布 .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,其实用不到这么多步骤,按需裁剪即可。参考资料放在文末,有问题可以查阅。

