本文档介绍如何使用 Docker 部署 FeeQuery 应用程序。
- Docker Engine 20.10+ 或 Docker Desktop
- Docker Compose 2.0+(可选,用于 docker-compose 方式部署)
- 至少 2GB 可用磁盘空间
Windows 用户:
docker-build-and-run.batLinux/Mac 用户:
chmod +x docker-build-and-run.sh
./docker-build-and-run.sh脚本会自动完成构建、清理旧容器、启动新容器等操作。
# 构建并启动
docker-compose up -d
# 查看日志
docker-compose logs -f
# 停止服务
docker-compose down# 1. 构建镜像
docker build -t feequery:latest .
# 2. 创建数据目录(持久化数据库)
mkdir -p ./data
# 3. 运行容器
docker run -d \
--name feequery-web \
-p 5000:80 \
-v "$(pwd)/data:/app/data" \
-e ASPNETCORE_ENVIRONMENT=Production \
--restart unless-stopped \
feequery:latest
# 4. 访问应用
# 打开浏览器访问 http://localhost:5000Windows 用户注意:
- 数据目录使用相对路径
./data,自动创建在项目根目录 - 确保 Docker Desktop 有权限访问项目目录
- 在 Docker Desktop 设置中,确认
Settings -> Resources -> File Sharing已包含项目所在驱动器
Linux/Mac 用户:
- 如遇权限问题,可能需要调整目录权限:
chmod -R 755 ./data默认映射主机端口 5000 到容器端口 80。如需修改:
# 使用其他端口(例如 8080)
docker run -d --name feequery-web -p 8080:80 ...或修改 docker-compose.yml 中的 ports 配置。
SQLite 数据库存储在项目根目录的 ./data 目录中,容器重启或重建不会丢失数据。
数据目录结构:
FeeQuery/
├── data/
│ ├── feequery.db # SQLite 数据库文件
│ ├── feequery.db-shm # 共享内存文件
│ └── feequery.db-wal # Write-Ahead Log
├── docker-compose.yml
└── Dockerfile
备份数据库:
# 方式1:直接复制本地文件(推荐)
cp -r ./data ./backup/data-$(date +%Y%m%d-%H%M%S)
# 方式2:从容器复制
docker cp feequery-web:/app/data/feequery.db ./backup/
# 方式3:压缩备份
tar czf feequery-backup-$(date +%Y%m%d-%H%M%S).tar.gz ./data恢复数据库:
# 方式1:直接复制本地文件(推荐)
# 停止容器
docker stop feequery-web
# 恢复数据
rm -rf ./data
cp -r ./backup/data-20241211-120000 ./data
# 启动容器
docker start feequery-web
# 方式2:从备份文件解压
tar xzf feequery-backup-20241211-120000.tar.gz
# 方式3:从容器复制
docker stop feequery-web
docker cp ./backup/feequery.db feequery-web:/app/data/
docker start feequery-web迁移数据:
# 将数据移动到其他位置
docker stop feequery-web
mv ./data /path/to/new/location/data
# 修改 docker-compose.yml 中的卷挂载路径
# volumes:
# - /path/to/new/location/data:/app/data
docker start feequery-web可以通过环境变量自定义配置:
docker run -d \
--name feequery-web \
-p 5000:80 \
-v "$(pwd)/data:/app/data" \
-e ConnectionStrings__DefaultConnection="Data Source=/app/data/feequery.db" \
-e DatabaseProvider=Sqlite \
-e ASPNETCORE_ENVIRONMENT=Production \
-e Logging__LogLevel__Default=Information \
-e TZ=Asia/Shanghai \
feequery:latest如果需要更复杂的配置,可以挂载 appsettings.Production.json:
- 创建配置文件:
{
"ConnectionStrings": {
"DefaultConnection": "Data Source=/app/data/feequery.db"
},
"DatabaseProvider": "Sqlite",
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}- 挂载到容器:
docker run -d \
--name feequery-web \
-p 5000:80 \
-v "$(pwd)/data:/app/data" \
-v "$(pwd)/appsettings.Production.json:/app/appsettings.Production.json:ro" \
feequery:latest- 修改
docker-compose.yml,添加 PostgreSQL 服务:
services:
postgres:
image: postgres:16
container_name: feequery-postgres
environment:
POSTGRES_DB: feequery
POSTGRES_USER: feequery
POSTGRES_PASSWORD: your_password
volumes:
- postgres-data:/var/lib/postgresql/data
networks:
- feequery-network
feequery-web:
# ... 其他配置
environment:
- ConnectionStrings__DefaultConnection=Host=postgres;Database=feequery;Username=feequery;Password=your_password
- DatabaseProvider=PostgreSQL
depends_on:
- postgres
volumes:
postgres-data:services:
mysql:
image: mysql:8.0
container_name: feequery-mysql
environment:
MYSQL_DATABASE: feequery
MYSQL_USER: feequery
MYSQL_PASSWORD: your_password
MYSQL_ROOT_PASSWORD: root_password
volumes:
- mysql-data:/var/lib/mysql
networks:
- feequery-network
feequery-web:
# ... 其他配置
environment:
- ConnectionStrings__DefaultConnection=Server=mysql;Database=feequery;User=feequery;Password=your_password
- DatabaseProvider=MySQL
depends_on:
- mysql
volumes:
mysql-data:# 查看容器状态
docker ps -a
# 查看实时日志
docker logs -f feequery-web
# 查看最近 100 行日志
docker logs --tail 100 feequery-web
# 进入容器内部(调试用)
docker exec -it feequery-web /bin/bash
# 重启容器
docker restart feequery-web
# 停止容器
docker stop feequery-web
# 启动容器
docker start feequery-web
# 删除容器
docker rm -f feequery-web# 查看镜像
docker images | grep feequery
# 删除镜像
docker rmi feequery:latest
# 清理未使用的镜像
docker image prune -a# 查看容器资源使用情况
docker stats feequery-web
# 查看容器详细信息
docker inspect feequery-web- 查看容器日志:
docker logs feequery-web- 检查端口是否被占用:
# Windows
netstat -ano | findstr :5000
# Linux/Mac
lsof -i :5000- 检查数据卷权限:
docker exec -it feequery-web ls -la /app/data- 确认数据库文件存在:
docker exec -it feequery-web ls -la /app/data/feequery.db- 检查环境变量配置:
docker exec -it feequery-web env | grep ConnectionStrings- 手动运行数据库迁移:
docker exec -it feequery-web dotnet ef database update- 检查容器是否运行:
docker ps | grep feequery-web- 检查端口映射:
docker port feequery-web- 测试容器内部应用:
docker exec -it feequery-web curl http://localhost:80- 修改默认端口:避免使用默认的 5000 端口
- 使用 HTTPS:生产环境建议配置反向代理(Nginx/Traefik)并启用 HTTPS
- 限制容器权限:避免使用
--privileged标志 - 定期更新:及时更新基础镜像和依赖包
- 环境变量保护:敏感信息使用 Docker Secrets 或环境变量文件
- 网络隔离:使用自定义网络限制容器间通信
server {
listen 80;
server_name your-domain.com;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
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;
}
}创建 docker-compose.prod.yml:
version: '3.8'
services:
feequery-web:
image: feequery:latest
restart: always
deploy:
resources:
limits:
cpus: '2'
memory: 2G
reservations:
cpus: '0.5'
memory: 512M启动:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d- 配置云厂商账号
- 设置费用预警规则
- 配置通知渠道(邮件、钉钉等)
- 查看完整文档了解更多功能
如遇到问题,请检查:
- Docker 日志:
docker logs feequery-web - 应用日志:在容器内查看
/app/logs目录 - 项目文档:
CLAUDE.md
祝使用愉快! 🎉