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

在CentOS中部署.NET项目

话不多说,直接上干货

一、文档说明

本文档基于实际实操流程整理,涵盖 CentOS 7 环境下使用 Docker 部署 .NET 8 Web/API 项目的全流程,包含环境准备、核心部署步骤、问题排查、运维命令四大部分,所有命令可直接复制执行,适配新手快速上手。

二、环境准备

2.1 CentOS 7 基础配置(避坑必备)

# 关闭防火墙(新手优先,后续可按需放行端口)
sudo systemctl stop firewalld
sudo systemctl disable firewalld# 关闭 SELinux(避免权限拦截 Docker 操作)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config# 更新系统依赖
sudo yum update -y

2.2 安装 Docker(CentOS 7 官方稳定版)

# 安装 Docker 依赖工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2# 添加 Docker 官方 YUM 源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo# 安装 Docker 核心组件
sudo yum install -y docker-ce docker-ce-cli containerd.io# 启动 Docker 并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker# (可选)普通用户免 sudo 使用 Docker(需重启终端生效)
sudo usermod -aG docker feiyu  # 替换 feiyu 为你的服务器用户名
newgrp docker

2.3 验证 Docker 安装

docker --version  # 输出 Docker 版本(如 Docker version 26.0.0)即成功
docker info       # 忽略 "errors pretty printing info" 格式提示,能输出内容即正常

三、核心部署步骤

3.1 本地发布 .NET 8 项目(开发机操作)

在 Windows/Mac 开发机进入项目根目录(含 .csproj 文件),执行发布命令:

# 进入项目目录(示例路径,替换为你的实际路径)
cd /Users/xxx/Projects/ERPManage# 发布适配 Linux 的项目包
dotnet publish -c Release -r linux-x64 --self-contained false -o ./publish

发布完成后,本地会生成 ./publish 目录,包含项目运行所需的所有文件(DLL、配置文件等)。

3.2 上传发布包到 CentOS 服务器

3.2.1 获取服务器内网 IP

# 在 CentOS 服务器执行,获取内网 IP(如 192.168.225.128)
ip addr  # 查看 ens33 网卡的 inet 字段

3.2.2 SCP 上传(Windows PowerShell 执行)

# 格式:scp -r 本地发布包路径 服务器用户@服务器IP:目标目录
scp -r ./publish feiyu@192.168.225.128:/home/feiyu/dotnet8-app

⚠️ 注意:Windows 的 SCP 会把 publish 内的文件直接上传到目标目录根下,不会创建 publish 子目录。

3.3 编写 Dockerfile(服务器操作)

# 进入发布包目录
cd /home/feiyu/dotnet8-app# 创建并编辑 Dockerfile
vi Dockerfile

写入以下内容(适配 .NET 8,解决国内镜像拉取问题):

# 基础镜像:微软官方 .NET 8 Alpine 轻量镜像(国内有 CDN 加速)
FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine AS runtime# 设置容器工作目录
WORKDIR /app# 复制发布包(当前目录所有文件 → 容器 /app 目录)
COPY . /app# 暴露容器 80 端口
EXPOSE 80# 关键:设置为开发环境,启用Swagger(使用swagger开启)
ENV ASPNETCORE_ENVIRONMENT=Development# 配置 .NET 绑定所有地址(关键:避免仅绑定 127.0.0.1)
ENV ASPNETCORE_URLS=http://+:80# 启动项目(替换为你的入口 DLL)
ENTRYPOINT ["dotnet", "ERPManage.dll", "--urls=http://0.0.0.0:80"]

保存退出:按 Esc → 输入 :wq → 回车。

3.4 构建 Docker 镜像

# 构建镜像,标签为 erp-manage:v1(便于识别)(标签可自己修改)
sudo docker build -t erp-manage:v1 .

构建成功会输出:Successfully built xxx + Successfully tagged erp-manage:v1

3.5 运行容器

# 后台运行容器,映射 8080 端口,设置开机自启(name可以根据自己实际修改)
sudo docker run -d -p 8080:80 --name erp-container --restart=always erp-manage:v1# 验证容器状态(STATUS 为 Up 即正常)
sudo docker ps

正常输出示例:

CONTAINER ID   IMAGE           COMMAND                  CREATED         STATUS         PORTS                                   NAMES
b3695ee6e469   erp-manage:v1   "dotnet ERPManage.dll"   10s ago        Up 9s          0.0.0.0:8080->80/tcp, :::8080->80/tcp   erp-container

3.6 放行端口(未关闭防火墙时执行)

sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload

3.7 验证部署结果

在本地浏览器访问:

http://服务器IP:8080/swagger/index.html(如 http://192.168.225.128:8080/swagger/index.html

能打开 Swagger 页面 → 项目启动成功。

四、部署常见问题及解决方案

问题 1:Docker 拉取 centos:7 镜像超时 / 403

现象

Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection

原因

Docker 官方仓库国内访问慢 / 被限制。

解决方案

  • 优先方案:使用本文档的 mcr.microsoft.com/dotnet/aspnet:8.0-alpine 镜像(国内加速);

  • 备选方案:配置 Docker 国内镜像源:

    sudo mkdir -p /etc/docker
    sudo tee /etc/docker/daemon.json <<-'EOF'
    {"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
    }
    EOF
    sudo systemctl daemon-reload
    sudo systemctl restart docker
    

问题 2:执行 docker build 提示找不到 Dockerfile

现象

unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /tmp/Dockerfile: no such file or directory

原因

执行 docker build 时不在 Dockerfile 所在目录。

解决方案

# 切换到 Dockerfile 目录
cd /home/feiyu/dotnet8-app
# 重新构建
sudo docker build -t erp-manage:v1 .

问题 3:Cannot connect to the Docker daemon

现象

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

原因

docker.socket 服务未启动,导致通信套接字文件缺失。

解决方案

sudo systemctl stop docker.socket
sudo systemctl start docker.socket
sudo systemctl enable docker.socket
sudo systemctl restart docker

问题 4:COPY ./publish/app 提示文件不存在

现象

COPY failed: file not found in build context or excluded by .dockerignore: stat publish: file does not exist

原因

SCP 上传后无 publish 子目录,Dockerfile 路径不匹配。

解决方案

修改 Dockerfile 中的 COPY 语句:

# 原语句:COPY ./publish /app
# 修改后:
COPY . /app

问题 5:容器内执行 curl 提示 not found

现象

/app # curl http://localhost:80
sh: curl: not found

原因

Alpine 镜像默认未安装 curl。

解决方案

# 进入容器
sudo docker exec -it erp-container sh
# 安装 curl
apk update
apk add curl

问题 6:容器内 curl http://localhost:80 无输出

现象

curl 无返回,但 ps aux 能看到 dotnet 进程运行。

原因

.NET 项目仅绑定 127.0.0.1:80,未绑定 0.0.0.0:80

解决方案

修改 Dockerfile 的 ENTRYPOINT,强制绑定所有地址:

ENTRYPOINT ["dotnet", "ERPManage.dll", "--urls=http://0.0.0.0:80"]

重新构建镜像并运行。

问题 7:Swagger 可打开但接口无法访问数据库

现象

Swagger 页面正常,调用接口提示 “数据库连接失败 / 表损坏”。

原因

  1. 数据库文件损坏;
  2. 配置的数据库地址为 localhost(容器内 localhost ≠ 服务器);
  3. 数据库拒绝容器网段访问。

解决方案

  1. 定位数据库错误:

    sudo docker logs erp-container | grep -i "database\|sql\|error"
    
  2. 修复 MySQL 损坏表(示例):

    mysql -u root -p
    USE erp_db;  # 替换为你的数据库名
    REPAIR TABLE user_info;  # 替换为损坏的表名
    
  3. 修正数据库连接配置(容器内):

    sudo docker exec -it erp-container sh
    vi appsettings.json
    
    localhost
    

    改为数据库内网 IP:

    "ConnectionStrings": {"DefaultConnection": "Server=192.168.225.130;Port=3306;Database=erp_db;Uid=root;Pwd=123456;"
    }
    

问题 8:docker info 提示 errors pretty printing info

现象

执行 docker info 出现格式错误提示。

原因

Docker 日志格式化小 Bug,无功能影响。

解决方案

忽略该提示,通过 docker ps/docker build 验证功能即可。

五、运维常用命令

5.1 容器管理

# 查看运行中的容器
sudo docker ps# 重启容器
sudo docker restart erp-container# 停止容器
sudo docker stop erp-container# 删除容器(需先停止)
sudo docker stop erp-container && sudo docker rm erp-container# 进入容器终端
sudo docker exec -it erp-container sh

5.2 日志排查

# 实时查看日志
sudo docker logs -f erp-container# 查看最新 100 行日志
sudo docker logs --tail=100 erp-container# 导出日志到文件
sudo docker logs erp-container > erp_logs.txt

5.3 镜像管理

# 查看本地镜像
sudo docker images# 删除镜像(需先删容器)
sudo docker rmi erp-manage:v1# 重新构建镜像
sudo docker build -t erp-manage:v1 .

六、注意事项

  1. 数据库地址:容器内 localhost 仅指向容器自身,需配置数据库内网 IP;
  2. 端口冲突:若 8080 被占用,可替换为 8081-p 8081:80),并同步放行端口;
  3. 数据备份:定期备份数据库,避免损坏后无法恢复;
  4. 项目更新:修改代码后需重新发布 → 上传 → 构建镜像 → 重启容器。
http://www.jsqmd.com/news/311561/

相关文章:

  • 2026上海热门:口碑好的宠物牙科医生推荐,狗狗口腔护理/狗口腔溃疡诊疗/猫咪拔牙/猫咪洗牙,宠物牙科医生推荐排行
  • 导师严选2026 AI论文软件TOP10:继续教育写作全攻略
  • Scikit-learn API 的哲学与精妙设计:超越“调用即用”的深度解析
  • springboot学习交流平台的设计vue0il1o
  • 大学生就业招聘|基于java+ vue大学生就业招聘系统(源码+数据库+文档)
  • 互联网大厂Java求职面试实战:微服务与AI技术全栈问答解析
  • 2026青春期男孩叛逆怎么办?家庭教育新策略揭秘,青少年抑郁焦虑/青少年厌学/问题青少年,家庭教育咨询室收费标准
  • 2026成都高端卫浴实力企业盘点与深度解析
  • 2026年卧室定制怎么选?徐州优秀厂家深度测评与报价解析
  • 2026年开年可靠的长沙中央空调回收服务
  • 想找靠谱会计培训中心?对啊网财会课堂值得一试吗
  • 情绪宣泄平台系统|基于java + vue情绪宣泄平台系统(源码+数据库+文档)
  • GEO优化实战体验:2026年这家公司方案效果实测,短视频代运营/新闻营销/快手代运营/网络推广,GEO优化企业有哪些
  • 校园外卖|基于java + vue校园外卖系统(源码+数据库+文档)
  • 亲测好用!9个AI论文网站测评,专科生毕业论文必备工具
  • 在线考试|基于java + vue在线考试系统(源码+数据库+文档)
  • AI率95%降至5.8%!2026最新实测15款降AI工具:3个免费方法亲测有效!这几款才是保住学位的“神器”
  • 【深度测评】论文AIGC痕迹太重?2026学生党必备降ai率神器,3个免费方法亲测有效(附对比图)
  • 【深度测评】论文降ai工具哪个好用?2026学生党必备降ai率神器,亲测把AI率降低到5%以下(附对比图)
  • AI率95%降至5.8%!2026最新实测15款降AI工具:DeepSeek只是辅助,这几款才是保住学位的“神器”
  • AI率95%降至5.8%!2026最新实测15款降AI工具:还有免费ai查重!这几款才是保住学位的“神器”
  • 论文AIGC痕迹太重?AI率95%降至5.8%!2026最新实测15款降AI工具:DeepSeek只是辅助,这几款亲测有效
  • 重庆哪些三顾冒菜品牌有潜力?这份清单供参考,冒菜店/餐饮/冒菜/麻辣烫,三顾冒菜品牌怎么选择
  • 不花一分钱!AI率95%降至5.8%!2026最新实测15款降AI工具:DeepSeek只是辅助,这几款才是降AI神器
  • 深入解析:Sentinel:全面学习笔记
  • 2026年尿毒症治疗趋势:尿毒症皮肤瘙痒灌流产品哪家性价比高
  • 分析2026年山西CF透明亚克力市场,口碑好的品牌排名
  • GEO是什么意思深度解读,高性价比源头厂家排名揭晓
  • 乳酸化修饰如何驱动肿瘤免疫逃逸?
  • springboot智慧校园综合服务平台系统设计实现