n8nやOllama、WhisperなどのAIツールをセルフホストしていると、いつの間にか管理が複雑になっていませんか?
「更新しようとしたら全サービスが止まった」「どのファイルがどのツールの設定なのか分からなくなった」——そういった経験は、構成の見直しで解決できます。
結論から言うと、サービスごとに独立した compose ファイルを作る「スタンドアロン構成」に切り替えると、管理が格段に楽になります。
この記事では、Docker Compose を使って複数の AI ツールをすっきり整理する方法を、初めて触る方から実運用中の方まで向けて解説します。
Docker 初心者の方は基本編から、すでに使っている方は応用編からどうぞ。
Docker Compose とは?30秒でわかる説明
Docker は、アプリをまるごと「コンテナ」という箱に入れて動かす仕組みです。
コンテナを使うと、インストール作業がなくなり、どのマシンでも同じ環境で動かせます。
そして Docker Compose は、複数のコンテナをまとめて管理するための設定ファイル(docker-compose.yml)です。
たとえば「n8n を動かすには、n8n 本体 + PostgreSQL データベースが必要」といった組み合わせを、1 ファイルで定義できます。
コマンド 1 行で起動・停止・更新ができるのが最大のメリットです。
よくある誤解:「全ツールを 1 つの compose.yml に書けばいい」と思いがちですが、これが後々の管理を複雑にします。
スタンドアロン構成とは何か
スタンドアロン構成とは、サービスごとに独立した docker-compose.yml を作る管理方法です。
例えば、以下のようなフォルダ構成にします:
~/services/
├── n8n/
│ ├── docker-compose.yml
│ └── .env
├── ollama/
│ ├── docker-compose.yml
│ └── .env
└── whisper/
├── docker-compose.yml
└── .env
各サービスが独立しているので、n8n だけ更新したいときは n8n フォルダ内だけ操作すればOKです。他のサービスには一切影響しません。
| 比較項目 | 一括管理(モノリシック) | スタンドアロン構成 |
|---|---|---|
| 更新のしやすさ | 全サービスに影響する | 対象サービスのみ |
| トラブル時の切り分け | 難しい | 簡単 |
| ファイルの見通し | 巨大化しやすい | コンパクトに保てる |
| 別マシンへの移行 | 手間がかかる | フォルダごとコピーでOK |
【基本編】スタンドアロン構成を作る 3 ステップ
ステップ 1:サービスごとのフォルダを作る
まずはフォルダ構成を整えます。SSH でサーバーに入り、次のコマンドを実行します:
mkdir -p ~/services/n8n
cd ~/services/n8n
同様に ollama、whisper などサービスごとにフォルダを作ります。
ステップ 2:docker-compose.yml を書く
n8n を例にした最小構成の docker-compose.yml です:
version: "3.8"
services:
n8n:
image: n8nio/n8n:latest
restart: unless-stopped
ports:
- "5678:5678"
volumes:
- n8n_data:/home/node/.n8n
env_file:
- .env
networks:
- app_network
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:5678/healthz"]
interval: 30s
timeout: 10s
retries: 3
volumes:
n8n_data:
networks:
app_network:
external: true
ポイントは 2 つあります。
1 つ目は env_file: .env で環境変数を外部ファイルに分離していること。パスワードなどを compose.yml に直書きしないのが基本です。
2 つ目は networks: external: true で外部ネットワークを参照していること。これにより、別の compose ファイルのサービスとも通信できます(後述します)。
ステップ 3:.env ファイルで設定を管理する
同じフォルダに .env ファイルを作り、設定値を書きます:
# n8n/.env
N8N_BASIC_AUTH_ACTIVE=true
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=your_password_here
GENERIC_TIMEZONE=Asia/Tokyo
N8N_HOST=0.0.0.0
このファイルは Git にコミットしないよう、.gitignore に .env を追加しておきましょう。
起動コマンド
設定が済んだら、サービスフォルダで以下を実行するだけです:
docker compose up -d
-d はバックグラウンド(デタッチ)モードで起動するオプションです。これがないとターミナルを閉じるとサービスも落ちます。
【応用編】実運用で分かった 5 つの教訓
💡 公式ドキュメントに沿って検証
Docker Compose 公式ドキュメント(docs.docker.com)の手順を検証したところ、サービス間通信のネットワーク設定の部分で注意が必要でした。
ドキュメントには書かれていないポイント:スタンドアロン構成でサービスを分割した場合、デフォルトでは別の compose.yml のサービスとは通信できません。
external: trueで共有ネットワークを作成し、各 compose に参照させる必要があります。また、ネットワークを先に作成しておかないと compose up 時にエラーになります。検証環境:macOS 15.3 / Docker Desktop 4.38.0
結果:
docker network create app_networkでネットワークを先に作成し、各 compose.yml にnetworks: app_network: external: trueを追記することで、n8n と Ollama が同一ネットワーク上で通信できるようになりました。n8n のワークフロー内からhttp://ollama:11434で Ollama の API を呼び出せます。
教訓 1:ネットワークは先に作っておく
スタンドアロン構成で最初につまずくのが、サービス間通信です。
n8n のワークフローから Ollama の API を呼び出したい場合、両者が同じネットワークにいる必要があります。
解決策は、共有ネットワークを事前に作成することです:
docker network create app_network
あとは各 compose.yml で以下を指定するだけです:
networks:
app_network:
external: true
同一ネットワーク内では、サービス名(例:ollama)でアクセスできます。
教訓 2:ボリューム名にサービス名の接頭辞をつける
ボリューム名を短くしすぎると、後で「これどのサービスのデータ?」となります。
# 悪い例(分かりにくい)
volumes:
data:
db:
# 良い例(一目瞭然)
volumes:
n8n_data:
ollama_models:
whisper_cache:
接頭辞をつけるだけで、docker volume ls の結果が整理されます。
教訓 3:restart ポリシーは unless-stopped が使いやすい
VPS や Mac mini で常時稼働させるなら、restart 設定は必須です。
restart: unless-stopped
always だと手動で停止してもマシン再起動時に自動で立ち上がりますが、unless-stopped は「手動で止めたものは止まったまま」にできるので、メンテナンスがやりやすいです。
教訓 4:更新は pull → down → up の順で
イメージを最新版に更新するときは、この順番が安全です:
docker compose pull # 最新イメージを取得
docker compose down # コンテナを停止・削除
docker compose up -d # 新しいイメージで起動
1 ステップで docker compose up -d --pull always も使えますが、問題が起きたときに切り分けにくいので、慣れないうちは 3 ステップを推奨します。
教訓 5:compose ファイル名を統一してスクリプト化する
サービスが 5 個以上になると、更新作業が面倒になります。
全サービスを一括更新するシェルスクリプトを作っておくと便利です:
#!/bin/bash
# update_all.sh
SERVICES_DIR=~/services
for service_dir in $SERVICES_DIR/*/; do
service_name=$(basename $service_dir)
echo "Updating $service_name..."
cd $service_dir
docker compose pull
docker compose up -d
echo "$service_name updated."
done
これを cron に登録すれば、定期的な自動更新も可能です。
VPS で動かす場合の選択肢
自宅の Mac mini でローカル稼働するのが理想ですが、外出先からアクセスしたり 24 時間確実に稼働させたりするには、VPS が便利です。
Docker と Docker Compose はほぼすべての Linux VPS にインストールできます。セルフホストの AI ツールを外部公開したい方には、XServer VPS(月額 1,569 円〜)のような国内 VPS が選択肢になります。SSH 接続後に数コマンドで Docker 環境が整います。
よくあるトラブルと対処法
Q:コンテナは起動するがサービスにアクセスできない
ポートのバインドを確認します。ports: "5678:5678" の左側がホスト側のポートです。VPS の場合はファイアウォール(セキュリティグループ)でそのポートを開放しているかも確認してください。
Q:docker compose up でエラーが出る
まず docker compose config で YAML の構文チェックをします。インデントのズレが原因であることが多いです。YAML はスペースの数が命で、タブは使えません。
Q:サービスが起動してもすぐ落ちる
docker compose logs サービス名 でログを確認します。メモリ不足や環境変数の設定ミスが多いです。Ollama を VPS で動かす場合は最低 4GB RAM を確保してください。
Q:スタンドアロン構成でサービス間通信できない
前述の通り、外部ネットワークを作成してすべての compose.yml に追加します。まず docker network ls でネットワークが存在するか確認してから起動してください。
Q:.env ファイルの変数が読み込まれない
compose.yml と .env ファイルが同じフォルダにあるか確認します。変数名に余分なスペースが入っていないかも確認してください。docker compose config で実際に読み込まれた値を確認できます。
まとめ
- Docker Compose のスタンドアロン構成は、サービスごとに compose ファイルを分割する管理方法
- 更新・トラブル対処・移行のすべてが楽になる
- サービス間通信には外部ネットワーク(external: true)が必要。事前に
docker network createで作成しておく - ボリューム名には接頭辞、restart: unless-stopped、ヘルスチェックを忘れずに設定する
- VPS 上で稼働させる場合は XServer VPS などの国内 VPS が手軽
n8n を Docker で構築する具体的な手順に興味がある方は、こちらの記事も参考にしてください。
n8nをDockerでセルフホストする手順|非エンジニア向け完全ガイド
0人が役に立ったと評価


コメント