离线环境 Docker + Ollama + GGUF 模型部署

1. 准备离线安装包

在一台能联网的同架构(x86_64)机器上下载所有必需的文件。

文件名 说明 获取方式
docker-26.1.3.tgz Docker 静态二进制包 Docker 官方发布页 下载
docker-compose-linux-x86_64 Docker Compose 二进制文件 GitHub Releases 下载
ollama.tar Ollama Docker 镜像 使用 docker pull ollama/ollama:latestdocker save 命令导出
Qwen3-Embedding-0.6B-Q4_K_M.gguf GGUF 格式模型文件 ModelScope 魔搭社区 下载
docker.service systemd 服务文件 参考下文内容创建
daemon.json Docker 配置文件 参考下文内容创建
docker-installer.sh Docker 安装脚本 参考下文内容创建
docker-uninstaller.sh Docker 卸载脚本 参考下文内容创建

将上述所有文件放入一个文件夹(如 ollama-offline/),并拷贝到目标服务器的 /root/ 或任意工作目录。


2. 安装 Docker

2.1 创建 systemd 服务文件

创建 /usr/lib/systemd/system/docker.service,内容如下:

[Unit]
Description=Docker Application Container Engine
Documentation=http://docs.docker.com
After=network.target docker.socket
[Service]
Type=notify
EnvironmentFile=-/run/flannel/docker
WorkingDirectory=/usr/local/bin
ExecStart=/usr/bin/dockerd \
                -H tcp://0.0.0.0:4243 \
                -H unix:///var/run/docker.sock \
                --selinux-enabled=false \
                --log-opt max-size=1g
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
Restart=on-failure
[Install]
WantedBy=multi-user.target

2.2 创建 Docker 配置文件

创建 /etc/docker/daemon.json,内容如下:

{
  "builder": {
    "gc": {
      "defaultKeepStorage": "20GB",
      "enabled": true
    }
  },
  "debug": false,
  "experimental": false,
  "features": {
    "buildkit": true
  },
  "insecure-registries": [],
  "registry-mirrors": []
}

2.3 执行安装脚本

# docker-installer.sh
#!/bin/sh
echo 'docker开始安装...'
echo '解压tar包...'
# ------------------------------------
tar -zxvf ./docker-28.5.2.tgz
# ------------------------------------
echo '将docker目录移到/usr/bin目录下...'
cp -p docker/*  /usr/bin/
rm -rf docker
echo '将docker.service 移到/usr/lib/systemd/system/ 目录...'
cp ./docker.service /usr/lib/systemd/system/
echo '重新加载配置文件...'
mkdir /etc/docker/
cp daemon.json /etc/docker/
systemctl daemon-reload
echo '启动docker...'
systemctl start docker
echo '设置开机自启...'
systemctl enable docker.service
if ! docker -v; then
echo "docker 安装失败..."
exit -1
fi
echo 'docker安装成功...'
 
echo '安装docker-compose...'
# ---------------------------------------------------------------
cp -f ./docker-compose-linux-x86_64 /usr/local/bin/docker-compose
# ---------------------------------------------------------------
echo '添加文件执行权限...'
chmod +x /usr/local/bin/docker-compose
if ! docker-compose -v; then
echo "docker-compose 安装失败..."
exit -1
fi
echo 'docker-compose 安装成功...'

cd /root/ollama-offline
sh docker-installer.sh

2.4 启动 Docker 服务

systemctl daemon-reload
systemctl start docker
systemctl enable docker.service
docker --version   # 验证安装
docker-compose --version

4. 加载并运行 Ollama 容器

4.1 加载 Docker 镜像

docker load -i ollama.tar

4.2 启动 Ollama 容器(绑定挂载)

我们将宿主机的 /home/.ollama 目录挂载到容器内的模型存储路径,便于管理。

docker run -d \
  -v /home/.ollama:/root/.ollama \
  -p 11434:11434 \
  --name ollama \
  ollama/ollama:latest

说明

  • -v /home/.ollama:/root/.ollama:将模型数据持久化到宿主机的 /home/.ollama 目录。
  • -p 11434:11434:映射 API 端口。

验证容器是否运行:

docker ps | grep ollama

5. 导入离线 GGUF 模型

5.1 将 GGUF 文件拷贝到容器

docker cp ./Qwen3-Embedding-0.6B-Q4_K_M.gguf ollama:/root/

5.2 进入容器创建 Modelfile

docker exec -it ollama /bin/bash
cd /root

创建 Modelfile

echo "FROM ./Qwen3-Embedding-0.6B-Q4_K_M.gguf" > Modelfile

5.3 导入模型

ollama create qwen3-embedding -f Modelfile

注意:此版本 Ollama 不支持 PARAMETER embedding 参数,无需添加。

5.4 验证模型

ollama list   # 应看到 qwen3-embedding 在列表中

6. 测试 Embedding 模型

在容器内或宿主机上通过 API 调用,获取文本向量。

curl http://localhost:11434/api/embeddings -d '{
  "model": "qwen3-embedding",
  "prompt": "这是一段测试文本"
}'

预期输出:一个 JSON 对象,包含该文本对应的向量数组(例如 "embedding": [0.123, -0.456, ...])。

[root@localhost qwen3-embedding]# curl http://localhost:11434/api/embeddings -d '{
>   "model": "qwen3-embedding",
>   "prompt": "这是一段测试文本"
> }'
{"embedding":[-0.0026231887750327587,-0.07351969182491302...-0.044338155537843704,-0.003932561259716749]}
posted @ 2026-08-25 15:11  hou永胜  阅读(3)  评论(0)    收藏  举报