1. 项目概述
今天要分享的是一个基于Docker的AI智能面试系统部署实战。这个项目整合了阿里云百炼的AI能力,能够实现简历解析、智能问答等核心功能。作为一名经历过多次云原生项目部署的老兵,我会把这次在CentOS7环境下的完整部署过程,特别是那些官方文档不会告诉你的"坑"和解决方案,毫无保留地分享给大家。
这个系统采用典型的微服务架构,包含前端Vue应用、SpringBoot后端、PostgreSQL数据库、Redis缓存以及MinIO对象存储服务。部署过程中我们会遇到镜像拉取超时、IPv6连接问题、存储桶配置等典型挑战。通过本文,你将掌握:
- 生产级Docker环境配置技巧
- Docker Compose多服务编排实战
- 云服务API集成常见问题处理
- 容器网络问题诊断与修复
2. 环境准备
2.1 虚拟机基础配置
推荐使用VMware创建CentOS7虚拟机,配置建议:
- 至少2核CPU
- 4GB内存
- 50GB磁盘空间
- 网络选择NAT模式(便于宿主机访问)
注意:如果使用云服务器,请确保安全组开放以下端口:80、8080、9000、9001、5432、6379
2.2 Docker安装与优化
安装Docker CE的完整命令如下:
bash复制# 安装依赖工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加官方仓库(国内机器推荐使用阿里云镜像)
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装Docker引擎
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
# 验证安装
docker -v
国内环境强烈建议立即配置镜像加速:
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.m.daocloud.io",
"https://hub-mirror.c.163.com",
"https://mirror.ccs.tencentyun.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF
# 重启生效
sudo systemctl daemon-reload
sudo systemctl restart docker
2.3 Docker Compose安装
现代Docker版本已内置Compose插件,无需单独安装:
bash复制# 验证是否可用
docker compose version
# 如果提示命令不存在,则安装插件
sudo yum install -y docker-compose-plugin
3. 项目部署实战
3.1 获取项目代码
当GitHub连接不稳定时,推荐以下两种方式:
方式一:通过国内镜像克隆
bash复制git clone https://hub.fastgit.org/Snailclimb/interview-guide.git
方式二:直接下载压缩包
bash复制# 下载ZIP包
curl -L https://codeload.github.com/Snailclimb/interview-guide/zip/refs/heads/master -o interview-guide.zip
# 安装解压工具
yum install -y unzip
# 解压并进入目录
unzip interview-guide.zip
cd interview-guide-master
3.2 配置文件准备
关键配置步骤:
bash复制# 复制环境变量模板
cp .env.example .env
# 编辑配置文件
vi .env
需要修改的核心参数:
code复制AI_BAILIAN_API_KEY=your_actual_key_here # 阿里云百炼API密钥
MINIO_ROOT_USER=minioadmin # MinIO管理员账号
MINIO_ROOT_PASSWORD=minioadmin # MinIO管理员密码
实操技巧:在vi编辑器中,使用
/AI_BAILIAN快速定位到需要修改的行,按i进入编辑模式,修改后按ESC输入:wq保存退出。
3.3 服务启动与问题排查
首次启动命令:
bash复制docker compose up -d --build
常见问题1:镜像拉取失败
症状:
code复制Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled
解决方案:
- 确认已配置镜像加速
- 检查网络连通性:
bash复制
ping docker.m.daocloud.io - 手动拉取基础镜像:
bash复制
docker pull postgres:13-alpine docker pull redis:6-alpine
常见问题2:存储桶不存在
症状:
code复制The specified bucket does not exist (Service: S3, Status Code: 404)
解决方案:
- 访问MinIO控制台:http://服务器IP:9001
- 使用默认账号登录(minioadmin/minioadmin)
- 创建名为
interview-guide的存储桶 - 设置Bucket权限为public
3.4 网络问题深度解决
问题现象:
code复制Failed to resolve 'dashscope.aliyuncs.com'
java.net.UnknownHostException
解决方案分步实施:
- 添加DNS配置
修改docker-compose.yml,在app服务下添加:
yaml复制services:
app:
dns:
- 8.8.8.8
- 114.114.114.114
- 强制IPv4协议
在同一个配置文件中添加环境变量:
yaml复制environment:
JAVA_TOOL_OPTIONS: -Djava.net.preferIPv4Stack=true
- 应用配置变更
bash复制docker compose down
docker compose up -d --build
4. 服务验证与监控
4.1 基础服务检查
bash复制# 查看所有容器状态
docker compose ps
# 检查后端日志
docker compose logs -f app
# 检查前端日志
docker compose logs -f frontend
预期输出应包含:
- 后端:SpringBoot启动成功的标志
- 前端:Webpack编译成功信息
- 数据库:正常连接日志
4.2 接口测试
-
访问Swagger文档:
http://服务器IP:8080/swagger-ui.html -
测试简历上传接口:
bash复制curl -X POST -F "file=@resume.pdf" http://localhost:8080/api/resume/upload -
验证AI问答功能:
bash复制curl -X POST -H "Content-Type: application/json" -d '{"question":"请做自我介绍"}' http://localhost:8080/api/ai/chat
4.3 资源监控
bash复制# 查看容器资源占用
docker stats
# 检查服务健康状态
curl http://localhost:8080/actuator/health
5. 生产环境优化建议
5.1 安全加固措施
-
修改默认凭证:
- MinIO管理员密码
- PostgreSQL数据库密码
- Redis访问密码
-
限制网络暴露:
yaml复制# 在docker-compose.yml中添加 ports: - "127.0.0.1:5432:5432" # 仅本地访问 -
启用HTTPS:
nginx复制server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /path/to/cert.pem; ssl_certificate_key /path/to/key.pem; location / { proxy_pass http://frontend:80; } }
5.2 性能调优参数
-
JVM内存配置:
yaml复制environment: JAVA_OPTS: "-Xms512m -Xmx1024m -XX:MaxRAMPercentage=75.0" -
数据库连接池优化:
properties复制spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.connection-timeout=30000 -
Redis缓存配置:
yaml复制services: redis: command: redis-server --maxmemory 256mb --maxmemory-policy allkeys-lru
6. 故障排查手册
6.1 常见问题速查表
| 症状 | 可能原因 | 解决方案 |
|---|---|---|
| 上传卡在"处理中" | MinIO存储桶未创建 | 登录9001端口创建bucket |
| API返回404 | 服务未启动或端口冲突 | 检查docker compose ps |
| 数据库连接失败 | 密码错误或网络隔离 | 验证.env配置,检查网络 |
| AI服务不可用 | API密钥无效或配额耗尽 | 检查阿里云控制台 |
6.2 日志分析技巧
-
关键日志位置:
bash复制# 后端错误日志 docker exec -it interview-app tail -f /app/logs/application.log # 数据库日志 docker compose logs -f postgres -
典型错误模式:
Connection refused:服务未启动Timeout:网络或资源不足401 Unauthorized:认证失败
6.3 应急恢复步骤
-
服务重启:
bash复制
docker compose restart app -
完全重建:
bash复制
docker compose down -v docker compose up -d --build -
数据备份:
bash复制# 备份数据库 docker exec -it postgres pg_dump -U postgres interview > backup.sql # 备份MinIO数据 docker cp minio:/data ./minio_backup
在部署过程中遇到最棘手的问题是Netty的IPv6协议栈问题,这个在Java容器化应用中相当典型。经过多次测试发现,单纯配置DNS还不够,必须强制JVM使用IPv4协议栈才能稳定连接外部API。这个经验也让我意识到,容器网络问题需要从多个层面进行排查:物理网络、宿主机配置、容器网络模式、应用运行时环境等。