Docker Composeでn8n・Ollamaを整理する方法

Docker Composeでn8n・Ollamaを整理する方法 アイキャッチ画像 AI自動化


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でセルフホストする手順|非エンジニア向け完全ガイド

コメント

タイトルとURLをコピーしました