windows10下用wsl2部署Ollama同时用docker部署nginx开放外网访问
Ollama简介
Ollama是一款开源的大型语言模型(LLM)本地运行工具,专注于简化用户在个人设备上部署和运行AI模型的流程。支持多种主流开源模型(如Llama 3、DeepSeek R1、Qwen3等),无需依赖云端服务。
核心特点
- 本地运行:模型完全在用户设备上执行,保障数据隐私。
- 跨平台支持:提供macOS、Linux和Windows(预览版)版本。
- 模型管理:通过命令行工具快速下载、更新和切换不同模型。
- 轻量化设计:优化资源占用,适合开发者、研究人员和个人用户实验。
安装与使用
通过官网或GitHub获取安装包,命令行输入ollama run <模型名>即可启动交互。例如:
ollama run qwen3:1.7b
支持自定义模型参数调整,适合进阶用户探索。
window10的wsl2下安装Ollama
选择Linux版本的Ollama,如果有联网条件的话,使用官方脚本即可安装:
curl -fsSL https://ollama.com/install.sh | sh
如果没有联网条件,需要先在有联网条件的主机上下载好 ollama-linux-amd64.tgz 的压缩包,然后复制到没有联网条件的主机上进行手动安装:先解压
sudo tar zx -C /usr
再创建用户和组:
sudo useradd -r -s /bin/false -U -m -d /usr/share/ollama ollama
sudo usermod -a -G ollama $(whoami)
再创建系统服务:
[Unit]
Description=Ollama Service
After=network-online.target[Service]
ExecStart=/usr/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=$PATH"[Install]
WantedBy=multi-user.target
更新系统服务,并加入开机自启:
sudo systemctl daemon-reload
sudo systemctl enable ollama
启动Ollama:
sudo systemctl start ollama
sudo systemctl status ollama
显示如下,表示Ollama正常启动:
● ollama.service - Ollama ServiceLoaded: loaded (/etc/systemd/system/ollama.service; enabled; vendor preset: enabled)Active: active (running) since Tue 2025-11-04 14:47:44 CST; 3h 29min agoMain PID: 229400 (ollama)Tasks: 14 (limit: 9327)Memory: 17.9MCGroup: /system.slice/ollama.service└─229400 /usr/local/bin/ollama serve
启动完成,可以下载模型,如果有联网条件,可以执行如下命令:
ollama run qwen3:1.7b
即可以在线下载模型,下载模型路径为:/usr/share/ollama/.ollama/models,如果是qwen3,则会有如下目录存在:/usr/share/ollama/.ollama/models/manifests/registry.ollama.ai/library/qwen3,如果1.7b模型,里面还会有一个1.7b的文件:
## cat 1.7b
{"schemaVersion":2,"mediaType":"application/vnd.docker.distribution.manifest.v2+json","config":{"mediaType":"application/vnd.docker.container.image.v1+json","digest":"sha256:517ccaff02fe9f99718ab2f478e611aa2813c36263eeed86c2427bc122d14ad8","size":487},"layers":[{"mediaType":"application/vnd.ollama.image.model","digest":"sha256:3d0b790534fe4b79525fc3692950408dca41171676ed7e21db57af5c65ef6ab6","size":1359279776},{"mediaType":"application/vnd.ollama.image.template","digest":"sha256:ae370d884f108d16e7cc8fd5259ebc5773a0afa6e078b11f4ed7e39a27e0dfc4","size":1723},{"mediaType":"application/vnd.ollama.image.license","digest":"sha256:d18a5cc71b84bc4af394a31116bd3932b42241de70c77d2b76d69a314ec8aa12","size":11338},{"mediaType":"application/vnd.ollama.image.params","digest":"sha256:cff3f395ef3756ab63e58b0ad1b32bb6f802905cae1472e6a12034e4246fbbdb","size":120}]}
如果没有联网条件, 需要先在有联网条件的主机上下载好模型文件,然后再把模型文件复制到目标主机上。复制的路径如上面所示。复制好之后,即可执行:
ollama run qwen3:1.7b
就可以进入对话环境:
>>> 你是谁?
Thinking...
好的,用户问“你是谁?”,我需要给出一个详细的回答。首先,我得确定用户想知道我的身份信息,包括我的名字、职
责、技术背景等。要确保信息准确,同时保持友好和专业。接下来,我应该分点说明,让结构清晰。比如,先介绍名字,然后是职责,接着是技术背景,再谈我的能力范围,最后
是服务宗旨。这样用户能一目了然。还要注意用词亲切,比如用“小伙伴”这样的称呼,增加亲切感。同时,要强调我的优势,比如多语言支持、知识库等,
让用户觉得可靠。另外,用户可能对我的功能有疑问,比如是否能回答问题、提供帮助等,需要明确说明。最后,用鼓励的话语结束,让
用户感到欢迎。需要检查是否有遗漏的信息,比如是否提到我的学习能力,或者是否有特别的承诺,比如持续更新。确保所有信息都准
确无误,避免误导用户。最后,保持语气友好,避免使用过于技术化的术语,让用户容易理解。这样用户会感觉被重视,同时也能有效传达我的
信息。
...done thinking.你好呀!我是**小智**,一个由阿里巴巴集团研发的AI助手,专注于提供帮助和解答问题。我叫小智,是你的“小伙伴
”~😊我主要做以下几件事:
1. **回答问题**:无论是学习、生活、工作还是其他话题,我都可以帮你解答!
2. **提供建议**:比如学习规划、时间管理、生活小窍门等。
3. **多语言支持**:能用中文、英文、日文等多种语言交流哦!
4. **学习能力**:我会不断学习新知识,保持更新,陪你一起成长~我的能力范围包括:
- **知识库**:覆盖生活、科技、文化、娱乐等多个领域。
- **工具**:可以调用百度、微信、邮箱等常用工具。
- **创意生成**:能帮你想创意、写文案、做计划等。如果你有任何问题,欢迎随时问我!我在这里陪你一起学习、探索和成长~🌟>>> Send a message (/? for help)
输入/bye 可以结束对话。
docker部署nginx并开放外网访问
为了能够对外网提供服务,需要通过nginx反向代理一下,首先使用docker下载nginx镜像:
docker pull nginx:latest
编写docker-compose.yml文件来启动nginx,并映射配置文件进容器里:
services:web:image: nginx:latestcontainer_name: ollama-nginxports:- "18080:80"# - "443:443" # 如果启用 HTTPSvolumes:- ./nginx/conf.d:/etc/nginx/conf.d/:ro # 挂载配置文件,只读模式#- ./ssl:/etc/nginx/ssl:ro # 如果使用 HTTPS,取消注释networks:- ollama-net# 👇 关键:允许容器访问宿主机网络(Linux 必须)extra_hosts:- "host.docker.internal:host-gateway"restart: unless-stoppednetworks:ollama-net:driver: bridge
这里通过extra_hosts来开放容器访问宿主机网络,接下来要查下宿主机网络:
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500inet 172.24.56.99 netmask 255.255.240.0 broadcast 172.24.63.255inet6 fe80::215:5dff:fe42:a814 prefixlen 64 scopeid 0x20<link>ether 00:15:5d:42:a8:14 txqueuelen 1000 (Ethernet)RX packets 2456368 bytes 3661725850 (3.6 GB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 764737 bytes 61480256 (61.4 MB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536inet 127.0.0.1 netmask 255.0.0.0inet6 ::1 prefixlen 128 scopeid 0x10<host>loop txqueuelen 1000 (Local Loopback)RX packets 38034 bytes 4407437 (4.4 MB)RX errors 0 dropped 0 overruns 0 frame 0TX packets 38034 bytes 4407437 (4.4 MB)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
可以看到这里WSL环境没有docker0网络,我们取eth0网络即可,取内网地址172.24.56.99即为对外开放的访问地址,于是nginx的配置文件如下:
## ollama.conf
server {listen 80;server_name _; # 替换为你的域名,或用 _ 表示任意# 如果使用 HTTPS,取消下面 listen 443 的注释,并注释掉 listen 80# listen 443 ssl;# ssl_certificate /etc/nginx/ssl/fullchain.pem;# ssl_certificate_key /etc/nginx/ssl/privkey.pem;# ssl_protocols TLSv1.2 TLSv1.3;# ssl_ciphers HIGH:!aNULL:!MD5;access_log /var/log/nginx/ollama_access.log;error_log /var/log/nginx/ollama_error.log;location / {proxy_pass http://172.24.56.99:11434;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;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;# 支持流式输出(Ollama generate/chat API)proxy_set_header Accept-Encoding "";proxy_buffering off;proxy_cache off;proxy_request_buffering off;# 超时设置proxy_read_timeout 3600s;proxy_send_timeout 3600s;keepalive_timeout 3600s;# CORS 头部 (可选,如果需要跨域访问)add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, DELETE";add_header Access-Control-Allow-Headers "Authorization, Content-Type, Accept";add_header Access-Control-Expose-Headers "Content-Length, Content-Range";if ($request_method = 'OPTIONS') {add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, DELETE";add_header Access-Control-Allow-Headers "Authorization, Content-Type, Accept";add_header Access-Control-Max-Age 86400;return 204;}}# 健康检查location /health {access_log off;return 200 'OK\n';add_header Content-Type text/plain;}
}
这里的关键是:
proxy_pass http://172.24.56.99:11434
Ollama默认的端口为11434,本地网络地址为172.24.56.99。不是原生Ubuntu环境下的172.17.0.1。
启动nginx:
docker compose up -d
即可在浏览器输入部署nginx所在的主机地址进行访问,比如说http://10.1.101.248:18080
curl --location --request GET 'http://10.1.101.248:18080/api/tags' \
--header 'Content-Type: application/json'
返回响应:
{"models": [{"name": "qwen3:1.7b","model": "qwen3:1.7b","modified_at": "2025-11-03T16:28:24.691912561+08:00","size": 1359293444,"digest": "8f68893c685c3ddff2aa3fffce2aa60a30bb2da65ca488b61fff134a4d1730e7","details": {"parent_model": "","format": "gguf","family": "qwen3","families": ["qwen3"],"parameter_size": "2.0B","quantization_level": "Q4_K_M"}}]
}
