射击训练系统 Docker 部署方案(OpenCloudOS 9.4)
1. 环境要求项目要求操作系统OpenCloudOS 9.4内存最低 2GB推荐 4GB磁盘最低 20GB 可用空间网络可访问外网拉取镜像或配置私有镜像仓库用户root 或具有 sudo 权限的用户2. Docker 安装2.1 卸载旧版本sudoyum remove-ydockerdocker-client docker-client-latest\docker-common docker-latest docker-latest-logrotate\docker-logrotate docker-enginepodmanrunc2.2 安装依赖sudoyuminstall-yyum-utils device-mapper-persistent-data lvm22.3 添加 Docker 仓库# 使用阿里云镜像源国内服务器推荐sudoyum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo# 替换仓库中的下载地址为阿里云加速OpenCloudOS 兼容 CentOS 9 仓库sudosed-isdownload.docker.commirrors.aliyun.com/docker-ce/etc/yum.repos.d/docker-ce.repo2.4 安装 Dockersudoyum makecachesudoyuminstall-ydocker-ce docker-ce-cli containerd.io docker-compose-plugin2.5 启动并设置开机自启sudosystemctl startdockersudosystemctlenabledockersudosystemctlenablecontainerd2.6 验证安装docker--versiondockercompose versiondockerrun--rmhello-world2.7 配置 Docker 镜像加速sudomkdir-p/etc/dockersudotee/etc/docker/daemon.jsonEOF { registry-mirrors: [ https://docker.mirror.example.com ], log-driver: json-file, log-opts: { max-size: 50m, max-file: 3 } } EOFsudosystemctl daemon-reloadsudosystemctl restartdocker2.8 配置用户权限可选# 将当前用户加入 docker 组免 sudo 执行 docker 命令sudousermod-aGdocker$USER# 使组变更立即生效newgrpdocker2.9 防火墙配置# 开放所需端口sudofirewall-cmd--permanent--add-port80/tcpsudofirewall-cmd--permanent--add-port5003/tcpsudofirewall-cmd--reload# 查看已开放端口sudofirewall-cmd --list-ports3. 项目目录结构部署时在服务器上创建如下目录结构/home/shoot.example.tech/ ├── docker-compose.yml # 编排文件 ├── api/ # 后端 API 服务 │ ├── Dockerfile │ ├── shooting # 可执行文件 │ ├── appsettings.json │ └── wwwroot/ ├── manage/ # 管理后台前端 │ └── dist/ # 构建产物 ├── debugpage/ # 调试页面 │ └── dist/ ├── nginx/ # Nginx 配置 │ └── nginx.conf ├── do.sh # 容器/镜像清理脚本 └── logs/ # 日志目录 └── api/4. Docker Compose 编排创建docker-compose.yml文件version:3.8services:# API 服务 api:build:context:./apidockerfile:Dockerfilecontainer_name:shooting-apirestart:alwaysports:-5003:5003volumes:-./api/wwwroot:/app/wwwroot-./logs/api:/app/logsenvironment:-ASPNETCORE_ENVIRONMENTProduction-ASPNETCORE_URLShttp://:5003networks:-shooting-net# Nginx 反向代理 nginx:image:nginx:1.24container_name:shooting-nginxrestart:alwaysports:-80:80volumes:-./nginx/nginx.conf:/etc/nginx/nginx.conf:ro-./manage/dist:/home/manage:ro-./debugpage/dist:/home/debugpage:rodepends_on:-apinetworks:-shooting-netnetworks:shooting-net:driver:bridge注意TTS5005、串口5004、摄像头5006等服务如需容器化部署可参照 api 服务格式在docker-compose.yml中追加服务定义。5. Dockerfile 说明项目 API 的 Dockerfile位于src/api/Dockerfile# 基于 ASP.NET 8.0 运行时镜像 FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app # 暴露端口 5003 EXPOSE 5003 # 设置环境变量 ENV ASPNETCORE_URLShttp://:5003 ENV ASPNETCORE_ENVIRONMENTProduction # 复制已发布的应用程序文件 COPY . . # 创建日志和静态资源目录 RUN mkdir -p /app/logs /app/wwwroot # 给可执行文件添加执行权限 RUN chmod x ./shooting # 确保目录权限 RUN chmod -R 755 /app # 设置入口点 ENTRYPOINT [./shooting]发布与构建# 1. 在开发机上发布 API 项目dotnet publish src/api/shooting.csproj-cRelease-opublish/api# 2. 将 Dockerfile 复制到发布目录cpsrc/api/Dockerfile publish/api/# 3. 上传到服务器后构建镜像cd/home/shoot.example.techdockerbuild-tshooting-api:latest ./api6. 部署操作6.1 首次部署# 上传项目文件到服务器后执行cd/home/shoot.example.tech# 构建并启动所有服务dockercompose up-d--build# 查看运行状态dockercomposeps# 查看日志dockercompose logs-fapidockercompose logs-fnginx6.2 更新部署cd/home/shoot.example.tech# 方式一仅更新 API 服务dockercompose build apidockercompose up-dapi# 方式二使用清理脚本后重新部署bashdo.sh shooting-apidockercompose up-d--buildapi# 方式三全量更新dockercompose downdockercompose up-d--build6.3 停止服务# 停止所有服务dockercompose down# 停止单个服务dockercompose stop api7. 数据库连接配置API 服务在 Docker 容器中运行时数据库和 Redis 连接地址需使用host.docker.internal替代localhost以访问宿主机服务{ConnectionStrings:{DbContext:serverhost.docker.internal;port3306;user idroot;passwordxxx;databasedbshoot;,Redis:host.docker.internal,passwordxxx,defaultDatabase2,poolsize50,sslfalse,writeBuffer10240,prefix}}Linux 系统注意host.docker.internal在 Linux 上需在docker-compose.yml中显式添加extra_hosts:-host.docker.internal:host-gateway8. Nginx 反向代理配置Nginx 负责统一入口将请求转发到各后端服务路径目标服务说明/静态文件/home/manage管理后台前端/debug/静态文件/home/debugpage调试页面/interface/http://api:5003/API 服务/tts/http://127.0.0.1:5005/文本转语音服务/serial/http://127.0.0.1:5004/串口服务/camera/http://127.0.0.1:5006/摄像头服务容器化后127.0.0.1应改为 Docker 服务名如http://api:5003/。9. 常用运维命令# 查看所有容器状态dockercomposeps# 查看容器日志dockercompose logs-f--tail100api# 进入容器调试dockercomposeexecapi /bin/bash# 重启单个服务dockercompose restart api# 查看资源占用dockerstats# 清理无用镜像和容器dockersystem prune-a# 查看镜像列表dockerimages# 查看容器详情dockerinspect shooting-api10. 常见问题Q1: 容器内无法连接宿主机数据库确认appsettings.json中数据库地址使用host.docker.internal并在docker-compose.yml的 api 服务中添加extra_hosts:-host.docker.internal:host-gatewayQ2: 端口被占用# 查看端口占用netstat-tlnp|grep5003# 修改 docker-compose.yml 中的端口映射ports: -5004:5003# 将宿主机 5004 映射到容器 5003Q3: 镜像拉取失败检查 Docker 镜像加速配置确保daemon.json中的镜像源可用然后重启 Dockersudosystemctl daemon-reloadsudosystemctl restartdockerQ4: 容器启动后立即退出# 查看退出日志dockercompose logs api# 常见原因# - appsettings.json 配置错误# - 可执行文件缺少执行权限# - 端口冲突Q5: Nginx 502 Bad Gateway确认 API 容器正常运行且nginx.conf中的代理地址与 Docker 网络中的服务名一致# 容器化部署时使用服务名 proxy_pass http://api:5003/;