1. はじめに
前回、Ollamaをインストールしたのですが、Ollamaは基本的にはCLIベースでの利用になります。ブラウザから利用したいので、Open WebUIをインストールしようとしたのですが、、、どうやらOpen WebUIはコンテナーで動かすのが一般的のようです。
「そうなんだ、じゃあコンテナとの連携か・・・」って思ってたら、(日本語の記事では見かけなかったのですが)どうやらOllamaとOpen WebUIを予め連携済みの1つのコンテナーで実行する方法が既に提供されています。
というので、1つのコンテナで動かす方法の方が楽なので、そちらで今回はやってしまいたいと思います。
参考リンク
- https://github.com/open-webui/open-webui
- https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#with-dnf-rhel-centos-fedora-amazon-linux
- https://docs.openwebui.com/getting-started/quick-start/starting-with-ollama
- https://ollama.com/search
2. GPU環境のセットアップ
RHEL9 + NVIDIA A100環境にNVIDIA Driver/CUDA Toolkitをインストールするを実行します。
3. Dockerのインストール
[root@syasuda-ollama ~]# dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
[root@syasuda-ollama ~]# dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
[root@syasuda-ollama ~]# systemctl enable --now docker
4. NVIDIA Container Toolkitをインストール
コンテナーからGPUを利用するために、NVIDIA Container Toolkitが必要になります。また、dockerでそれを有効にする必要があります。
[root@syasuda-ollama ~]# curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
[root@syasuda-ollama ~]# export NVIDIA_CONTAINER_TOOLKIT_VERSION=1.17.8-1
sudo dnf install -y \
nvidia-container-toolkit-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
nvidia-container-toolkit-base-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container-tools-${NVIDIA_CONTAINER_TOOLKIT_VERSION} \
libnvidia-container1-${NVIDIA_CONTAINER_TOOLKIT_VERSION}
[root@syasuda-ollama ~]# nvidia-ctk runtime configure --runtime=docker
INFO[0000] Config file does not exist; using empty config
INFO[0000] Wrote updated config to /etc/docker/daemon.json
INFO[0000] It is recommended that docker daemon be restarted.
[root@syasuda-ollama ~]# systemctl restart docker
5. 領域確保(オプション)
OllamaがバンドルされたOpen WebUIのコンテナーのインストールで、GPUサポート付きのコマンドは、docsによると
docker run -d -p 3000:8080 --gpus=all -v ollama:/root/.ollama -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:ollama
です。このコマンドでは、docker volumeが指定されているため、/var/lib/docker/volumes/<docker volume name>/_data
をコンテナーはマウントして利用します。しかし、Open WebUIの/app/backend/data
はOpen WebUIのデータベースやVector DBなどが配置され、/root/.ollama/
配下にはモデルが配置されるので、どちらも大容量になることが予想されます。ここでは明示的に領域を変更するためのブロックストレージを別途このVSIに割り当て、xfsでフォーマットしてマウントしておきます。
[root@syasuda-ollama ~]# lsblk -l /dev/vdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
vdc 252:32 0 500G 0 disk
[root@syasuda-ollama ~]# mkfs.xfs /dev/vdc
[root@syasuda-ollama ~]# mkdir /work
[root@syasuda-ollama ~]# mount /dev/vdc /work
[root@syasuda-ollama ~]# blkid /dev/vdc
/dev/vdc: UUID="310e9f9c-7a35-49c1-80ae-e01b4fdda5ab" TYPE="xfs"
[root@syasuda-ollama ~]# echo UUID=310e9f9c-7a35-49c1-80ae-e01b4fdda5ab /work xfs defaults 0 0 >> /etc/fstab
[root@syasuda-ollama ~]# systemctl daemon-reload
[root@syasuda-ollama ~]# mount -a
[root@syasuda-ollama ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 4.0M 0 4.0M 0% /dev
tmpfs 59G 0 59G 0% /dev/shm
tmpfs 24G 17M 24G 1% /run
/dev/vda4 100G 29G 71G 29% /
/dev/vda3 495M 322M 174M 65% /boot
/dev/vda2 200M 7.1M 193M 4% /boot/efi
tmpfs 12G 8.0K 12G 1% /run/user/0
/dev/vdc 500G 3.6G 497G 1% /work
6. Ollama+Open WebUIのインストール
[root@syasuda-ollama ~]# mkdir -p /work/open-webui/ollama
[root@syasuda-ollama ~]# mkdir -p /work/open-webui/data
[root@syasuda-ollama ~]# docker run -d -p 3000:8080 --gpus=all -v /work/open-webui/ollama:/root/.ollama -v /work/open-webui/data:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:ollama
[root@syasuda-ollama ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08bc5d5ee44c ghcr.io/open-webui/open-webui:ollama "bash start.sh" 10 seconds ago Up 10 seconds (health: starting) 0.0.0.0:3000->8080/tcp, [::]:3000->8080/tcp open-webui
[root@syasuda-ollama ~]# ss -anpt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1165,fd=3))
LISTEN 0 4096 0.0.0.0:3000 0.0.0.0:* users:(("docker-proxy",pid=24365,fd=7))
ESTAB 0 188 10.50.0.10:22 192.168.100.6:62964 users:(("sshd",pid=8525,fd=4),("sshd",pid=8522,fd=4))
ESTAB 0 52 10.50.0.10:22 192.168.100.6:64746 users:(("sshd",pid=23698,fd=4),("sshd",pid=23695,fd=4))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=1165,fd=4))
LISTEN 0 4096 [::]:3000 [::]:* users:(("docker-proxy",pid=24372,fd=7))
[root@syasuda-ollama ~]# docker exec -it 08bc5d5ee44c bash
root@08bc5d5ee44c:/app/backend# ps -ef
bash: ps: command not found
root@08bc5d5ee44c:/app/backend# ss -anpt
bash: ss: command not found
root@08bc5d5ee44c:/app/backend# ollama --version
ollama version is 0.11.6
root@08bc5d5ee44c:/app/backend# ollama list
NAME ID SIZE MODIFIED
root@08bc5d5ee44c:/app/backend# ls -l /root/.ollama/models/blobs/
total 0
root@08bc5d5ee44c:/app/backend# ls -l /app/backend/data
total 244
drwxr-xr-x. 5 root root 49 Aug 27 10:27 cache
drwxr-xr-x. 2 root root 6 Aug 27 10:27 uploads
drwxr-xr-x. 2 root root 28 Aug 27 10:27 vector_db
-rw-r--r--. 1 root root 249856 Aug 27 10:27 webui.db
root@08bc5d5ee44c:/app/backend# exit
7. Open WebUIへのログイン
-
http://<VSIのIPアドレス>:3000/
にアクセス。Get Started
を押下。 - アカウントの作成(メールアドレスは適当なものを入れています)
-
Okay, Lets's go
を押下。 -
Settings
を押下。 - 言語設定で
日本語
を選択。 - 無事日本語のUIになった。
- モデルの検索して
プル
を実行。モデル名はここからも見つけることが可能。今回は、gpt-oss:20b
を選択。 - ダウンロード中。
- ダウンロードしたモデルを選択。なお、まだこの時点ではモデルはGPUにロードされていない
[root@syasuda-ollama ~]# nvidia-smi
Wed Aug 27 10:39:42 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.65.06 Driver Version: 580.65.06 CUDA Version: 13.0 |
+-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA A100 80GB PCIe Off | 00000000:04:01.0 Off | 0 |
| N/A 41C P0 48W / 300W | 4MiB / 81920MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| No running processes found |
+-----------------------------------------------------------------------------------------+
- コントロールから、パラメーターを指定可能(今回は特に何も変更しない)
- 推論を実行。このタイミングでGPUにモデルがロードされる。
- Follow up questionなどが出力される。
- 性能情報も確認可能(124.06 token/secで出力されている)
[root@syasuda-ollama ~]# nvidia-smi
Thu Aug 28 00:38:45 2025
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.65.06 Driver Version: 580.65.06 CUDA Version: 13.0 |
+-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+========================+======================|
| 0 NVIDIA A100 80GB PCIe Off | 00000000:04:01.0 Off | 0 |
| N/A 47C P0 73W / 300W | 14163MiB / 81920MiB | 0% Default |
| | | Disabled |
+-----------------------------------------+------------------------+----------------------+
+-----------------------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=========================================================================================|
| 0 N/A N/A 6493 C /usr/local/bin/ollama 14154MiB |
+-----------------------------------------------------------------------------------------+
[root@syasuda-ollama ~]# ls -l /work/open-webui/ollama/models/blobs/
total 13457212
-rw-r--r--. 1 root root 489 Aug 27 10:38 sha256-55c108d8e93662a22dcbed5acaa0374c7d740c6aa4e8b7eee7ae77ed7dc72a25
-rw-r--r--. 1 root root 13780154624 Aug 27 10:38 sha256-b112e727c6f18875636c56a779790a590d705aec9e1c0eb5a97d51fc2a778583
-rw-r--r--. 1 root root 18 Aug 27 10:38 sha256-d8ba2f9a17b3bbdeb5690efaa409b3fcb0b56296a777c7a69c78aa33bbddf182
-rw-r--r--. 1 root root 11353 Aug 27 10:38 sha256-f60356777647e927149cbd4c0ec1314a90caba9400ad205ddc4ce47ed001c2d6
-rw-r--r--. 1 root root 7240 Aug 27 10:38 sha256-fa6710a93d78da62641e192361344be7a8c0a1c3737f139cf89f20ce1626b99c
8. 更新作業(2025/09/01追記)
release情報を見たら分かる通り、頻繁に更新されてfixも行われているようです。今回の記事を書いてから1週間も経たないうちに新しいバージョンがリリースされたため、適用したいと思います。
[root@syasuda-ollama ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
08bc5d5ee44c ghcr.io/open-webui/open-webui:ollama "bash start.sh" 4 days ago Up 5 minutes (healthy) 0.0.0.0:3000->8080/tcp, [::]:3000->8080/tcp open-webui
[root@syasuda-ollama ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ghcr.io/open-webui/open-webui ollama a633c4d773d8 9 days ago 8.31GB
[root@syasuda-ollama ~]# docker run --rm --volume /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once open-webui
Unable to find image 'containrrr/watchtower:latest' locally
latest: Pulling from containrrr/watchtower
57241801ebfd: Pull complete
3d4f475b92a2: Pull complete
1f05004da6d7: Pull complete
Digest: sha256:6dd50763bbd632a83cb154d5451700530d1e44200b268a4e9488fefdfcf2b038
Status: Downloaded newer image for containrrr/watchtower:latest
time="2025-09-01T00:58:19Z" level=info msg="Watchtower 1.7.1"
time="2025-09-01T00:58:19Z" level=info msg="Using no notifications"
time="2025-09-01T00:58:19Z" level=info msg="Only checking containers which name matches \"open-webui\""
time="2025-09-01T00:58:19Z" level=info msg="Running a one time update."
time="2025-09-01T01:02:06Z" level=info msg="Found new ghcr.io/open-webui/open-webui:ollama image (c3594234d1be)"
time="2025-09-01T01:02:06Z" level=info msg="Stopping /open-webui (08bc5d5ee44c) with SIGTERM"
time="2025-09-01T01:02:30Z" level=info msg="Creating /open-webui"
time="2025-09-01T01:02:31Z" level=info msg="Session done" Failed=0 Scanned=1 Updated=1 notify=no
time="2025-09-01T01:02:31Z" level=info msg="Waiting for the notification goroutine to finish" notify=no
[root@syasuda-ollama ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
287878ae0d2f ghcr.io/open-webui/open-webui:ollama "bash start.sh" 56 seconds ago Up 55 seconds (healthy) 0.0.0.0:3000->8080/tcp, [::]:3000->8080/tcp open-webui
[root@syasuda-ollama ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ghcr.io/open-webui/open-webui ollama c3594234d1be 3 days ago 8.31GB
ghcr.io/open-webui/open-webui <none> a633c4d773d8 9 days ago 8.31GB
containrrr/watchtower latest e7dd50d07b86 21 months ago 14.7MB
(古いイメージは要らないので削除)
[root@syasuda-ollama ~]# docker image rm a633c4d773d8
[root@syasuda-ollama ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ghcr.io/open-webui/open-webui ollama c3594234d1be 3 days ago 8.31GB
containrrr/watchtower latest e7dd50d07b86 21 months ago 14.7MB