はじめに
Ubuntu環境でLLMをローカル実行し、同一LANにおいてブラウザからChatGPTのように利用できる環境を構築しました。
ついでにDocker操作についてだいぶ忘れていたので、Dcoker関連については少しだけ丁寧に説明していきます。
使用した環境は以下の通りです。
- Ubuntu
- Ollama
- Qwen3-4B(テストのため最軽量)
- Docker
- Open WebUI
最終的には、同じLANに接続されたiPhoneからもアクセスできるようにしました。
構成は以下のようになっています。
iPhone
↓ LAN
Ubuntu
├─ Open WebUI(Docker)
│ ↓
└─ Ollama
↓
Qwen3-4B
1. Ollamaのインストール
まず、LLMをローカルで実行するためにOllamaを使用しました。
Ollamaは、ローカル環境でLLMを実行するためのソフトウェアです。
インストールには以下のコマンドを使用します。
curl -fsSL https://ollama.com/install.sh | sh
インストール後、
ollama --version
で確認したところ、今回はOllama 0.33.3でした。
2. Qwen3-4Bを実行する
Ollamaを使ってQwen3-4Bを起動します。
ollama run qwen3:4b
初回はモデルがダウンロードされます。
今回使用したモデルは以下のような構成でした。
- パラメータ数:4.0B
- 量子化:Q4_K_M
- サイズ:約2.5GB
起動後、ターミナルから質問を入力すると回答が返ってきました。
これで、ローカル環境でQwen3-4Bを実行できることを確認できました。
3. OllamaのAPIを確認する
OllamaにはAPIが用意されているため、HTTP経由でモデルを利用できます。
インストールされているモデルは、
curl http://localhost:11434/api/tags
で確認できます。
今回は以下のようにQwen3-4Bが表示されました。
{
"models": [
{
"name": "qwen3:4b"
}
]
}
また、
curl http://localhost:11434/api/version
でOllamaのバージョンを確認できます。
4. Open WebUIを導入する
ここまででLLM自体は動作しましたが、ターミナルからではなく、ブラウザから利用したかったためOpen WebUIを導入しました。
Open WebUIはLLMそのものではなく、Ollamaなどをブラウザから操作するためのWebインターフェースです。
今回はDockerを利用してOpen WebUIを動かしました。
Dockerとは
Dockerは、アプリケーションを「コンテナ」と呼ばれる隔離された環境で動かすための仕組みです。
今回の場合、
Ubuntu
│
├─ Ollama
│
└─ Docker
└─ Open WebUI
という構成になります。
Open WebUIをUbuntuへ直接インストールする代わりに、Dockerコンテナの中で実行しています。
5. Open WebUIを起動する
以下のコマンドでOpen WebUIのコンテナを起動しました。
docker run -d \
-p 3000:8080 \
--add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
--name open-webui \
--restart always \
ghcr.io/open-webui/open-webui:main
それぞれの設定について簡単に説明します。
-p 3000:8080
Ubuntu側の3000番ポートと、Dockerコンテナ内の8080番ポートを接続します。
Ubuntu :3000
↓
Docker :8080
↓
Open WebUI
そのため、Ubuntu自身のブラウザから、
http://localhost:3000
でOpen WebUIにアクセスできます。
-v open-webui:/app/backend/data
Open WebUIのデータをDocker Volumeに保存します。
コンテナを作り直した場合でも、データを保持できるようにするためです。
--restart always
Ubuntuを再起動した場合などにも、コンテナを自動的に起動する設定です。
--name open-webui
コンテナにopen-webuiという名前を付けています。
そのため、
docker ps
でコンテナの状態を確認できます。
6. DockerからOllamaに接続する
Open WebUIを起動してみると、最初は利用できるモデルがありませんでした。
Ollama自体は正常に動いています。
curl http://localhost:11434/api/tags
を実行するとQwen3-4Bが確認できます。
しかし、Open WebUIはDockerコンテナの中で動いています。
ここで重要なのが、
Dockerコンテナから見た
localhostと、Ubuntuから見たlocalhostは同じではない
という点です。
Ubuntuから、
localhost:11434
にアクセスするとOllamaに接続できます。
一方、Dockerコンテナ内からlocalhost:11434へアクセスすると、Dockerコンテナ自身を指します。
そこで、DockerコンテナからUbuntu側へ接続するためにhost.docker.internalを利用します。
7. Ollamaの待ち受け設定を変更する
最初に、
docker exec open-webui curl http://host.docker.internal:11434/api/tags
を実行したところ、接続に失敗しました。
原因は、Ollamaがlocalhostからの接続だけを受け付ける設定になっていたためです。
そこで、Ollamaのサービス設定を変更します。
sudo systemctl edit ollama
開いたファイルに以下を追加します。
[Service]
Environment="OLLAMA_HOST=0.0.0.0:11434"
保存したら、Ollamaを再起動します。
sudo systemctl daemon-reload
sudo systemctl restart ollama
その後、再び、
docker exec open-webui curl http://host.docker.internal:11434/api/tags
を実行すると、Qwen3-4Bを確認できました。
これでDocker上のOpen WebUIから、Ubuntu上で動作しているOllamaへ接続できるようになりました。
8. Open WebUIからQwen3-4Bを使う
Open WebUIをブラウザで開き、モデル一覧を確認すると、Qwen3-4Bが利用できるようになりました。
最終的な内部構成は、
ブラウザ
↓
Ubuntu :3000
↓
Docker :8080
↓
Open WebUI
↓
Ollama :11434
↓
Qwen3-4B
となっています。
これで、ターミナルからではなく、WebブラウザからQwen3-4Bを利用できるようになりました。
9. iPhoneからアクセスする
さらに、同じLANに接続されたiPhoneからも利用できるようにしました。
Ubuntu PCのIPアドレスは、
hostname -I
で確認できます。
例えば、
192.168.1.23
だった場合、iPhoneのブラウザから、
http://192.168.1.23:3000
へアクセスします。
これで、iPhoneからもOpen WebUIを利用できました。
通信の流れは、
iPhone
↓ Wi-Fi
Ubuntu PC :3000
↓
Docker
↓
Open WebUI
↓
Ollama :11434
↓
Qwen3-4B
となります。
なお、RTX 3080はネットワーク上の接続先ではなく、Ubuntu PCに搭載されているGPUとしてLLMの計算を担当しています。
まとめ
今回は、Ubuntu上にQwen3-4Bのローカル実行環境を構築し、Open WebUIから利用できるようにしました。
最終的な構成は以下です。
iPhone / PC
↓
Open WebUI
↓
Ollama
↓
Qwen3-4B
↓
GPU
今回の構築を通して、
- OllamaによるローカルLLMの実行
- Ollama API
- Dockerのポートフォワーディング
- Dockerコンテナからホストへの通信
- LAN内からWebサービスへアクセス
などを実際に触ることができました。
Ollamaがlocalhostからの接続だけを受け付ける設定になっている点に少し詰まりましたが、接続周りについて勉強する良い機会になりました。