# Docker部署说明 ## 前置要求 服务器上只需要安装 **Docker** 即可,不需要Java环境! ### 安装Docker(如果未安装) **CentOS/RHEL:** ```bash curl -fsSL https://get.docker.com | sh systemctl start docker systemctl enable docker ``` **Ubuntu/Debian:** ```bash curl -fsSL https://get.docker.com | sh systemctl start docker systemctl enable docker ``` **Docker版本检查:** ```bash docker --version ``` --- ## 部署方式 ### 方式一:使用Dockerfile(推荐)⭐ #### 1. 上传项目到服务器 ```bash # 方式1: 使用scp scp -r xingfutong-java/ user@your-server:/opt/ # 方式2: 使用rsync rsync -avz xingfutong-java/ user@your-server:/opt/xingfutong-java/ # 方式3: 使用git ssh user@your-server cd /opt git clone your-repo-url xingfutong-java ``` #### 2. 构建Docker镜像 ```bash cd /opt/xingfutong-java # 确保已经编译过(如果没有,在本地编译好再上传) # 本地编译命令:javac -encoding UTF-8 -d bin -cp "lib/*" $(find src -name "*.java") # 构建镜像 docker build -t sign-server:latest . ``` #### 3. 运行容器 **基础运行(使用代码中的默认配置):** ```bash docker run -d \ --name sm2-sign-server \ -p 8888:8888 \ --restart unless-stopped \ sign-server:latest ``` **传入自定义私钥(通过环境变量):** ```bash docker run -d \ --name sm2-sign-server \ -p 8888:8888 \ -e SM2_PRIVATE_KEY="您的64位十六进制私钥" \ -e SLT_PUBLIC_KEY="您的130位十六进制公钥" \ -e REQ_ORG_NO="您的机构号" \ --restart unless-stopped \ sign-server:latest ``` **使用配置文件:** ```bash # 创建配置文件 cat > config.properties << EOF reqOrgNo=201811200001003 priKey=您的私钥 sltPubKey=您的公钥 EOF # 运行容器并挂载配置文件 docker run -d \ --name sm2-sign-server \ -p 8888:8888 \ -v $(pwd)/config.properties:/app/config.properties:ro \ --restart unless-stopped \ sign-server:latest ``` --- ### 方式二:使用Docker Compose(更简单)⭐⭐ #### 1. 上传项目到服务器(同上) #### 2. 启动服务(一条命令搞定) ```bash cd /opt/xingfutong-java # 构建并启动 docker-compose up -d # 查看日志 docker-compose logs -f ``` #### 3. 停止/重启服务 ```bash # 停止 docker-compose down # 重启 docker-compose restart # 查看状态 docker-compose ps ``` --- ## 管理命令 ### 查看容器状态 ```bash docker ps ``` ### 查看日志 ```bash # 实时查看日志 docker logs -f sm2-sign-server # 查看最近100行 docker logs --tail 100 sm2-sign-server ``` ### 停止容器 ```bash docker stop sm2-sign-server ``` ### 启动容器 ```bash docker start sm2-sign-server ``` ### 重启容器 ```bash docker restart sm2-sign-server ``` ### 删除容器 ```bash docker stop sm2-sign-server docker rm sm2-sign-server ``` ### 进入容器调试 ```bash docker exec -it sm2-sign-server sh ``` --- ## 更新部署 ### 方式1:重新构建镜像 ```bash cd /opt/xingfutong-java # 停止旧容器 docker stop sm2-sign-server docker rm sm2-sign-server # 重新构建镜像 docker build -t sign-server:latest . # 启动新容器 docker run -d \ --name sm2-sign-server \ -p 8888:8888 \ --restart unless-stopped \ sign-server:latest ``` ### 方式2:使用Docker Compose ```bash cd /opt/xingfutong-java # 重新构建并启动 docker-compose up -d --build ``` --- ## 端口和防火墙配置 ### 开放8888端口 **CentOS/RHEL (firewalld):** ```bash firewall-cmd --permanent --add-port=8888/tcp firewall-cmd --reload ``` **Ubuntu/Debian (ufw):** ```bash ufw allow 8888/tcp ufw reload ``` **iptables:** ```bash iptables -A INPUT -p tcp --dport 8888 -j ACCEPT service iptables save ``` ### 修改端口 如果想使用其他端口(比如80): ```bash # 使用Docker端口映射 docker run -d \ --name sm2-sign-server \ -p 80:8888 \ sign-server:latest # 访问时使用: http://your-server/api/sign ``` --- ## 测试部署 ```bash # 健康检查 curl http://localhost:8888/api/health # 或从外部访问 curl http://your-server-ip:8888/api/health # 测试签名接口 curl -X POST http://localhost:8888/api/sign \ -H "Content-Type: application/json" \ -d '{ "data": { "version": "1.0", "txnType": "20250" } }' ``` --- ## 生产环境建议 ### 1. 使用Nginx反向代理(可选) ```nginx # /etc/nginx/conf.d/sign-server.conf server { listen 80; server_name sign.yourdomain.com; location / { proxy_pass http://localhost:8888; 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; } } ``` ### 2. 启用HTTPS(推荐) ```bash # 使用Let's Encrypt apt install certbot python3-certbot-nginx certbot --nginx -d sign.yourdomain.com ``` ### 3. 限制内存和CPU(可选) ```bash docker run -d \ --name sm2-sign-server \ -p 8888:8888 \ --memory="512m" \ --cpus="1.0" \ --restart unless-stopped \ sign-server:latest ``` ### 4. 日志管理 ```bash # 限制日志大小 docker run -d \ --name sm2-sign-server \ -p 8888:8888 \ --log-opt max-size=10m \ --log-opt max-file=3 \ --restart unless-stopped \ sign-server:latest ``` --- ## 监控和告警 ### 使用Docker健康检查 修改Dockerfile添加健康检查: ```dockerfile HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \ CMD wget --quiet --tries=1 --spider http://localhost:8888/api/health || exit 1 ``` ### 查看健康状态 ```bash docker ps # 状态列会显示健康状态 ``` --- ## 常见问题 ### Q1: 容器启动失败? ```bash # 查看详细日志 docker logs sm2-sign-server # 检查端口是否被占用 netstat -tlnp | grep 8888 ``` ### Q2: 无法访问服务? ```bash # 检查容器是否运行 docker ps -a # 检查防火墙 firewall-cmd --list-ports ``` ### Q3: 如何备份镜像? ```bash # 导出镜像 docker save sign-server:latest > sign-server.tar # 在其他服务器导入 docker load < sign-server.tar ``` ### Q4: 内存不足? 使用Alpine Linux的JRE镜像(已使用),镜像大小仅约85MB。 --- ## 一键部署脚本 创建 `deploy.sh`: ```bash #!/bin/bash echo "开始部署SM2签名服务..." # 检查Docker if ! command -v docker &> /dev/null; then echo "错误: 未安装Docker,请先安装Docker" exit 1 fi # 停止旧容器 docker stop sm2-sign-server 2>/dev/null docker rm sm2-sign-server 2>/dev/null # 构建镜像 echo "构建Docker镜像..." docker build -t sign-server:latest . # 启动容器 echo "启动容器..." docker run -d \ --name sm2-sign-server \ -p 8888:8888 \ --restart unless-stopped \ sign-server:latest # 等待启动 sleep 3 # 健康检查 echo "检查服务状态..." curl -s http://localhost:8888/api/health echo "" echo "部署完成!" echo "访问地址: http://$(hostname -I | awk '{print $1}'):8888" ``` 使用方法: ```bash chmod +x deploy.sh ./deploy.sh ``` --- ## 总结 **最简单的部署流程**: 1. 服务器安装Docker 2. 上传项目文件到服务器 3. 执行 `docker-compose up -d` 4. 完成! **优势**: - ✅ 无需安装Java - ✅ 环境隔离,不影响其他服务 - ✅ 一条命令启动 - ✅ 自动重启 - ✅ 易于扩展和迁移 **镜像大小**: 约85MB(使用Alpine Linux)