Browse Source
- 修复开发环境容器端口映射配置错误(12790:12790) - 改进参数解析兼容性,支持 -help 格式 - 修复函数定义顺序问题,解决 log_error 未定义错误 - 确保Dockerfile.dev与deploy.sh端口配置一致性 - 优化脚本结构,提高可靠性和可维护性 解决开发环境容器启动失败问题,提升用户体验。feature/x1-web-request
9 changed files with 2550 additions and 16 deletions
@ -0,0 +1,18 @@ |
|||
# 使用官方.NET 8.0运行时镜像作为基础镜像(完整版本,支持调试) |
|||
FROM mcr.microsoft.com/dotnet/aspnet:8.0-jammy |
|||
|
|||
# 设置工作目录 |
|||
WORKDIR /app |
|||
|
|||
# 设置环境变量 |
|||
ENV ASPNETCORE_ENVIRONMENT=Production |
|||
ENV ASPNETCORE_URLS=http://+:12789 |
|||
|
|||
# 复制发布文件到容器中 |
|||
COPY publish/ . |
|||
|
|||
# 暴露端口12789 |
|||
EXPOSE 12789 |
|||
|
|||
# 设置应用启动命令 |
|||
ENTRYPOINT ["./X1.WebAPI"] |
|||
@ -0,0 +1,53 @@ |
|||
# 开发环境Dockerfile - 精简版调试支持 |
|||
FROM mcr.microsoft.com/dotnet/aspnet:8.0-jammy |
|||
|
|||
# 安装核心调试工具 |
|||
RUN apt-get update && apt-get install -y \ |
|||
bash \ |
|||
curl \ |
|||
vim \ |
|||
htop \ |
|||
procps \ |
|||
net-tools \ |
|||
iputils-ping \ |
|||
telnet \ |
|||
tree \ |
|||
less \ |
|||
lsof \ |
|||
dnsutils \ |
|||
&& apt-get clean \ |
|||
&& rm -rf /var/lib/apt/lists/* |
|||
|
|||
# 设置工作目录 |
|||
WORKDIR /app |
|||
|
|||
# 设置环境变量(开发环境) |
|||
ENV ASPNETCORE_ENVIRONMENT=Development |
|||
ENV ASPNETCORE_URLS=http://+:12790 |
|||
ENV DOTNET_USE_POLLING_FILE_WATCHER=1 |
|||
|
|||
# 复制发布文件到容器中 |
|||
COPY publish/ . |
|||
|
|||
# 暴露端口12790 |
|||
EXPOSE 12790 |
|||
|
|||
# 创建开发环境启动脚本 |
|||
RUN echo '#!/bin/bash\n\ |
|||
echo "=========================================="\n\ |
|||
echo "X1.WebAPI 开发环境启动" \n\ |
|||
echo "=========================================="\n\ |
|||
echo "环境: Development"\n\ |
|||
echo "端口: 12790"\n\ |
|||
echo "调试工具:"\n\ |
|||
echo " - 基本: bash, curl"\n\ |
|||
echo " - 编辑: vim"\n\ |
|||
echo " - 系统: htop, ps, lsof"\n\ |
|||
echo " - 网络: netstat, ping, telnet"\n\ |
|||
echo " - 文件: tree, less"\n\ |
|||
echo " - DNS: dig, nslookup"\n\ |
|||
echo "=========================================="\n\ |
|||
exec ./X1.WebAPI' > /app/start-dev.sh && chmod +x /app/start-dev.sh |
|||
|
|||
# 设置应用启动命令 |
|||
ENTRYPOINT ["./start-dev.sh"] |
|||
@ -0,0 +1,424 @@ |
|||
#!/bin/bash |
|||
|
|||
# X1.WebAPI Docker 部署脚本 |
|||
# 使用方法: |
|||
# ./deploy.sh # 生产环境部署 |
|||
# ./deploy.sh --dev # 开发环境部署 |
|||
# ./deploy.sh --help # 显示帮助信息 |
|||
|
|||
set -e # 遇到错误立即退出 |
|||
|
|||
# 颜色定义 |
|||
RED='\033[0;31m' |
|||
GREEN='\033[0;32m' |
|||
YELLOW='\033[1;33m' |
|||
BLUE='\033[0;34m' |
|||
NC='\033[0m' # No Color |
|||
|
|||
# 日志函数 |
|||
log_info() { |
|||
echo -e "${BLUE}[INFO]${NC} $1" |
|||
} |
|||
|
|||
log_success() { |
|||
echo -e "${GREEN}[SUCCESS]${NC} $1" |
|||
} |
|||
|
|||
log_warning() { |
|||
echo -e "${YELLOW}[WARNING]${NC} $1" |
|||
} |
|||
|
|||
log_error() { |
|||
echo -e "${RED}[ERROR]${NC} $1" |
|||
} |
|||
|
|||
# 默认配置 |
|||
ENVIRONMENT="production" |
|||
DOCKERFILE="Dockerfile" |
|||
IMAGE_NAME="x1-webapi" |
|||
CONTAINER_NAME="x1-webapi-container" |
|||
PORT="12789" |
|||
REMOVE_MODE=false |
|||
|
|||
# 解析命令行参数 |
|||
parse_arguments() { |
|||
while [[ $# -gt 0 ]]; do |
|||
case $1 in |
|||
--dev) |
|||
ENVIRONMENT="development" |
|||
DOCKERFILE="Dockerfile.dev" |
|||
IMAGE_NAME="x1-webapi-dev" |
|||
CONTAINER_NAME="x1-webapi-dev-container" |
|||
PORT="12790" |
|||
shift |
|||
;; |
|||
--remove) |
|||
REMOVE_MODE=true |
|||
shift |
|||
;; |
|||
--help|-h|-help) |
|||
show_help |
|||
exit 0 |
|||
;; |
|||
*) |
|||
log_error "未知参数: $1" |
|||
show_help |
|||
exit 1 |
|||
;; |
|||
esac |
|||
done |
|||
} |
|||
|
|||
# 显示帮助信息 |
|||
show_help() { |
|||
echo "X1.WebAPI Docker 部署脚本" |
|||
echo "" |
|||
echo "使用方法:" |
|||
echo " ./deploy.sh # 生产环境部署" |
|||
echo " ./deploy.sh --dev # 开发环境部署" |
|||
echo " ./deploy.sh --remove # 删除当前环境容器和镜像" |
|||
echo " ./deploy.sh --dev --remove # 删除开发环境容器和镜像" |
|||
echo " ./deploy.sh --help # 显示帮助信息" |
|||
echo " ./deploy.sh -h # 显示帮助信息(简写)" |
|||
echo " ./deploy.sh -help # 显示帮助信息(简写)" |
|||
echo "" |
|||
echo "参数说明:" |
|||
echo " --dev : 使用开发环境配置(Dockerfile.dev,端口12790)" |
|||
echo " --remove : 删除模式,删除容器和镜像" |
|||
echo " --help : 显示帮助信息" |
|||
echo " -h : 显示帮助信息(简写)" |
|||
echo " -help : 显示帮助信息(简写)" |
|||
echo "" |
|||
echo "环境说明:" |
|||
echo " 生产环境: 使用 Dockerfile,包含基本调试工具" |
|||
echo " 开发环境: 使用 Dockerfile.dev,包含完整调试工具集" |
|||
echo "" |
|||
echo "开发环境包含的额外工具:" |
|||
echo " - 网络诊断: ping, telnet, net-tools, curl, wget" |
|||
echo " - 系统监控: htop, procps, ps" |
|||
echo " - 文件编辑: vim, nano" |
|||
echo " - 基本工具: bash, procps" |
|||
echo "" |
|||
echo "删除功能:" |
|||
echo " --remove: 删除指定环境的容器和镜像,释放资源" |
|||
} |
|||
|
|||
echo "==========================================" |
|||
echo "X1.WebAPI Docker 部署脚本" |
|||
echo "开始时间: $(date)" |
|||
echo "==========================================" |
|||
|
|||
# 解析命令行参数 |
|||
parse_arguments "$@" |
|||
|
|||
# 显示环境信息 |
|||
echo "部署环境: $ENVIRONMENT" |
|||
echo "使用Dockerfile: $DOCKERFILE" |
|||
echo "镜像名称: $IMAGE_NAME" |
|||
echo "容器名称: $CONTAINER_NAME" |
|||
echo "端口: $PORT" |
|||
echo "操作模式: $([ "$REMOVE_MODE" = true ] && echo "删除模式" || echo "部署模式")" |
|||
echo "==========================================" |
|||
|
|||
# 检查Docker是否安装 |
|||
check_docker() { |
|||
log_info "检查Docker安装状态..." |
|||
if ! command -v docker &> /dev/null; then |
|||
log_error "Docker未安装,请先安装Docker" |
|||
exit 1 |
|||
fi |
|||
log_success "Docker已安装: $(docker --version)" |
|||
} |
|||
|
|||
# 检查Docker服务状态 |
|||
check_docker_service() { |
|||
log_info "检查Docker服务状态..." |
|||
if ! systemctl is-active --quiet docker; then |
|||
log_warning "Docker服务未运行,尝试启动..." |
|||
sudo systemctl start docker |
|||
sleep 2 |
|||
fi |
|||
log_success "Docker服务运行正常" |
|||
} |
|||
|
|||
# 检查目录和文件 |
|||
check_files() { |
|||
log_info "检查部署文件..." |
|||
|
|||
if [ ! -d "publish" ]; then |
|||
log_error "publish目录不存在,请先上传发布文件" |
|||
exit 1 |
|||
fi |
|||
|
|||
if [ ! -f "publish/X1.WebAPI" ]; then |
|||
log_error "可执行文件 publish/X1.WebAPI 不存在" |
|||
exit 1 |
|||
fi |
|||
|
|||
if [ ! -f "$DOCKERFILE" ]; then |
|||
log_error "Dockerfile不存在: $DOCKERFILE" |
|||
if [ "$ENVIRONMENT" = "development" ]; then |
|||
log_info "请确保 Dockerfile.dev 文件存在" |
|||
fi |
|||
exit 1 |
|||
fi |
|||
|
|||
log_success "所有必要文件检查通过" |
|||
} |
|||
|
|||
# 设置文件权限 |
|||
set_permissions() { |
|||
log_info "设置文件权限..." |
|||
|
|||
# 设置可执行文件权限 |
|||
chmod +x publish/X1.WebAPI |
|||
log_success "设置可执行文件权限完成" |
|||
|
|||
# 设置目录权限 |
|||
chmod 755 publish/ |
|||
log_success "设置目录权限完成" |
|||
|
|||
# 设置Dockerfile权限 |
|||
chmod 644 "$DOCKERFILE" |
|||
log_success "设置Dockerfile权限完成" |
|||
|
|||
# 显示权限信息 |
|||
log_info "文件权限信息:" |
|||
ls -la publish/X1.WebAPI |
|||
ls -la "$DOCKERFILE" |
|||
} |
|||
|
|||
# 停止旧容器 |
|||
stop_old_container() { |
|||
log_info "检查并停止旧容器..." |
|||
|
|||
if docker ps -a --format "table {{.Names}}" | grep -q "$CONTAINER_NAME"; then |
|||
log_info "发现旧容器,正在停止..." |
|||
docker stop "$CONTAINER_NAME" 2>/dev/null || true |
|||
log_success "旧容器已停止" |
|||
|
|||
log_info "删除旧容器..." |
|||
docker rm "$CONTAINER_NAME" 2>/dev/null || true |
|||
log_success "旧容器已删除" |
|||
else |
|||
log_info "未发现旧容器" |
|||
fi |
|||
} |
|||
|
|||
# 删除容器和镜像 |
|||
remove_container_and_image() { |
|||
log_info "开始删除容器和镜像..." |
|||
|
|||
# 删除容器 |
|||
if docker ps -a --format "table {{.Names}}" | grep -q "$CONTAINER_NAME"; then |
|||
log_info "发现容器,正在停止并删除..." |
|||
docker stop "$CONTAINER_NAME" 2>/dev/null || true |
|||
docker rm "$CONTAINER_NAME" 2>/dev/null || true |
|||
log_success "容器已删除" |
|||
else |
|||
log_info "未发现容器: $CONTAINER_NAME" |
|||
fi |
|||
|
|||
# 删除镜像 |
|||
if docker images --format "table {{.Repository}}:{{.Tag}}" | grep -q "$IMAGE_NAME:latest"; then |
|||
log_info "发现镜像,正在删除..." |
|||
docker rmi "$IMAGE_NAME:latest" 2>/dev/null || true |
|||
log_success "镜像已删除" |
|||
else |
|||
log_info "未发现镜像: $IMAGE_NAME:latest" |
|||
fi |
|||
|
|||
# 清理悬空镜像 |
|||
log_info "清理悬空镜像..." |
|||
docker image prune -f 2>/dev/null || true |
|||
log_success "悬空镜像清理完成" |
|||
} |
|||
|
|||
# 构建Docker镜像 |
|||
build_image() { |
|||
log_info "开始构建Docker镜像..." |
|||
|
|||
if [ "$ENVIRONMENT" = "development" ]; then |
|||
log_info "构建开发环境镜像..." |
|||
log_info "构建命令: docker build -f $DOCKERFILE -t $IMAGE_NAME:latest ." |
|||
|
|||
# 显示构建上下文 |
|||
log_info "构建上下文文件:" |
|||
ls -la |
|||
|
|||
# 构建开发镜像 |
|||
if docker build -f "$DOCKERFILE" -t "$IMAGE_NAME:latest" .; then |
|||
log_success "开发环境Docker镜像构建成功" |
|||
else |
|||
log_error "开发环境Docker镜像构建失败" |
|||
exit 1 |
|||
fi |
|||
else |
|||
log_info "构建生产环境镜像..." |
|||
log_info "构建命令: docker build -t $IMAGE_NAME:latest ." |
|||
|
|||
# 显示构建上下文 |
|||
log_info "构建上下文文件:" |
|||
ls -la |
|||
|
|||
# 构建生产镜像 |
|||
if docker build -t "$IMAGE_NAME:latest" .; then |
|||
log_success "生产环境Docker镜像构建成功" |
|||
else |
|||
log_error "生产环境Docker镜像构建失败" |
|||
exit 1 |
|||
fi |
|||
fi |
|||
|
|||
# 显示镜像信息 |
|||
log_info "镜像信息:" |
|||
docker images "$IMAGE_NAME:latest" |
|||
} |
|||
|
|||
# 运行新容器 |
|||
run_container() { |
|||
log_info "启动新容器..." |
|||
|
|||
# 根据环境设置不同的环境变量 |
|||
if [ "$ENVIRONMENT" = "development" ]; then |
|||
log_info "启动开发环境容器..." |
|||
docker run -d \ |
|||
--name "$CONTAINER_NAME" \ |
|||
--restart unless-stopped \ |
|||
-p "$PORT:12790" \ |
|||
-e ASPNETCORE_ENVIRONMENT=Development \ |
|||
"$IMAGE_NAME:latest" |
|||
else |
|||
log_info "启动生产环境容器..." |
|||
docker run -d \ |
|||
--name "$CONTAINER_NAME" \ |
|||
--restart unless-stopped \ |
|||
-p "$PORT:12789" \ |
|||
-e ASPNETCORE_ENVIRONMENT=Production \ |
|||
"$IMAGE_NAME:latest" |
|||
fi |
|||
|
|||
if [ $? -eq 0 ]; then |
|||
log_success "容器启动成功" |
|||
|
|||
# 等待容器启动 |
|||
log_info "等待容器启动..." |
|||
sleep 3 |
|||
|
|||
# 检查容器状态 |
|||
if docker ps | grep -q "$CONTAINER_NAME"; then |
|||
log_success "容器运行正常" |
|||
|
|||
# 显示容器信息 |
|||
log_info "容器信息:" |
|||
docker ps | grep "$CONTAINER_NAME" |
|||
|
|||
# 显示端口信息 |
|||
log_info "端口信息:" |
|||
netstat -tlnp | grep "$PORT" || log_warning "端口$PORT未监听,可能容器还在启动中" |
|||
|
|||
else |
|||
log_error "容器启动失败" |
|||
log_info "容器日志:" |
|||
docker logs "$CONTAINER_NAME" |
|||
exit 1 |
|||
fi |
|||
else |
|||
log_error "容器启动失败" |
|||
exit 1 |
|||
fi |
|||
} |
|||
|
|||
# 健康检查 |
|||
health_check() { |
|||
log_info "执行健康检查..." |
|||
|
|||
# 等待应用启动 |
|||
log_info "等待应用启动(最多30秒)..." |
|||
for i in {1..30}; do |
|||
if curl -s http://localhost:$PORT/health > /dev/null 2>&1; then |
|||
log_success "应用健康检查通过" |
|||
return 0 |
|||
fi |
|||
echo -n "." |
|||
sleep 1 |
|||
done |
|||
|
|||
log_warning "健康检查超时,但容器可能仍在启动中" |
|||
log_info "容器日志:" |
|||
docker logs "$CONTAINER_NAME" --tail 20 |
|||
} |
|||
|
|||
# 显示部署信息 |
|||
show_deployment_info() { |
|||
echo "" |
|||
echo "==========================================" |
|||
echo "部署完成!" |
|||
echo "==========================================" |
|||
echo "部署环境: $ENVIRONMENT" |
|||
echo "应用地址: http://localhost:$PORT" |
|||
echo "健康检查: http://localhost:$PORT/health" |
|||
echo "Swagger文档: http://localhost:$PORT/swagger" |
|||
echo "" |
|||
echo "容器管理命令:" |
|||
echo " 查看状态: docker ps | grep $CONTAINER_NAME" |
|||
echo " 查看日志: docker logs $CONTAINER_NAME" |
|||
echo " 重启容器: docker restart $CONTAINER_NAME" |
|||
echo " 停止容器: docker stop $CONTAINER_NAME" |
|||
|
|||
if [ "$ENVIRONMENT" = "development" ]; then |
|||
echo "" |
|||
echo "开发环境调试命令:" |
|||
echo " 进入容器: docker exec -it $CONTAINER_NAME /bin/bash" |
|||
echo " 系统监控: docker exec -it $CONTAINER_NAME htop" |
|||
echo " 网络测试: docker exec -it $CONTAINER_NAME ping google.com" |
|||
echo " 端口检查: docker exec -it $CONTAINER_NAME netstat -tulpn" |
|||
echo " 查看进程: docker exec -it $CONTAINER_NAME ps aux" |
|||
fi |
|||
|
|||
echo "" |
|||
echo "完成时间: $(date)" |
|||
echo "==========================================" |
|||
} |
|||
|
|||
# 主函数 |
|||
main() { |
|||
echo "开始执行流程..." |
|||
|
|||
# 检查Docker环境 |
|||
check_docker |
|||
check_docker_service |
|||
|
|||
# 如果是删除模式 |
|||
if [ "$REMOVE_MODE" = true ]; then |
|||
log_info "执行删除操作..." |
|||
remove_container_and_image |
|||
log_success "删除完成!" |
|||
return |
|||
fi |
|||
|
|||
# 部署模式 |
|||
log_info "执行部署操作..." |
|||
|
|||
# 检查当前目录 |
|||
if [ ! -f "publish/X1.WebAPI" ]; then |
|||
log_error "请在包含publish目录的目录中运行此脚本" |
|||
log_info "当前目录: $(pwd)" |
|||
log_info "期望结构: ./publish/X1.WebAPI" |
|||
exit 1 |
|||
fi |
|||
|
|||
# 执行部署步骤 |
|||
check_files |
|||
set_permissions |
|||
stop_old_container |
|||
build_image |
|||
run_container |
|||
health_check |
|||
show_deployment_info |
|||
|
|||
log_success "部署完成!" |
|||
} |
|||
|
|||
# 执行主函数 |
|||
main "$@" |
|||
@ -0,0 +1,288 @@ |
|||
# X1.WebAPI Docker 部署指南 |
|||
|
|||
## 部署流程 |
|||
|
|||
### 1. 本地发布 |
|||
在Windows开发机器上执行: |
|||
```bash |
|||
# 在 X1.WebAPI 目录下运行 |
|||
publish.bat |
|||
``` |
|||
|
|||
### 2. 上传文件到服务器 |
|||
将 `publish/` 文件夹上传到Ubuntu服务器的 `/home/hyh/x1_service` 目录: |
|||
- `publish/` 文件夹(包含所有发布文件、Dockerfile、deploy.sh和部署指南) |
|||
|
|||
### 3. 服务器端操作 |
|||
|
|||
#### 方式一:使用自动化部署脚本(推荐) |
|||
|
|||
##### 3.1 准备部署环境 |
|||
```bash |
|||
cd /home/hyh/x1_service |
|||
|
|||
# 将deploy.sh从publish目录移动到当前目录 |
|||
mv publish/deploy.sh ./ |
|||
|
|||
# 设置deploy.sh执行权限 |
|||
chmod +x deploy.sh |
|||
``` |
|||
|
|||
##### 3.2 执行自动化部署 |
|||
```bash |
|||
# 运行部署脚本 |
|||
./deploy.sh |
|||
``` |
|||
|
|||
部署脚本会自动执行以下操作: |
|||
- 检查Docker安装和运行状态 |
|||
- 验证所有必要文件 |
|||
- 设置正确的文件权限 |
|||
- 停止并删除旧容器 |
|||
- 构建新的Docker镜像 |
|||
- 启动新容器 |
|||
- 执行健康检查 |
|||
- 显示部署结果 |
|||
|
|||
#### 方式二:手动部署(备选方案) |
|||
|
|||
##### 3.1 进入部署目录并设置权限 |
|||
```bash |
|||
cd /home/hyh/x1_service |
|||
|
|||
# 设置可执行文件权限 |
|||
chmod +x publish/X1.WebAPI |
|||
|
|||
# 设置目录权限 |
|||
chmod 755 publish/ |
|||
chmod 644 publish/Dockerfile |
|||
|
|||
# 如果使用非root用户运行Docker,可能需要调整权限 |
|||
# chown -R $USER:$USER publish/ |
|||
``` |
|||
|
|||
##### 3.2 构建Docker镜像 |
|||
```bash |
|||
docker build -t x1-webapi:latest . |
|||
``` |
|||
|
|||
##### 3.3 运行容器 |
|||
```bash |
|||
# 停止并删除旧容器(如果存在) |
|||
docker stop x1-webapi-container 2>/dev/null || true |
|||
docker rm x1-webapi-container 2>/dev/null || true |
|||
|
|||
# 运行新容器 |
|||
docker run -d \ |
|||
--name x1-webapi-container \ |
|||
--restart unless-stopped \ |
|||
-p 12789:12789 \ |
|||
x1-webapi:latest |
|||
``` |
|||
|
|||
## 容器管理命令 |
|||
|
|||
### 查看容器状态 |
|||
```bash |
|||
docker ps -a | grep x1-webapi |
|||
``` |
|||
|
|||
### 查看容器日志 |
|||
```bash |
|||
# 查看最新日志 |
|||
docker logs x1-webapi-container |
|||
|
|||
# 实时查看日志 |
|||
docker logs -f x1-webapi-container |
|||
|
|||
# 查看最后100行日志 |
|||
docker logs x1-webapi-container --tail 100 |
|||
``` |
|||
|
|||
### 容器操作 |
|||
```bash |
|||
# 停止容器 |
|||
docker stop x1-webapi-container |
|||
|
|||
# 启动容器 |
|||
docker start x1-webapi-container |
|||
|
|||
# 重启容器 |
|||
docker restart x1-webapi-container |
|||
|
|||
# 删除容器 |
|||
docker rm -f x1-webapi-container |
|||
|
|||
# 删除镜像 |
|||
docker rmi x1-webapi:latest |
|||
``` |
|||
|
|||
## 更新部署流程 |
|||
|
|||
### 使用自动化脚本更新(推荐) |
|||
```bash |
|||
# 1. 本地重新发布 |
|||
publish.bat |
|||
|
|||
# 2. 上传新的publish文件夹到服务器 |
|||
# 替换 /home/hyh/x1_service/publish/ 目录 |
|||
|
|||
# 3. 重新运行部署脚本 |
|||
cd /home/hyh/x1_service |
|||
./deploy.sh |
|||
``` |
|||
|
|||
### 手动更新(备选方案) |
|||
```bash |
|||
# 1. 本地重新发布 |
|||
publish.bat |
|||
|
|||
# 2. 上传新的publish文件夹到服务器 |
|||
# 替换 /home/hyh/x1_service/publish/ 目录 |
|||
|
|||
# 3. 重新构建和部署 |
|||
cd /home/hyh/x1_service |
|||
|
|||
# 重新设置权限(如果需要) |
|||
chmod +x publish/X1.WebAPI |
|||
|
|||
# 重新构建镜像 |
|||
docker build -t x1-webapi:latest . |
|||
|
|||
# 重启容器 |
|||
docker restart x1-webapi-container |
|||
``` |
|||
|
|||
## 故障排除 |
|||
|
|||
### 容器状态检查 |
|||
```bash |
|||
# 检查容器是否正常运行 |
|||
docker ps | grep x1-webapi |
|||
|
|||
# 检查容器详细状态 |
|||
docker inspect x1-webapi-container |
|||
``` |
|||
|
|||
### 网络和端口检查 |
|||
```bash |
|||
# 检查端口是否被占用 |
|||
netstat -tlnp | grep 12789 |
|||
|
|||
# 检查防火墙设置 |
|||
sudo ufw status |
|||
sudo ufw allow 12789 |
|||
|
|||
# 测试应用是否响应 |
|||
curl http://localhost:12789/health |
|||
``` |
|||
|
|||
### 权限问题排查 |
|||
```bash |
|||
# 检查文件权限 |
|||
ls -la publish/X1.WebAPI |
|||
ls -la publish/Dockerfile |
|||
|
|||
# 检查文件所有者 |
|||
ls -la publish/ |
|||
|
|||
# 如果权限有问题,重新设置 |
|||
chmod +x publish/X1.WebAPI |
|||
chmod 755 publish/ |
|||
chmod 644 publish/Dockerfile |
|||
``` |
|||
|
|||
### 日志分析 |
|||
```bash |
|||
# 查看容器启动日志 |
|||
docker logs x1-webapi-container |
|||
|
|||
# 查看应用错误日志 |
|||
docker logs x1-webapi-container | grep -i error |
|||
|
|||
# 查看最近的日志 |
|||
docker logs x1-webapi-container --since 10m |
|||
``` |
|||
|
|||
### deploy.sh脚本问题排查 |
|||
```bash |
|||
# 检查脚本权限 |
|||
ls -la deploy.sh |
|||
|
|||
# 重新设置脚本权限 |
|||
chmod +x deploy.sh |
|||
|
|||
# 检查脚本语法 |
|||
bash -n deploy.sh |
|||
|
|||
# 查看脚本详细输出 |
|||
bash -x deploy.sh |
|||
``` |
|||
|
|||
## 性能优化 |
|||
|
|||
### 资源限制 |
|||
```bash |
|||
docker run -d \ |
|||
--name x1-webapi-container \ |
|||
--restart unless-stopped \ |
|||
--memory=2g \ |
|||
--cpus=2 \ |
|||
-p 12789:12789 \ |
|||
x1-webapi:latest |
|||
``` |
|||
|
|||
### 日志管理 |
|||
```bash |
|||
# 限制日志大小 |
|||
docker run -d \ |
|||
--name x1-webapi-container \ |
|||
--restart unless-stopped \ |
|||
--log-opt max-size=10m \ |
|||
--log-opt max-file=3 \ |
|||
-p 12789:12789 \ |
|||
x1-webapi:latest |
|||
``` |
|||
|
|||
## 快速命令参考 |
|||
|
|||
### 一键部署(使用脚本) |
|||
```bash |
|||
cd /home/hyh/x1_service |
|||
mv publish/deploy.sh ./ |
|||
chmod +x deploy.sh |
|||
./deploy.sh |
|||
``` |
|||
|
|||
### 一键部署(手动) |
|||
```bash |
|||
cd /home/hyh/x1_service |
|||
chmod +x publish/X1.WebAPI |
|||
docker build -t x1-webapi:latest . |
|||
docker stop x1-webapi-container 2>/dev/null || true |
|||
docker rm x1-webapi-container 2>/dev/null || true |
|||
docker run -d --name x1-webapi-container --restart unless-stopped -p 12789:12789 x1-webapi:latest |
|||
``` |
|||
|
|||
### 一键重启 |
|||
```bash |
|||
docker restart x1-webapi-container && docker logs -f x1-webapi-container |
|||
``` |
|||
|
|||
### 一键清理 |
|||
```bash |
|||
docker stop x1-webapi-container |
|||
docker rm x1-webapi-container |
|||
docker rmi x1-webapi:latest |
|||
``` |
|||
|
|||
## 注意事项 |
|||
|
|||
1. **端口配置**:确保服务器防火墙允许12789端口访问 |
|||
2. **文件权限**:上传文件后必须设置正确的文件权限 |
|||
3. **网络配置**:如果使用反向代理,确保正确配置代理规则 |
|||
4. **日志管理**:定期清理容器日志避免磁盘空间不足 |
|||
5. **备份策略**:定期备份应用数据和配置文件 |
|||
6. **容器重启**:容器配置了自动重启策略,系统重启后会自动启动 |
|||
7. **deploy.sh脚本**:首次使用需要将脚本从publish目录移动到部署根目录 |
|||
8. **自动化优势**:使用deploy.sh脚本可以避免手动操作错误,提供详细的部署反馈 |
|||
@ -0,0 +1,34 @@ |
|||
@echo off |
|||
chcp 65001 >nul |
|||
echo 开始发布 X1.WebAPI 项目... |
|||
echo. |
|||
|
|||
echo 清理旧的发布文件... |
|||
if exist "publish" ( |
|||
rmdir /s /q "publish" 2>nul |
|||
if exist "publish" ( |
|||
echo 警告:无法删除publish目录,可能正在被使用 |
|||
echo 请关闭所有可能使用该目录的程序后重试 |
|||
pause |
|||
exit /b 1 |
|||
) |
|||
) |
|||
|
|||
echo 开始发布... |
|||
echo 当前目录: %CD% |
|||
echo 使用相对路径发布以避免路径过长问题... |
|||
dotnet publish -c Release -o publish --self-contained true -r linux-x64 |
|||
|
|||
if %ERRORLEVEL% EQU 0 ( |
|||
echo. |
|||
echo 发布成功!输出目录: %CD%\publish |
|||
|
|||
echo. |
|||
echo 发布完成!可以上传publish目录到服务器进行Docker部署 |
|||
echo 注意:Dockerfile、docker-deploy.md和deploy.sh现在位于项目根目录,不需要复制到publish目录 |
|||
) else ( |
|||
echo. |
|||
echo 发布失败!错误代码: %ERRORLEVEL% |
|||
) |
|||
|
|||
pause |
|||
File diff suppressed because it is too large
Loading…
Reference in new issue