ComfyUIには公式のDockerイメージがありません。公式の手動インストール手順をそのままDockerfileに写し、NVIDIA Container ToolkitでGPUを通し、models・output・custom_nodesをVolumeとして外に出す構成が基本です。Docker化で分離できるのはPythonとライブラリの依存であり、GPU Driver・VRAM・危険なCustom Nodeの問題はHost側に残ります。
情報確認日:2026年8月22日(日本時間)
結論:公式手順をDockerfileに写し、Volumeとversionを自分で管理する
責任範囲
- Docker化で分離できるもの(Python・pip・torch)と、できないもの(GPU Driver・VRAM)を線引きする
- NVIDIA Container Toolkitを公式手順で入れ、Containerから
nvidia-smiが見えることを先に確かめる - 公式の手動インストール手順を元にDockerfileを自分で書き、tagではなくcommitで固定する
- models・input・output・custom_nodes・userをImageに焼き込まず、Volumeに出す
- LAN・外部公開時の認証はComfyUIの認証設計、モデル共有はextra_model_paths.yamlの設定、VRAM不足はVRAM不足の切り分けに任せる
Docker化で何が分離できるか
Docker化の効果は「Python環境の壊れにくさ」に集中しています。Custom Nodeが要求するライブラリの衝突、torchのversion違い、システムPythonの汚染はContainerの中に閉じ込められます。一方で、GPUを動かすDriverはHostのカーネルに属するため、Containerの中には持ち込めません。
| 要素 | どこにあるか | Docker化で分離できるか |
|---|---|---|
| Python本体・pip・requirements | Image内 | できる。Imageを作り直せば元に戻る |
| torch・CUDA runtime(pip版) | Image内 | できる。ただしHost Driverが対応するCUDA versionに依存 |
| NVIDIA Driver | Host | できない。Host側で更新・管理する |
| VRAM容量 | 物理GPU | できない。Containerでも同じ上限 |
| models・output・custom_nodes | Volume(Host側のフォルダ) | 分離しない。消えないように外に出す |
公式ドキュメントのインストール案内(2026年8月時点)は、Desktopアプリ・Windows portable・comfy-cli・手動インストール・Cloudの5つで、Dockerは含まれていません。FAQには「公式Dockerイメージは提供していない。Containerで動かしたい場合はDocker Hubのコミュニティイメージを探す」と明記されています。この記事ではコミュニティイメージを使わず、公式の手動手順を自分でDockerfileに書く方法を取ります。中身を自分で把握できるからです。
GPUをContainerから確認するにはどうするか
ComfyUIを入れる前に、ContainerからGPUが見える状態を作ります。NVIDIA Container Toolkitの公式手順(Ubuntu/Debian)は次の順です。前提として、HostにNVIDIA Driverが入っていてnvidia-smiが動くことを確認しておきます。
# 1. リポジトリ追加(公式手順どおり)
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | \
sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get update
# 2. インストール
sudo apt-get install -y nvidia-container-toolkit
# 3. Docker に runtime を登録して再起動
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker
# 4. Container から GPU が見えるか
docker run --rm --gpus all ubuntu nvidia-smi
4でHostと同じGPU名とDriver versionが表示されれば、GPUの疎通は完了です。ここで失敗する場合、原因はComfyUIではなくDriverかToolkitにあります。公式のインストールガイドは更新されるため、コマンドの細部は実行前に公式ページで確認してください。
WindowsではDocker DesktopとWSL2の組み合わせでGPUを通す方法が別にあります。この記事のコマンドはLinux Host向けです。macOSはNVIDIA GPUを使えないため、この記事の対象外です。
ComfyUIをどう起動するか
Dockerfileは公式の手動インストール手順(git clone、torchのインストール、requirements.txt、python main.py)を1行ずつ写したものです。Imageに入れるのはコードとライブラリだけで、modelや出力は入れません。
# Dockerfile
FROM python:3.12-slim
ARG COMFYUI_REF=master # build 時に tag か commit hash を渡す
RUN apt-get update && apt-get install -y --no-install-recommends git \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /app
RUN git clone https://github.com/comfyanonymous/ComfyUI.git . \
&& git checkout "${COMFYUI_REF}" \
&& git rev-parse HEAD > /app/COMFYUI_COMMIT
# 公式手順の torch 行。index URL は公式の最新手順に合わせる
RUN pip install --no-cache-dir torch torchvision torchaudio \
--extra-index-url https://download.pytorch.org/whl/cu130 \
&& pip install --no-cache-dir -r requirements.txt
EXPOSE 8188
CMD ["python", "main.py", "--listen", "0.0.0.0", "--port", "8188"]
--listen 0.0.0.0はContainerの外(Host)からアクセスするために必要です。ComfyUIの既定は127.0.0.1で、Containerの中だけで待ち受けてしまいます。ただしこの設定はContainer内の話で、Host側のポート公開は次のcomposeで127.0.0.1:8188:8188と書き、LANには出しません。
# compose.yaml
services:
comfyui:
build:
context: .
args:
COMFYUI_REF: "TAG_OR_COMMIT" # 実際に使う tag か commit hash に置き換える
image: comfyui-local:TAG_OR_COMMIT
ports:
- "127.0.0.1:8188:8188"
volumes:
- ./models:/app/models
- ./input:/app/input
- ./output:/app/output
- ./custom_nodes:/app/custom_nodes
- ./user:/app/user
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
docker compose build
docker compose up -d
docker compose logs -f comfyui # 起動ログ。custom_nodes の読み込み結果もここに出る
ブラウザでhttp://127.0.0.1:8188を開き、現行UI(2026年8月時点)が表示されれば起動は成功です。modelを置いていない段階ではcheckpointの一覧が空なので、次のVolume設計で置き場所を決めます。
Volumeはどう設計するか
Imageに焼き込んではいけないのは「大きいもの」「変わるもの」「失うと困るもの」の3種類です。ComfyUIではmodels・input・output・custom_nodes・userが該当します。公式ドキュメントが案内するフォルダ構成(ComfyUI/models/checkpointsなど)をそのままHost側に作り、同じパスにmountします。
| Container内パス | 中身 | Volumeに出す理由 |
|---|---|---|
/app/models |
checkpoint・LoRA・VAE・ControlNet | 数GB〜数十GB。Imageに入れると再buildのたびに転送される |
/app/input |
img2imgや参照画像 | 人が置くファイル。Containerの再作成で消えると困る |
/app/output |
生成結果 | 成果物。Containerを消しても残す |
/app/custom_nodes |
Custom Node本体 | Imageを変えずに追加・削除・無効化したい |
/app/user |
保存したworkflow・設定 | UIの設定とworkflowを失わない |
既にHost側で手動インストール版を使っていて、modelフォルダを共有したい場合は、./modelsの代わりにそのフォルダをmountするか、extra_model_paths.yamlを用意して--extra-model-paths-configで渡します。yamlの書き方はextra_model_paths.yamlの設定方法を参照してください。
custom_nodesをVolumeに出すと、Custom Nodeが要求するpipライブラリはImageに入っていません。追加が必要な場合は、Dockerfileにpip install行を足して再buildするか、Container内で入れたうえで「再作成すると消える」ことを理解して使います。再現性を保つなら前者です。
Versionをどう固定するか
latestやmasterのまま使うと、docker compose buildのたびに違うComfyUIが入ります。固定する対象は3つあり、すべて自分で記録します。
| 固定する対象 | 方法 | 記録場所 |
|---|---|---|
| ComfyUI本体 | COMFYUI_REFにtagまたはcommit hashを渡す |
compose.yamlのargsと、Image内の/app/COMFYUI_COMMIT |
| torch・CUDA index | Dockerfileに明記。変えるときはcommitで残す | Dockerfile |
| Image自体 | image:のtagをComfyUIのversionと揃える |
compose.yaml |
# 動いている Container の ComfyUI commit を確認
docker compose exec comfyui cat /app/COMFYUI_COMMIT
# torch の version と CUDA が有効か
docker compose exec comfyui python -c "import torch; print(torch.__version__, torch.cuda.is_available())"
tagよりcommit hashの方が確実です。tagは打ち直されることがありますが、commit hashは同じ中身を一意に指します。更新するときはCOMFYUI_REFを変えて別tagのImageをbuildし、旧Imageを残しておけば、問題があればimage:を戻すだけで切り戻せます。
Dockerでも残る問題は何か
Docker化で解決したように見えて、実際には何も変わらない問題があります。期待と現実を分けておきます。
Dockerで解決すること
- Custom Node同士のpipライブラリ衝突
- システムPythonを汚さない
- 壊れたら
buildし直せば元に戻る - 別PCへ同じ構成を持ち運べる(modelsは別送)
Dockerでは解決しないこと
- VRAM不足。同じGPUなら同じ上限で、
--lowvram等の対処も同じ - Host DriverとCUDA versionの互換性。Driverが古ければContainer内のtorchも動かない
- 危険なCustom Node。ContainerはVolumeに書け、ネットワークにも出られる
- ディスク容量。modelsはVolumeなので減らない
特にCustom Nodeについては、「Containerだから何を入れても安全」という理解は誤りです。mountしたmodels・outputは書き換えられますし、既定のネットワーク設定では外部へ通信できます。Custom Nodeの選び方と権限の考え方は、Docker化の前後で変わりません。
Host版とDocker版で同じworkflowを1回ずつ実行する
Docker化が正しくできたかは、同じworkflowをHost版(手動インストール)とDocker版で1回ずつ実行し、差を見れば分かります。seed・model・解像度を固定し、次の表を埋めます。
| 項目 | Host版 | Docker版 | 一致すべきか |
|---|---|---|---|
| ComfyUI commit | 一致させる | ||
| torch version / CUDA有効 | 一致が望ましい | ||
| nvidia-smiのDriver version | 同じHostなら一致 | ||
| 起動ログのCustom Node読み込み結果 | 一致させる | ||
| 「Prompt executed in」の秒数 | 近い値になるはず | ||
| 出力画像(同一seed) | 同じtorch・同じGPUならほぼ一致 |
commitとtorchが同じで画像が大きく違うなら、Volumeのmodelが別物か、Custom Nodeの読み込み結果が違っています。生成秒数が大きく違うなら、GPUがContainerから使えていない(CPUで動いている)可能性を先に疑い、torch.cuda.is_available()を確認します。
よくある質問
Docker Hubのコミュニティイメージを使ってはいけませんか?
公式FAQはコミュニティイメージの存在を案内していますが、公式のサポート対象ではありません。使う場合はDockerfileを読み、何をどのversionで入れているかを把握してからにしてください。この記事で自作を勧めるのは、その把握を省けないからです。
Containerを消したらmodelやworkflowは消えますか?
この記事のcomposeどおりにVolumeへ出していれば消えません。消えるのはImage内に入れたもの、つまりComfyUIのコードとpipライブラリだけで、それはbuildで再生成できます。
Dockerにすれば外部公開も安全になりますか?
なりません。この記事では127.0.0.1:8188にだけ公開しています。LANや外部に出す場合の認証・TLS・リバースプロキシはComfyUIをLAN・外部公開するときの認証設計を参照してください。
まとめ
ComfyUIのDocker化は、公式Dockerイメージがない前提で、公式の手動インストール手順をDockerfileに写す形が基本です。GPUはNVIDIA Container Toolkitで通し、nvidia-smiがContainerから見えることを先に確かめます。
models・input・output・custom_nodes・userはVolumeに出し、ComfyUIはcommit hashで固定して記録します。分離できるのはPython依存までで、VRAM・Driver・Custom Nodeの危険性はHostと同じ問題として残ることを忘れないでください。