Ubuntu 下 Docker + Ollama 轻量模型 + IDEA 连接远程 Docker 完整总结文档
适用场景:Windows 主机 + VMware Ubuntu 虚拟机 + IDEA 开发 + 本地 AI 服务(Ollama)
目标:在 Windows 上用 IDEA 开发,调用虚拟机里的本地 AI 模型,全程免费、无需 Token。
一、整体架构
┌───────────────────────────────────────────────────────────┐
│ Windows 主机 │
│ ┌─────────────────────────────────────────────────┐ │
│ │ IntelliJ IDEA (Spring Boot + Spring AI) │ │
│ │ 调用: http://192.168.160.128:11434 (Ollama) │ │
│ └────────────────┬────────────────────────────────┘ │
│ │ HTTP / Docker Remote API │
│ ▼ │
│ ┌────────────────────────────────┐ │
│ │ Ubuntu 虚拟机 (192.168.160.128)│ │
│ │ ┌──────────────────────────┐ │ │
│ │ │ Docker 容器: Ollama │ │ 端口 11434 │
│ │ │ 模型: qwen2.5:1.5b │ │ │
│ │ └──────────────────────────┘ │ │
│ │ ┌──────────────────────────┐ │ │
│ │ │ Docker 守护进程 (2376) │ │ TLS 加密 │
│ │ └──────────────────────────┘ │ │
│ └────────────────────────────────┘ │
└───────────────────────────────────────────────────────────┘
核心价值:
- 所有 AI 推理在本地完成,免费、私密、可离线
- 无需申请任何 API Token,无使用次数限制
- 在 Windows 上用最顺手的 IDEA 开发,计算资源在虚拟机里
二、Ubuntu 虚拟机准备
2.1 硬件建议
| 资源 | 最低要求 | 本次实际配置 |
|---|---|---|
| 内存 | 4GB(跑 1.5B 模型) | 剩余 1.5GB |
| 硬盘 | 15GB | 剩余 10GB+ |
| 网络 | 桥接或 NAT | NAT(IP: 192.168.160.128) |
2.2 查看虚拟机 IP
bash
hostname -I
# 示例输出:192.168.160.128
2.3 硬盘扩容(VMware 分配后需在系统内扩展)
bash
# 1. 安装 growpart 工具
sudo apt update
sudo apt install cloud-guest-utils
# 2. 扩展分区(/dev/sda2 是系统分区)
sudo growpart /dev/sda 2
# 3. 扩展文件系统(ext4)
sudo resize2fs /dev/sda2
# 4. 验证
df -h /
三、Docker 安装与配置
3.1 安装 Docker
bash
# 官方脚本一键安装(国内可换源)
curl -fsSL https://get.docker.com | sudo sh
# 将当前用户加入 docker 组(免 sudo)
sudo usermod -aG docker $USER
newgrp docker
# 验证
docker version
3.2 配置镜像加速器 + TLS 远程访问
编辑 /etc/docker/daemon.json:
bash
sudo nano /etc/docker/daemon.json
写入以下内容:
json
{
"registry-mirrors": [
"https://registry.cn-hangzhou.aliyuncs.com",
"https://docker.m.daocloud.io",
"https://docker.nju.edu.cn"
],
"dns": ["114.114.114.114", "223.5.5.5"],
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"],
"tls": true,
"tlscert": "/home/ubuntu/.docker/certs/server-cert.pem",
"tlskey": "/home/ubuntu/.docker/certs/server-key.pem",
"tlscacert": "/home/ubuntu/.docker/certs/ca.pem"
}
⚠️ 注意 :
2375是未加密端口,已被 Docker 官方弃用,必须用 2376。
3.3 生成 TLS 证书
bash
# 1. 创建证书目录
mkdir -p ~/.docker/certs
cd ~/.docker/certs
# 2. 获取虚拟机 IP
VM_IP=$(hostname -I | awk '{print $1}')
# 3. 生成 CA 私钥和证书
openssl genrsa -aes256 -out ca-key.pem 4096
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
# 4. 生成服务器私钥和证书签名请求
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=$(hostname)" -sha256 -new -key server-key.pem -out server.csr
# 5. 生成 SAN 配置(关键:必须包含虚拟机 IP 和 127.0.0.1)
echo "subjectAltName = IP:${VM_IP},IP:127.0.0.1,DNS:localhost" > extfile.cnf
# 6. 生成服务器证书
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
# 7. 生成客户端证书
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
echo extendedKeyUsage = clientAuth > extfile-client.cnf
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf
# 8. 设置权限
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem
# 9. 验证 SAN 是否包含正确 IP
openssl x509 -in server-cert.pem -text -noout | grep -A 1 "Subject Alternative Name"
3.4 解决 systemd 与 hosts 配置冲突
因为配置文件里指定了 hosts,会与 systemd 默认的 -H fd:// 冲突,需要覆盖 systemd 配置:
bash
# 1. 创建覆盖目录
sudo mkdir -p /etc/systemd/system/docker.service.d
# 2. 创建覆盖文件
sudo nano /etc/systemd/system/docker.service.d/override.conf
写入:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd
3.5 重启 Docker 并验证
bash
sudo systemctl daemon-reload
sudo systemctl restart docker
# 检查状态
sudo systemctl status docker
# 应该看到:
# Active: active (running)
# API listen on /var/run/docker.sock
# API listen on [::]:2376
四、Ollama 部署与模型拉取
4.1 启动 Ollama 容器
bash
docker run -d \
--name ollama \
-p 11434:11434 \
-v ollama_data:/root/.ollama \
--memory="1.5g" \
ollama/ollama
💡
--memory="1.5g"限制容器最大内存,防止吃光虚拟机内存。
4.2 验证容器运行
bash
docker ps
# 应看到 ollama 容器状态为 Up
4.3 拉取轻量级模型
⚠️ 重要经验 :不要用
qwen2.5:1.5b-q4_K_M或q4_0这类标签,Ollama 官方库不存在 这些标签,会报file does not exist。直接用基础标签即可。
bash
# 正确命令(约 986MB)
docker exec -it ollama ollama pull qwen2.5:1.5b
可选的其他轻量模型:
| 模型 | 大小 | 特点 |
|---|---|---|
qwen2.5:1.5b |
~986MB | 中文强,推荐 ✅ |
tinyllama |
~600MB | 超小,英文为主 |
llama3.2:3b |
~2GB | 综合能力好,内存需求更高 |
4.4 测试模型
bash
docker exec -it ollama ollama run qwen2.5:1.5b "你好,请介绍一下自己"
4.5 通过 API 测试(在虚拟机内)
bash
curl http://localhost:11434/api/generate -d '{
"model": "qwen2.5:1.5b",
"prompt": "用一句话介绍Java",
"stream": false
}'
五、Windows 连接 Ubuntu Docker
5.1 下载 Windows 版 Docker CLI
正确的下载地址(Windows 版,不是 Linux 版):
https://download.docker.com/win/static/stable/x86_64/
下载最新的 .zip 包,解压得到 docker.exe,放到例如 D:\lvyy_soft\docker\。
❌ 之前误下的
https://download.docker.com/linux/static/stable/是 Linux 版,解压出的文件没有.exe后缀,Windows 上无法运行。
5.2 添加到系统 PATH
Win + R→ 输入sysdm.cpl- 高级 → 环境变量 → 系统变量 →
Path→ 编辑 - 新建 → 填入
D:\lvyy_soft\docker - 确定保存,重开 PowerShell 生效
5.3 复制证书到 Windows
在虚拟机中查看证书内容:
bash
cat ~/.docker/certs/ca.pem
cat ~/.docker/certs/cert.pem
cat ~/.docker/certs/key.pem
在 Windows 上创建目录 D:\docker_auth\,将三个文件内容分别保存为:
D:\docker_auth\ca.pemD:\docker_auth\cert.pemD:\docker_auth\key.pem
或用 SCP 直接复制(Windows PowerShell):
powershell
mkdir D:\docker_auth
scp ubuntu@192.168.160.128:~/.docker/certs/ca.pem D:\docker_auth\
scp ubuntu@192.168.160.128:~/.docker/certs/cert.pem D:\docker_auth\
scp ubuntu@192.168.160.128:~/.docker/certs/key.pem D:\docker_auth\
5.4 设置环境变量并验证
powershell
# 临时设置(当前窗口有效)
$env:DOCKER_HOST = "tcp://192.168.160.128:2376"
$env:DOCKER_TLS_VERIFY = "1"
$env:DOCKER_CERT_PATH = "D:\docker_auth"
# 验证
docker version
docker ps
永久设置:在系统环境变量中添加以上三个变量。
六、IDEA 连接远程 Docker
6.1 配置入口
File → Settings → Build, Execution, Deployment → Docker
6.2 正确配置
| 配置项 | 值 |
|---|---|
| 连接方式 | ✅ TCP 套接字(不要选 SSH) |
| 引擎 API URL | tcp://192.168.160.128:2376 |
| 证书文件夹 | D:\docker_auth |
| 自动检测可执行文件路径 | ❌ 取消勾选(或手动指定 docker.exe) |
| 虚拟机路径 / 本地路径 | ❌ 不用管,保持默认 |
6.3 常见报错与解决
| 报错 | 原因 | 解决 |
|---|---|---|
Client sent an HTTP request to an HTTPS server |
IDEA 没用 TLS | 删除现有连接,重启 IDEA,重建连接 |
Cannot run program "docker.exe" |
未安装 Docker CLI | 下载 Windows 版 docker.exe 并加入 PATH |
error during connect: ... localhost:55123 |
选了 SSH 方式 | 改回 TCP 套接字 |
| 连接成功后看不到容器 | 正常,尚无容器 | 在虚拟机里 docker run 一个测试容器 |
6.4 备选方案:IDEA 终端直接操作
如果图形界面反复出问题,直接在 IDEA 底部 Terminal 中操作:
powershell
$env:DOCKER_HOST = "tcp://192.168.160.128:2376"
$env:DOCKER_TLS_VERIFY = "1"
$env:DOCKER_CERT_PATH = "D:\docker_auth"
docker ps
这能完全绕过 IDEA 插件问题,功能上没有任何缺失。
七、从 Windows 调用 AI 服务
7.1 直接 HTTP 调用(PowerShell / CMD)
powershell
curl http://192.168.160.128:11434/api/generate -d "{\"model\":\"qwen2.5:1.5b\", \"prompt\":\"用一句话介绍Java\", \"stream\":false}"
成功返回示例:
json
{
"model": "qwen2.5:1.5b",
"created_at": "2026-09-09T10:15:46Z",
"response": "Java是一种广泛使用的编程语言和平台,主要用于构建跨平台应用、企业级应用、Android应用等。",
"done": true,
"total_duration": 870154489,
"eval_count": 24,
"eval_duration": 742927000
}
7.2 Java 代码调用示例(Spring Boot)
java
@RestController
public class AiController {
private final RestTemplate restTemplate = new RestTemplate();
@PostMapping("/chat")
public String chat(@RequestBody Map<String, String> request) {
String prompt = request.get("prompt");
String url = "http://192.168.160.128:11434/api/generate";
Map<String, Object> body = new HashMap<>();
body.put("model", "qwen2.5:1.5b");
body.put("prompt", prompt);
body.put("stream", false);
ResponseEntity<Map> response = restTemplate.postForEntity(url, body, Map.class);
return (String) response.getBody().get("response");
}
}
八、常用运维命令速查
Docker 容器管理
bash
docker ps # 查看运行中的容器
docker logs -f ollama # 实时查看 Ollama 日志
docker restart ollama # 重启容器
docker stop ollama # 停止容器
docker start ollama # 启动容器
docker rm -f ollama # 强制删除容器
Ollama 模型管理
bash
docker exec -it ollama ollama list # 查看已安装模型
docker exec -it ollama ollama pull qwen2.5:1.5b # 拉取模型
docker exec -it ollama ollama rm qwen2.5:1.5b # 删除模型
docker exec -it ollama ollama run qwen2.5:1.5b # 交互式对话
磁盘空间检查
bash
df -h / # 根分区使用情况
sudo du -sh /var/lib/docker # Docker 总占用
docker system df # Docker 空间明细
docker system prune -a # 清理未使用资源(谨慎)
九、踩坑总结(重要经验)
| 坑 | 现象 | 正确做法 |
|---|---|---|
| 端口 2375 vs 2376 | Docker 弃用警告 | 用 2376 + TLS |
| systemd 与 hosts 冲突 | 启动失败 directives specified both as a flag and in config |
创建 override.conf,清空 ExecStart |
| 下载错 Docker CLI | 解压出无后缀文件,Windows 不能用 | 用 download.docker.com/win/static/stable/x86_64/ |
| 模型标签不存在 | pull model manifest: file does not exist |
用 qwen2.5:1.5b,不要加 q4_K_M 等后缀 |
| IDEA 选 SSH 方式 | error during connect: localhost:55123 |
改回 TCP 套接字 |
| IDEA 报 HTTP to HTTPS | Status 400 |
删除旧连接,重启 IDEA,重建 |
| VMware 扩容无效 | df -h 看不到新空间 |
用 growpart + resize2fs 扩展分区和文件系统 |
| 内存不足 | 容器被 OOM kill | docker run 加 --memory="1.5g",选 1.5B 小模型 |
十、下一步规划
你已经完成:
- ✅ Ubuntu 虚拟机环境准备
- ✅ Docker 安装 + TLS 远程访问配置
- ✅ Ollama 部署 + 轻量模型运行
- ✅ Windows ↔ Ubuntu Docker 连接打通
- ✅ Windows 直接调用 AI API 成功
接下来可以开始:
- 在 IDEA 中创建 Spring Boot 项目
- 集成 Spring AI 框架(
spring-ai-ollama-spring-boot-starter) - 写第一个 AI 应用:智能问答、代码助手、RAG 知识库
- 进阶:接入 Qdrant 向量数据库,构建 RAG 应用
- 再进阶:构建 AI Agent,让模型调用工具完成任务
附:关键配置文件速查
| 文件 | 路径 | 作用 |
|---|---|---|
| Docker 主配置 | /etc/docker/daemon.json |
镜像源、TLS、hosts |
| systemd 覆盖 | /etc/systemd/system/docker.service.d/override.conf |
解决 hosts 冲突 |
| TLS 证书 | ~/.docker/certs/ |
ca.pem / cert.pem / key.pem |
| Windows 证书 | D:\docker_auth\ |
从虚拟机复制过来 |
| Docker CLI | D:\lvyy_soft\docker\docker.exe |
Windows 版命令行工具 |
文档结束 🎉
这份文档涵盖了你从零到现在的所有关键步骤和踩坑经验,可以作为你后续复习和分享的参考。如果需要针对某个环节(比如 Spring AI 集成、RAG 实现)再写详细教程,随时告诉我!🚀