diff --git a/Makefile b/Makefile index 4e7999a..64aa6d3 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ # Hyperledger Fabric Asset Transfer API Makefile -.PHONY: help build run test clean swagger docker-build docker-run lint fmt vet tidy env-setup +.PHONY: help build run test clean swagger docker-build docker-run docker-compose-up docker-compose-down docker-compose-logs lint fmt vet tidy env-setup # Default target help: ## Show this help message @@ -23,7 +23,7 @@ env-setup: ## Setup environment configuration files # Build the application build: ## Build the application binary @echo "Building application..." - go build -o bin/asset-transfer-api cmd/server/main.go + go build -o bin/spiderman cmd/server/main.go # Run the application run: ## Run the application @@ -65,7 +65,7 @@ swagger: ## Generate swagger documentation # Build docker image docker-build: ## Build docker image @echo "Building docker image..." - docker build -t spiderman . + docker build -t spiderman -f docker/Dockerfile . # Run docker container docker-run: ## Run docker container @@ -77,6 +77,21 @@ docker-run-dev: ## Run docker container in development mode @echo "Running docker container in development mode..." docker run -p 8080:8080 -e ENVIRONMENT=development spiderman +# Run with docker-compose +docker-compose-up: ## Run with docker-compose + @echo "Starting services with docker-compose..." + cd docker && docker-compose up -d + +# Stop docker-compose services +docker-compose-down: ## Stop docker-compose services + @echo "Stopping docker-compose services..." + cd docker && docker-compose down + +# View docker-compose logs +docker-compose-logs: ## View docker-compose logs + @echo "Viewing docker-compose logs..." + cd docker && docker-compose logs -f + # Run linting lint: ## Run golangci-lint @echo "Running linter..." diff --git a/README.md b/README.md index 687592d..160ff27 100644 --- a/README.md +++ b/README.md @@ -368,23 +368,23 @@ curl -X PUT http://localhost:8080/api/v1/assets/asset123/transfer \ ```bash # 构建镜像 -docker build -t asset-transfer-api . +docker build -t spiderman -f docker/Dockerfile . # 运行容器 -docker run -p 8080:8080 asset-transfer-api +docker run -p 8080:8080 spiderman ``` ### 使用Docker Compose ```bash # 启动服务 -docker-compose up -d +cd docker && docker-compose up -d # 查看日志 -docker-compose logs -f +cd docker && docker-compose logs -f # 停止服务 -docker-compose down +cd docker && docker-compose down ``` ## 项目结构 @@ -400,8 +400,10 @@ docker-compose down │ └── swagger.yaml # YAML格式API规范 ├── go.mod # Go模块配置 ├── go.sum # 依赖项校验和 -├── Dockerfile # Docker镜像构建文件 -├── docker-compose.yml # Docker Compose配置 +├── docker/ # Docker相关文件 +│ ├── Dockerfile # Docker镜像构建文件 +│ ├── docker-compose.yml # Docker Compose配置 +│ └── DOCKER_GUIDE.md # Docker使用指南 ├── start.sh # 启动脚本 ├── test_api.sh # API测试脚本 └── README.md # 项目文档 diff --git a/docker/DOCKER_GUIDE.md b/docker/DOCKER_GUIDE.md new file mode 100644 index 0000000..e4f618b --- /dev/null +++ b/docker/DOCKER_GUIDE.md @@ -0,0 +1,184 @@ +# Spiderman Docker 使用指南 + +## 镜像信息 + +- **镜像名称**: `spiderman` +- **镜像大小**: 66.2MB +- **版本标签**: `latest`, `v1.0.0` +- **基础镜像**: Alpine Linux 3.18 +- **Go版本**: 1.23 + +## 构建Docker镜像 + +### 1. 构建镜像 +```bash +docker build -t spiderman:latest . +``` + +### 2. 构建并添加版本标签 +```bash +docker build -t spiderman:latest . +docker tag spiderman:latest spiderman:v1.0.0 +``` + +## 运行Docker容器 + +### 1. 基本运行 +```bash +docker run -p 8080:8080 spiderman:latest +``` + +### 2. 后台运行 +```bash +docker run -d -p 8080:8080 --name spiderman-api spiderman:latest +``` + +### 3. 环境变量配置运行 +```bash +docker run -p 8080:8080 \ + -e PORT=8080 \ + -e CHAINCODE_NAME=basic \ + -e CHANNEL_NAME=mychannel \ + -e LOG_LEVEL=info \ + -e LOG_FORMAT=json \ + spiderman:latest +``` + +### 4. 挂载Fabric证书目录 +```bash +docker run -p 8080:8080 \ + -v /path/to/crypto-config:/crypto-config:ro \ + -v /path/to/test-network:/test-network:ro \ + spiderman:latest +``` + +## 使用Docker Compose + +### 启动服务 +```bash +docker-compose up -d +``` + +### 查看日志 +```bash +docker-compose logs -f spiderman-api +``` + +### 停止服务 +```bash +docker-compose down +``` + +## 健康检查 + +容器包含内置健康检查,每30秒检查一次API健康状态: + +```bash +# 检查容器健康状态 +docker ps +# 或 +docker inspect --format='{{.State.Health.Status}}' +``` + +## 端口说明 + +- **8080**: API服务端口 +- **健康检查**: `GET /health` +- **Swagger文档**: `GET /swagger/index.html` + +## 容器特性 + +- ✅ 多阶段构建,最小化镜像大小 +- ✅ 非root用户运行,增强安全性 +- ✅ 内置健康检查 +- ✅ CA证书支持HTTPS请求 +- ✅ 支持环境变量配置 + +## 环境变量 + +| 变量名 | 默认值 | 说明 | +|--------|--------|------| +| `PORT` | 8080 | API服务端口 | +| `CHAINCODE_NAME` | basic | 链码名称 | +| `CHANNEL_NAME` | mychannel | 通道名称 | +| `LOG_LEVEL` | info | 日志级别 | +| `LOG_FORMAT` | text | 日志格式 | +| `CRYPTO_PATH` | /crypto-config | 证书路径 | +| `PEER_ENDPOINT` | localhost:7051 | Peer节点地址 | +| `GATEWAY_PEER` | peer0.org1.example.com | 网关Peer | +| `MSPID` | Org1MSP | MSP ID | + +## 容器管理 + +### 查看运行中的容器 +```bash +docker ps | grep spiderman +``` + +### 查看容器日志 +```bash +docker logs +``` + +### 进入容器 +```bash +docker exec -it /bin/sh +``` + +### 停止容器 +```bash +docker stop +``` + +### 删除容器 +```bash +docker rm +``` + +## 镜像管理 + +### 查看镜像 +```bash +docker images | grep spiderman +``` + +### 删除镜像 +```bash +docker rmi spiderman:latest +``` + +### 导出镜像 +```bash +docker save spiderman:latest -o spiderman.tar +``` + +### 导入镜像 +```bash +docker load -i spiderman.tar +``` + +## 故障排除 + +### 1. 容器启动失败 +```bash +# 查看容器日志 +docker logs + +# 检查环境变量 +docker inspect +``` + +### 2. 网络连接问题 +```bash +# 检查端口映射 +docker port + +# 检查网络连接 +docker exec -it wget -O- http://localhost:8080/health +``` + +### 3. 证书路径问题 +```bash +# 检查挂载的证书目录 +docker exec -it ls -la /crypto-config +``` \ No newline at end of file diff --git a/Dockerfile b/docker/Dockerfile similarity index 100% rename from Dockerfile rename to docker/Dockerfile diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000..19e869e --- /dev/null +++ b/docker/README.md @@ -0,0 +1,73 @@ +# Docker 配置文件 + +这个目录包含了Spiderman项目的所有Docker相关配置文件。 + +## 文件说明 + +### Dockerfile +多阶段构建的Docker镜像配置文件: +- 基于Alpine Linux,镜像大小仅66.2MB +- 非root用户运行,增强安全性 +- 内置健康检查 +- 支持环境变量配置 + +### docker-compose.yml +Docker Compose服务编排配置: +- 服务名:`spiderman-api` +- 端口映射:`8888:8888` +- 环境变量配置 +- 健康检查 +- 重启策略 + +### DOCKER_GUIDE.md +详细的Docker使用指南,包含: +- 镜像构建说明 +- 容器运行方法 +- 环境变量配置 +- 故障排除指南 + +## 快速开始 + +### 构建镜像 +```bash +# 在项目根目录执行 +docker build -t spiderman -f docker/Dockerfile . +``` + +### 运行容器 +```bash +# 单独运行 +docker run -p 8888:8888 spiderman + +# 使用docker-compose +cd docker && docker-compose up -d +``` + +### 使用Makefile +```bash +# 构建镜像 +make docker-build + +# 运行容器 +make docker-run + +# 使用docker-compose +make docker-compose-up +``` + +## 端口说明 + +- **8888**: API服务端口(可通过环境变量PORT修改) +- **健康检查**: `GET /health` +- **Swagger文档**: `GET /swagger/index.html` + +## 环境变量 + +主要环境变量配置: +- `PORT`: 服务端口 (默认: 8888) +- `CHAINCODE_NAME`: 链码名称 (默认: basic) +- `CHANNEL_NAME`: 通道名称 (默认: mychannel) +- `LOG_LEVEL`: 日志级别 (默认: info) +- `LOG_FORMAT`: 日志格式 (默认: json) + +详细配置请参考 `DOCKER_GUIDE.md`。 \ No newline at end of file diff --git a/docker-compose.yml b/docker/docker-compose.yml similarity index 78% rename from docker-compose.yml rename to docker/docker-compose.yml index 95e594d..9cd79a7 100644 --- a/docker-compose.yml +++ b/docker/docker-compose.yml @@ -1,12 +1,12 @@ version: '3.8' services: - asset-transfer-api: - build: . + spiderman-api: + image: spiderman:latest ports: - - "8080:8080" + - "8888:8888" environment: - - PORT=8080 + - PORT=8888 - CHAINCODE_NAME=basic - CHANNEL_NAME=mychannel - LOG_LEVEL=info @@ -18,12 +18,11 @@ services: - fabric-network restart: unless-stopped healthcheck: - test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080/health"] + test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8888/health"] interval: 30s timeout: 10s retries: 3 start_period: 40s networks: - fabric-network: - external: true \ No newline at end of file + fabric-network: \ No newline at end of file diff --git a/test_docker.sh b/test_docker.sh new file mode 100755 index 0000000..4193c94 --- /dev/null +++ b/test_docker.sh @@ -0,0 +1,77 @@ +#!/bin/bash + +echo "=== Spiderman Docker 镜像测试 ===" +echo + +# 检查Docker是否运行 +if ! docker info > /dev/null 2>&1; then + echo "❌ Error: Docker is not running" + exit 1 +fi + +# 检查镜像是否存在 +if ! docker images | grep -q "spiderman"; then + echo "❌ Error: spiderman Docker image not found" + echo "Please run: docker build -t spiderman:latest -f docker/Dockerfile ." + exit 1 +fi + +echo "✅ Docker is running" +echo "✅ Spiderman image found" +echo + +# 显示镜像信息 +echo "📋 Image Information:" +docker images | head -n 1 +docker images | grep spiderman +echo + +# 检查镜像大小 +IMAGE_SIZE=$(docker images spiderman:latest --format "{{.Size}}") +echo "📏 Image Size: $IMAGE_SIZE" +echo + +# 测试容器启动(快速测试) +echo "🚀 Testing container startup..." +CONTAINER_ID=$(docker run -d -p 8888:8080 spiderman:latest) + +if [ $? -eq 0 ]; then + echo "✅ Container started successfully" + echo "📦 Container ID: $CONTAINER_ID" + + # 等待容器启动 + echo "⏳ Waiting for container to be ready..." + sleep 3 + + # 检查容器状态 + STATUS=$(docker ps --filter "id=$CONTAINER_ID" --format "{{.Status}}") + echo "📊 Container Status: $STATUS" + + # 测试健康检查端点(如果容器正在运行) + if docker ps | grep -q $CONTAINER_ID; then + echo "🏥 Testing health endpoint..." + # 注意:这需要容器能够正常启动,如果没有Fabric网络可能会失败 + # docker exec $CONTAINER_ID wget -O- http://localhost:8080/health 2>/dev/null || echo "⚠️ Health check failed (expected without Fabric network)" + echo "⚠️ Health check skipped (requires Fabric network configuration)" + fi + + # 清理容器 + echo "🧹 Cleaning up test container..." + docker stop $CONTAINER_ID > /dev/null + docker rm $CONTAINER_ID > /dev/null + echo "✅ Test container cleaned up" + +else + echo "❌ Container failed to start" + exit 1 +fi + +echo +echo "=== 测试完成 ===" +echo "✅ Docker镜像构建成功!" +echo +echo "使用方法:" +echo " docker run -p 8080:8080 spiderman:latest" +echo " cd docker && docker-compose up -d" +echo +echo "更多信息请查看 docker/DOCKER_GUIDE.md" \ No newline at end of file