部署说明.md 7.3 KB

Docker部署说明

前置要求

服务器上只需要安装 Docker 即可,不需要Java环境!

安装Docker(如果未安装)

CentOS/RHEL:

curl -fsSL https://get.docker.com | sh
systemctl start docker
systemctl enable docker

Ubuntu/Debian:

curl -fsSL https://get.docker.com | sh
systemctl start docker
systemctl enable docker

Docker版本检查:

docker --version

部署方式

方式一:使用Dockerfile(推荐)⭐

1. 上传项目到服务器

# 方式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镜像

cd /opt/xingfutong-java

# 确保已经编译过(如果没有,在本地编译好再上传)
# 本地编译命令:javac -encoding UTF-8 -d bin -cp "lib/*" $(find src -name "*.java")

# 构建镜像
docker build -t sign-server:latest .

3. 运行容器

基础运行(使用代码中的默认配置):

docker run -d \
  --name sm2-sign-server \
  -p 8888:8888 \
  --restart unless-stopped \
  sign-server:latest

传入自定义私钥(通过环境变量):

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

使用配置文件:

# 创建配置文件
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. 启动服务(一条命令搞定)

cd /opt/xingfutong-java

# 构建并启动
docker-compose up -d

# 查看日志
docker-compose logs -f

3. 停止/重启服务

# 停止
docker-compose down

# 重启
docker-compose restart

# 查看状态
docker-compose ps

管理命令

查看容器状态

docker ps

查看日志

# 实时查看日志
docker logs -f sm2-sign-server

# 查看最近100行
docker logs --tail 100 sm2-sign-server

停止容器

docker stop sm2-sign-server

启动容器

docker start sm2-sign-server

重启容器

docker restart sm2-sign-server

删除容器

docker stop sm2-sign-server
docker rm sm2-sign-server

进入容器调试

docker exec -it sm2-sign-server sh

更新部署

方式1:重新构建镜像

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

cd /opt/xingfutong-java

# 重新构建并启动
docker-compose up -d --build

端口和防火墙配置

开放8888端口

CentOS/RHEL (firewalld):

firewall-cmd --permanent --add-port=8888/tcp
firewall-cmd --reload

Ubuntu/Debian (ufw):

ufw allow 8888/tcp
ufw reload

iptables:

iptables -A INPUT -p tcp --dport 8888 -j ACCEPT
service iptables save

修改端口

如果想使用其他端口(比如80):

# 使用Docker端口映射
docker run -d \
  --name sm2-sign-server \
  -p 80:8888 \
  sign-server:latest

# 访问时使用: http://your-server/api/sign

测试部署

# 健康检查
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反向代理(可选)

# /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(推荐)

# 使用Let's Encrypt
apt install certbot python3-certbot-nginx
certbot --nginx -d sign.yourdomain.com

3. 限制内存和CPU(可选)

docker run -d \
  --name sm2-sign-server \
  -p 8888:8888 \
  --memory="512m" \
  --cpus="1.0" \
  --restart unless-stopped \
  sign-server:latest

4. 日志管理

# 限制日志大小
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添加健康检查:

HEALTHCHECK --interval=30s --timeout=3s --start-period=10s --retries=3 \
  CMD wget --quiet --tries=1 --spider http://localhost:8888/api/health || exit 1

查看健康状态

docker ps
# 状态列会显示健康状态

常见问题

Q1: 容器启动失败?

# 查看详细日志
docker logs sm2-sign-server

# 检查端口是否被占用
netstat -tlnp | grep 8888

Q2: 无法访问服务?

# 检查容器是否运行
docker ps -a

# 检查防火墙
firewall-cmd --list-ports

Q3: 如何备份镜像?

# 导出镜像
docker save sign-server:latest > sign-server.tar

# 在其他服务器导入
docker load < sign-server.tar

Q4: 内存不足?

使用Alpine Linux的JRE镜像(已使用),镜像大小仅约85MB。


一键部署脚本

创建 deploy.sh:

#!/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"

使用方法:

chmod +x deploy.sh
./deploy.sh

总结

最简单的部署流程

  1. 服务器安装Docker
  2. 上传项目文件到服务器
  3. 执行 docker-compose up -d
  4. 完成!

优势

  • ✅ 无需安装Java
  • ✅ 环境隔离,不影响其他服务
  • ✅ 一条命令启动
  • ✅ 自动重启
  • ✅ 易于扩展和迁移

镜像大小: 约85MB(使用Alpine Linux)