Ubuntu下Docker部署Ollama 轻量模型

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_Mq4_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

  1. Win + R → 输入 sysdm.cpl
  2. 高级 → 环境变量 → 系统变量 → Path → 编辑
  3. 新建 → 填入 D:\lvyy_soft\docker
  4. 确定保存,重开 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.pem
  • D:\docker_auth\cert.pem
  • D:\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 配置入口

FileSettingsBuild, Execution, DeploymentDocker

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 成功

接下来可以开始

  1. 在 IDEA 中创建 Spring Boot 项目
  2. 集成 Spring AI 框架(spring-ai-ollama-spring-boot-starter
  3. 写第一个 AI 应用:智能问答、代码助手、RAG 知识库
  4. 进阶:接入 Qdrant 向量数据库,构建 RAG 应用
  5. 再进阶:构建 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 实现)再写详细教程,随时告诉我!🚀

相关推荐
新时代牛马43 分钟前
Linux 网络配置:iproute2、DNS 与连通性排障
linux·服务器·网络
新时代牛马1 小时前
Linux systemd 服务管理:从unit 文件到systemctl 启停与排障
linux·服务器·网络
wdfk_prog1 小时前
大型 Docker 镜像导出导入工程化:可靠性、磁盘与压缩
运维·docker·容器
郝开2 小时前
Docker Compose 模块化多环境配置规范指南:示例搭建Alf Tengine MD2DOC 1.1.1
运维·docker·容器
光电笑映2 小时前
Linux 线程同步与互斥:锁的本质、条件变量与信号量的底层原理
linux·运维·服务器·开发语言·c++
Albart5752 小时前
Docker Desktop 增量更新失败终极排查:Failed to apply delta update 反复回滚怎么办?
windows·docker·容器·docker部署大模型
kaoa0002 小时前
Linux入门攻坚——89、Hadoop-1-架构及概念
大数据·linux·hadoop·分布式
茶马古道的搬运工3 小时前
Linux-Ubantu-贴士-SSH 免密登录与端口修改
linux
团子股股东峥哥3 小时前
day34-RHEL-管理SELinux的安全性
linux·运维·服务器