环境准备
在开始部署之前,必须确保您的 RTX 5090 显卡能够被 Docker 正确识别和调用。
1. 安装 NVIDIA 5090 驱动
对于 RTX 5090 这样的最新显卡,您必须安装支持它的最新 NVIDIA 驱动。
- 访问 NVIDIA 官方驱动下载页面。
- 选择您的产品系列 (GeForce RTX 50 Series) 和型号 (RTX 5090)。
- 下载并安装最新的驱动程序(例如,版本 570 或更高,以支持 CUDA 12.8+)。
您可以通过在终端运行 nvidia-smi 来验证驱动是否安装成功。您应该能看到您的 5090 显卡信息。
2. 安装 Docker Engine
如果您的系统尚未安装 Docker,请执行以下命令:
# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc
# 设置 Docker 的 apt 仓库
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装 Docker Engine
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3. 安装 NVIDIA Container Toolkit
这是让 Docker 容器能够访问您的 5090 GPU 的核心组件。
# 1. 设置 GPG 密钥和仓库
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
# 2. 更新包列表并安装
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
# 3. 配置 Docker 运行时
sudo nvidia-ctk runtime configure --runtime=docker
# 4. 重启 Docker 服务
sudo systemctl restart docker
4. 验证 Docker 是否能调用 GPU
运行一个基于 CUDA 的 nvidia-smi 命令来最终确认:
sudo docker run --rm --gpus all nvidia/cuda:12.4.0-base-ubuntu22.04 nvidia-smi
如果您能在此容器的输出中看到您的 NVIDIA 5090 显卡信息,那么恭喜您,环境已准备就绪!
解决 RTX 5090 (Blackwell) 兼容性问题
解决在 NVIDIA GeForce RTX 5090 (Blackwell 架构) 上遇到的 sm_120 不兼容和 no kernel image is available 错误。
NVIDIA GeForce RTX 5090 with CUDA capability sm_120 is not compatible with the current PyTorch installation. The current PyTorch install supports CUDA capabilities sm_50 sm_60 sm_61 sm_70 sm_75 sm_80 sm_86 sm_90. ... RuntimeError: CUDA error: no kernel image is available for execution on the device
- 核心问题: RTX 4090 和 RTX 5090 的底层架构不同,4090 用的是 Ada Lovelace 架构,而 5090 用的是全新 Blackwell 架构,torch 库不兼容。目前的 PyTorch 官方版本还没完全支持 5090 的 Blackwell 核心。
- 解决方案: 我们将自定义构建一个 Docker 镜像,使用包含 CUDA 12.8 开发工具的 NVIDIA 官方镜像作为基础,并安装支持 cu128 的 PyTorch Nightly(日更版)。该版本已经开始支持 5090 的 Blackwell 架构,能凑合用。缺点是不够稳定,可能偶尔出点小问题,但基本能跑起来。
- 终极方案: 等 PyTorch 官方支持 5090 的稳定版(可能要几个月),到时直接用官方版本最省心。
Docker 部署 Stable-Diffusion-Webui (v1.10.1)
安装 Git:
sudo apt-get install -y git
步骤一:克隆 Stable-Diffusion-Webui 源码
我们首先需要获取 A1111 特定版本 的源码。
# 1. 选择一个工作目录,例如 ~/aigc_sd_webui
mkdir -p ~/aigc_sd_webui
cd ~/aigc_sd_webui
# 2. 克隆指定的 v1.10.1 版本 (也可以使用最新版)
git clone -b v1.10.1 https://github.com/AUTOMATIC1111/stable-diffusion-webui.git
注意: 后续所有操作(除非另有说明)都在 ~/aigc_sd_webui 这个目录中执行。
步骤二:创建自定义 Dockerfile
这是解决兼容性问题的核心。在 aigc_sd_webui (stable-diffusion-webui 目录同级) 下,创建一个名为 Dockerfile 的文件。
# --- Base Image ---
# Start from the official NVIDIA CUDA development image for Ubuntu 20.04
FROM nvidia/cuda:12.8.0-devel-ubuntu20.04
# --- Environment Variables ---
# Set all ENV vars at the top for clarity and configuration management.
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai
ENV HF_ENDPOINT=https://hf-mirror.com
# ENV HF_ENDPOINT=https://huggingface.co
# Add the virtual environment's bin directory to the PATH.
# This allows you to run `python` and `pip` directly without the full path.
ENV PATH="/app/venv/bin:$PATH"
# --- System-Level Dependencies ---
# Combine all apt commands into a single RUN layer to reduce image size.
RUN apt-get update && \
apt-get install -y --no-install-recommends software-properties-common && \
# Add the PPA for Python 3.10
add-apt-repository ppa:deadsnakes/ppa && \
add-apt-repository ppa:git-core/ppa && \
apt-get update && \
# Install all required system packages from all stages at once.
apt-get install -y --no-install-recommends \
git \
wget \
python3.10 \
python3.10-dev \
python3.10-venv \
python3-pip \
build-essential \
libgl1-mesa-glx \
libglib2.0-0 \
nscd \
vim \
# Add the dependencies for pycairo (needed by svglib)
libcairo2-dev \
pkg-config \
# Clean up the apt cache to keep the final image lean.
&& rm -rf /var/lib/apt/lists/*
# 配置 Git 信任所有挂载的目录。* 是一个通配符,可以让这个设置对您将来添加的任何插件都生效。
RUN git config --global --add safe.directory '*'
# --- Python Environment & Dependencies ---
# Set the working directory for the application.
WORKDIR /app
# Create the virtual environment and install all Python packages in one layer.
# This optimizes Docker's caching, as this layer only rebuilds if dependencies change.
RUN python3.10 -m venv venv && \
# Configure pip to use mirror URLs for faster downloads.
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \
pip config set global.extra-index-url https://download.pytorch.org/whl/nightly/cu128 && \
# Upgrade pip and install all packages using --no-cache-dir to reduce image size.
pip install --no-cache-dir --upgrade pip && \
# Install PyTorch
pip install --no-cache-dir --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu128 && \
# Install transformers, diffusers, and other packages
pip install --no-cache-dir \
transformers==4.30.2 \
diffusers==0.30.0 \
accelerate \
xformers \
open-clip-torch \
chardet \
fastapi \
PyExecJS \
lxml \
tqdm \
pathos \
cryptography \
openai \
boto3 \
aliyun-python-sdk-core \
aliyun-python-sdk-alimt \
svglib \
insightface
# --- Application Code & Data ---
# Copy the application source code. Changes to these files will invalidate the cache from this point onward.
# 【最终优化】使用 git clone 代替 ADD,确保 .git 目录存在
# RUN git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git /app
ADD stable-diffusion-webui/ .
# WORKDIR /app
# You can uncomment the line below if you consolidate your pip packages into a requirements file.
RUN pip install --no-cache-dir -r requirements_versions.txt
# --- Runtime Configuration ---
# Expose the port the application will listen on.
EXPOSE 7860
# Define the default command to execute when the container starts.
CMD [
"python", "launch.py",
"--listen",
"--port", "7860",
"--xformers",
"--enable-insecure-extension-access",
"--api",
"--skip-version-check"
]
保存并退出文件。
步骤三:构建 Docker 镜像
现在我们使用上一步创建的 Dockerfile 来构建本地镜像。
# 在 aigc_sd_webui 目录下执行
# -t 后面是 "镜像名称:标签",您可以自定义,例如 "sd-webui-rtx5090:latest"
docker build -t sd-webui-image .
注意: 此步骤会下载基础镜像、安装 PyTorch 和所有依赖,可能需要较长时间(10-30 分钟),具体取决于您的网络速度。
步骤四:准备本地数据目录(持久化)
为了让模型、输出和扩展插件保存在容器之外(方便管理、备份和共享),我们需要在宿主机上创建映射目录。
# 1. 设置一个您喜欢的数据根目录
export DATA_ROOT="$HOME/aigc_sd_webui/data"
# 2. 批量创建所需的子目录
mkdir -p $DATA_ROOT/models
mkdir -p $DATA_ROOT/outputs
mkdir -p $DATA_ROOT/embeddings
mkdir -p $DATA_ROOT/extensions
# (根据需要创建其他目录,如 configs 等)
echo "数据目录已准备就绪于:$DATA_ROOT"
现在,可以将下载好的 SD 大模型(.safetensors 文件)放入 $DATA_ROOT/models/Stable-diffusion 目录中。
步骤五:运行 Docker 容器
一切准备就绪。我们将运行在 步骤三 中构建的镜像,并挂载 步骤四 中准备的目录。
为了方便管理,建议将以下命令保存为一个启动脚本,例如 start_sd.sh。
# 1. 设置数据目录和镜像名称变量
export DATA_ROOT="$HOME/aigc_sd_webui/data"
export IMAGE_NAME="sd-webui-image"
# (您在步骤三中构建的镜像)
# 2. (可选) 设置 HuggingFace 镜像 (加速模型下载)
export HF_MIRROR="https://hf-mirror.com"
# 3. (可选) 设置网络代理 (如果您的网络需要)
export HTTP_PROXY="http://192.168.xx.xxx:7890"
export HTTPS_PROXY="http://192.168.xx.xxx:7890"
# 4. 运行容器
sudo docker run -it -d --gpus all \
--name sd-webui-5090 \
-p 7860:7860 \
# (可选) 挂载网络代理环境变量
# -e http_proxy="${HTTP_PROXY}" \
# -e https_proxy="${HTTPS_PROXY}" \
# (推荐) 挂载 HuggingFace 镜像地址
-e HF_ENDPOINT="${HF_MIRROR}" \
# 挂载数据卷 (将宿主机的 $DATA_ROOT 映射到容器内的 /app 对应目录)
-v ${DATA_ROOT}/models:/app/models \
-v ${DATA_ROOT}/outputs:/app/outputs \
-v ${DATA_ROOT}/embeddings:/app/embeddings \
-v ${DATA_ROOT}/extensions:/app/extensions \
-v ${DATA_ROOT}/repositories:/app/repositories \
# 指定您在步骤三中构建的镜像
${IMAGE_NAME} \
# 附加的 WebUI 启动参数 (这些会覆盖 Dockerfile 中的 CMD)
python launch.py \
--listen \
--port 7860 \
--xformers \
--enable-insecure-extension-access \
--api \
--skip-version-check
步骤六:查看日志和访问
容器已经以后台模式(-d)启动。您需要查看日志以确认它是否成功启动。
- **访问 WebUI:**打开您的浏览器,访问:
http://[您服务器的 IP 地址]:7860(如果是在本机运行,则访问http://localhost:7860)
查看实时日志:
docker logs -f sd-webui-5090
第一次启动时,它可能会下载一些必要的模型(如 Codeformer)。请耐心等待。当您看到类似 Running on local URL: http://0.0.0.0:7860 的提示时,表示启动成功。
Docker 部署 ComfyUI
对于 ComfyUI,我们同样使用 Docker。这里我们采用与 A1111 部署相同的策略:将数据目录持久化到宿主机,并使用一个功能完备的镜像。
步骤一:克隆 ComfyUI 源码
我们将克隆 ComfyUI 特定版本 的源码。这对于复现环境和兼容新硬件(如 RTX 5090)至关重要。
# 1. 选择一个工作目录,例如 ~/aigc_comfyui
mkdir -p ~/aigc_comfyui
cd ~/aigc_comfyui
# 2. 克隆指定的 v0.3.59 版本 (也可以使用最新版 可以使用`git describe --tags`验证)
git clone -b v0.3.59 https://github.com/comfyanonymous/ComfyUI.git
注意: 后续所有操作(除非另有说明)都在 ~/aigc_comfyui 这个目录中执行。
步骤二:创建自定义 Dockerfile
在 aigc_comfyui (ComfyUI 目录同级) 下,创建一个名为 Dockerfile 的文件。
# --- Base Image ---
# Start from the official NVIDIA CUDA development image for Ubuntu 20.04
FROM nvidia/cuda:12.8.0-devel-ubuntu20.04
# --- Environment Variables ---
# Set all ENV vars at the top for clarity and configuration management.
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai
ENV HF_ENDPOINT=https://hf-mirror.com
# ENV HF_ENDPOINT=https://huggingface.co
# Add the virtual environment's bin directory to the PATH.
# This allows you to run `python` and `pip` directly without the full path.
ENV PATH="/app/venv/bin:$PATH"
# --- System-Level Dependencies ---
# Combine all apt commands into a single RUN layer to reduce image size.
RUN apt-get update && \
apt-get install -y --no-install-recommends software-properties-common && \
# Add the PPA for Python 3.10
add-apt-repository ppa:deadsnakes/ppa && \
add-apt-repository ppa:git-core/ppa && \
apt-get update && \
# Install all required system packages from all stages at once.
apt-get install -y --no-install-recommends \
git \
wget \
python3.10 \
python3.10-dev \
python3.10-venv \
python3-pip \
build-essential \
libgl1-mesa-glx \
libglib2.0-0 \
nscd \
vim \
# Add the dependencies for pycairo (needed by svglib)
libcairo2-dev \
pkg-config \
# Clean up the apt cache to keep the final image lean.
&& rm -rf /var/lib/apt/lists/*
# 配置 Git 信任所有挂载的目录。* 是一个通配符,可以让这个设置对您将来添加的任何插件都生效。
RUN git config --global --add safe.directory '*'
# --- Python Environment & Dependencies ---
# Set the working directory for the application.
WORKDIR /app
# Create the virtual environment and install all Python packages in one layer.
# This optimizes Docker's caching, as this layer only rebuilds if dependencies change.
RUN python3.10 -m venv venv && \
. /app/venv/bin/activate && \
# Configure pip to use mirror URLs for faster downloads.
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple && \
pip config set global.extra-index-url https://download.pytorch.org/whl/nightly/cu128 && \
# Upgrade pip and install all packages using --no-cache-dir to reduce image size.
pip install --no-cache-dir --upgrade pip && \
# Install PyTorch
pip install --no-cache-dir --pre torch torchvision torchaudio xformers --index-url https://download.pytorch.org/whl/nightly/cu128 && \
# Install transformers, diffusers, and other packages
pip install --no-cache-dir \
transformers==4.30.2 \
diffusers==0.30.0 \
accelerate \
open-clip-torch \
chardet \
fastapi \
PyExecJS \
lxml \
tqdm \
pathos \
cryptography \
openai \
boto3 \
aliyun-python-sdk-core \
aliyun-python-sdk-alimt \
svglib \
insightface
# --- Application Code & Data ---
# Copy the application source code. Changes to these files will invalidate the cache from this point onward.
# 【最终优化】使用 git clone 代替 ADD,确保 .git 目录存在
# RUN git clone https://github.com/comfyanonymous/ComfyUI.git /app
ADD ComfyUI/ .
# Install any local packages that depend on the source code being present.
# RUN pip install --no-cache-dir -e ./repositories/k-diffusion
# You can uncomment the line below if you consolidate your pip packages into a requirements file.
RUN pip install --no-cache-dir -r requirements.txt
RUN which python && python --version
# --- Runtime Configuration ---
# Expose the port the application will listen on.
EXPOSE 8188
# Define the default command to execute when the container starts.
CMD [
"python", "main.py",
"--listen", "0.0.0.0",
"--port", "8188",
"--user-directory", "/app/userdata"
]
保存并退出文件。
步骤三:构建 Docker 镜像
现在我们使用上一步创建的 Dockerfile 来构建本地 ComfyUI 镜像。
# 在 aigc_comfyui 目录下执行
# -t 后面是 "镜像名称:标签",您可以自定义
docker build -t comfy-ui-image .
注意: 此步骤会下载基础镜像、安装 PyTorch 夜间版和所有依赖,可能需要较长时间(10-30 分钟)。
步骤四:准备本地数据目录(持久化)
为了让模型、工作流、输出和自定义节点保存在容器之外,我们在宿主机上创建映射目录。
# 1. 设置一个您喜欢的数据根目录
export COMFY_DATA_ROOT="$HOME/aigc_comfyui/data"
# 2. 批量创建所需的子目录
mkdir -p $COMFY_DATA_ROOT/models
mkdir -p $COMFY_DATA_ROOT/output
mkdir -p $COMFY_DATA_ROOT/input
mkdir -p $COMFY_DATA_ROOT/custom_nodes
mkdir -p $COMFY_DATA_ROOT/userdata
# (对应 --user-directory)
echo "ComfyUI 数据目录已准备就绪于:$COMFY_DATA_ROOT"
提示 (模型放置):
- SD 主模型 (Checkpoints): 放入
$COMFY_DATA_ROOT/models/checkpoints/ - LoRA: 放入
$COMFY_DATA_ROOT/models/loras/ - VAE: 放入
$COMFY_DATA_ROOT/models/vae/ - 工作流 (JSON): 放入
$COMFY_DATA_ROOT/input/ - 自定义插件: 放入
$COMFY_DATA_ROOT/custom_nodes/(放入后需重启容器)
步骤五:运行 Docker 容器
我们将运行在 步骤三 中构建的镜像,并挂载 步骤四 中准备的目录。
# 1. 设置数据目录和镜像名称变量
export COMFY_DATA_ROOT="$HOME/aigc_comfyui/data"
export IMAGE_NAME="comfy-ui-image"
# (您在步骤三中构建的镜像)
# 2. (可选) 设置 HuggingFace 镜像 (加速模型下载)
export HF_MIRROR="https://hf-mirror.com"
# 3. (可选) 设置网络代理 (如果您的网络需要)
# export HTTP_PROXY="http://192.168.xx.xxx:7890"
# export HTTPS_PROXY="http://192.168.xx.xxx:7890"
# 4. 运行容器
sudo docker run -it -d --gpus all \
--name comfy-ui \
-p 8188:8188 \
--restart unless-stopped \
# (可选) 挂载网络代理环境变量
# -e http_proxy="${HTTP_PROXY}" \
# -e https_proxy="${HTTPS_PROXY}" \
# (推荐) 挂载 HuggingFace 镜像地址
-e HF_ENDPOINT="${HF_MIRROR}" \
# 挂载数据卷 (将宿主机的 $COMFY_DATA_ROOT 映射到容器内的 /app 对应目录)
-v ${COMFY_DATA_ROOT}/models:/app/models \
-v ${COMFY_DATA_ROOT}/output:/app/output \
-v ${COMFY_DATA_ROOT}/input:/app/input \
-v ${COMFY_DATA_ROOT}/custom_nodes:/app/custom_nodes \
-v ${COMFY_DATA_ROOT}/userdata:/app/userdata \
# 指定您在步骤三中构建的镜像
${IMAGE_NAME} \
# 附加的 ComfyUI 启动参数 (这些会覆盖 Dockerfile 中的 CMD)
# --user-directory 对应 /app/userdata 挂载点
# 若遇到 xformers 相关 CUDA kernel 错误,可临时禁用以保证启动。
# --disable-xformers 是针对 Blackwell (5090) 架构的规避方案
python main.py \
--listen 0.0.0.0 \
--port 8188 \
--user-directory /app/userdata \
--disable-xformers
提示: 如果您不需要 --disable-xformers 或 --user-directory 参数,可以删除 python main.py ... 及其之后的所有行,容器将使用 Dockerfile 中的默认 CMD 启动。
步骤六:查看日志和访问
容器已经以后台模式(-d)启动。
**访问 ComfyUI:**打开您的浏览器,访问:http://[您服务器的 IP 地址]:8188(如果是在本机运行,则访问 http://localhost:8188)
查看实时日志:
docker logs -f comfy-ui
当您看到类似 To see the GUI go to: http://0.0.0.0:8188 的提示时,表示启动成功。
总结与模型管理
您现在已经在同一台服务器上成功部署了 Stable-Diffusion-Webui 和 ComfyUI,两者均已针对 RTX 5090 (Blackwell) 架构的特定 PyTorch/CUDA 环境进行了定制。
以下是一些关键的技巧和最佳实践,以帮助您更高效地管理这两个工具。
1. 关键:解决数据卷权限问题
当 Docker 容器以 root 用户身份运行时,它在挂载的卷(如 models, outputs)中创建的文件在宿主机上也会属于 root。这会导致您在宿主机上无法方便地管理(删除、移动)这些文件。
最佳实践 (预防):
在 docker run 命令中添加 --user "$(id -u):$(id -g)" 参数。这会强制容器内的进程以您当前宿主机用户的身份(而不是 root)运行,从一开始就避免所有权限问题。
ComfyUI 示例 (步骤五):
sudo docker run -it -d --gpus all \
--name comfy-ui \
--user "$(id -u):$(id -g)" \
# <-- 添加此行
-p 8188:8188 \
... # (其他参数)
SD-Webui 示例 (步骤五):
sudo docker run -it -d --gpus all \
--name sd-webui-5090 \
--user "$(id -u):$(id -g)" \
# <-- 添加此行
-p 7860:7860 \
... # (其他参数)
问题修复 (补救):
如果您已经遇到了权限问题(例如 "Permission denied"),可以在宿主机上执行以下命令,将数据目录的所有权递归地改回您当前的用户(请将 sutai:sutai 替换为您的 用户名:用户组)。
# 修复 SD-Webui 的数据目录权限
sudo chown -R sutai:sutai ~/aigc_sd_webui/data
# 修复 ComfyUI 的数据目录权限
sudo chown -R sutai:sutai ~/aigc_comfyui/data
2. 模型管理:共享模型以节省空间
为了节省宝贵的磁盘空间,最佳做法是让 SD-Webui 和 ComfyUI 共享同一个模型目录。
您可以通过 Docker 的 -v (volume) 挂载实现这一点。假设您在宿主机上创建了一个统一的模型库,例如 /mnt/aigc-models:
# 1. (宿主机) 创建统一的模型目录
mkdir -p /mnt/aigc-models/checkpoints
mkdir -p /mnt/aigc-models/loras
mkdir -p /mnt/aigc-models/vae
# ... 将您的 .safetensors 文件放入这些目录 ...
2. 在启动 SD-Webui 时映射:
(注意容器内的路径是 /app/models/...)
sudo docker run ... \
-v /mnt/aigc-models/checkpoints:/app/models/Stable-diffusion \
-v /mnt/aigc-models/loras:/app/models/Lora \
-v /mnt/aigc-models/vae:/app/models/VAE \
...
3. 在启动 ComfyUI 时映射:
(注意容器内的路径是 /app/models/...,与 SD-Webui 不同)
sudo docker run ... \
-v /mnt/aigc-models/checkpoints:/app/models/checkpoints \
-v /mnt/aigc-models/loras:/app/models/loras \
-v /mnt/aigc-models/vae:/app/models/vae \
...
通过这种方式,两个容器会从宿主机的同一位置读取模型,实现完美共享。
3. 其他实用技巧
安装扩展插件 (SD-Webui):
对于 SD-Webui,您可以将插件 git clone 到您挂载的 extensions 目录中:
cd ~/aigc_sd_webui/data/extensions
# 示例:安装中文汉化包
git clone https://github.com/dtlnor/stable-diffusion-webui-localization-zh_CN.git
# 示例:安装训练工具
git clone https://github.com/space-nuko/sd-webui-train-tools.git
# 示例:安装 Dreambooth
git clone https://github.com/d8ahazard/sd_dreambooth_extension.git
克隆后,重启 SD-Webui 容器 (docker restart sd-webui-5090) 以加载新插件。
检查源码版本:
在克隆仓库后,如果您想确认当前检出的版本是否正确,可以进入源码目录执行:
cd ~/aigc_comfyui/ComfyUI
git describe --tags
# 预期输出:v0.3.59
Hugging Face 环境变量:
在 docker run 时使用 -e 传入,以控制下载行为。
# 使用国内镜像 (已在教程中包含)
-e HF_ENDPOINT="https://hf-mirror.com"
# 强制使用官方源
# -e HF_ENDPOINT="https://huggingface.co"
# 尝试启用离线模式 (如果模型已完全下载)
# -e TRANSFORMERS_OFFLINE=1
# -e HF_DATASETS_OFFLINE=1
# -e HF_HUB_OFFLINE=1
通过合理的数据卷挂载、权限控制和模型共享策略,可以高效管理资源、避免重复下载,并确保系统长期稳定运行。
补充:常见问题——解决容器网络报错(DNS 解析失败/模型下载卡住)
在服务器环境部署时,部分用户可能遇到容器启动后反复报错 Failed to resolve 'hf-mirror.com'、Max retries exceeded,导致模型下载卡住;但同一镜像在个人电脑上却能正常运行,甚至服务器上的 ComfyUI 也无网络问题。这并非镜像或容器参数错误,核心原因是 服务器 Docker 桥接网络与 sd-webui 的网络需求不兼容,具体分析与解决方案如下:
一、问题根源:服务器环境的网络限制
sd-webui 启动时会通过 huggingface_hub 主动下载大量依赖模型(如 bert-base-uncased、yolov8),对网络连通性和 DNS 解析要求极高。而服务器(尤其是企业/学校内网)为安全考虑,会对 Docker 桥接网络施加限制,导致冲突:
| 限制类型 | 具体表现 | 对 sd-webui 的影响 |
|---|---|---|
| DNS 请求转发拦截 | 容器用宿主机 DNS 却无法解析域名 | 无法找到 hf-mirror.com 镜像源,模型下载触发重试 |
| 桥接网络隔离 | 服务器防火墙禁止 Docker 默认网段(172.17.0.0/16)访问外部端口 | HTTPS 请求被阻断,下载直接失败 |
| iptables 规则限制 | 宿主机未保留 Docker 自动生成的转发规则 | 容器网络请求无法通过宿主机出站 |
二、为何这些问题在个人电脑上不存在?
电脑与服务器的环境差异导致了这种区别:
- 网络策略宽松:个人电脑通常没有严格的防火墙或内网隔离策略,Docker 桥接网络的 DNS 请求和外部访问不会被拦截,因此容器即使使用默认 bridge 模式也能正常联网。
- Docker 配置默认开放:电脑上的 Docker 可能默认启用了更宽松的网络转发规则(如 iptables 默认允许桥接网络出站),而服务器为了安全,可能禁用了这些默认规则。
- 无内网安全限制:无需通过专用 DNS 或权限验证,直接访问外部镜像源无阻碍。
三、为何有时候只有 sd-webui 报错,ComfyUI 正常?
两个工具的网络行为差异导致表现不同:
- sd-webui:强实时网络依赖
sd-webui 在启动时会通过 huggingface_hub 库主动下载大量模型文件(如 bert-base-uncased、yolov8 等),且依赖 HF_ENDPOINT 指定的镜像源,对网络连通性和 DNS 解析的实时性要求极高。一旦桥接网络有微小限制(如 DNS 转发延迟、HTTPS 请求被拦截),就会触发明显的下载失败。 - ComfyUI:网络需求低且容错性高
默认优先使用本地缓存模型,仅在缺失核心文件时才下载,且下载逻辑允许更长超时时间,即使桥接网络有轻微限制,也能'勉强完成下载'或'跳过非核心文件',因此不易表现出错误。
四、解决方案:3 种适配服务器网络的部署方式
根据服务器权限开放程度,选择对应的解决方案:
方案 1:最推荐——使用 --network host 模式(无需调整服务器配置)
让容器完全共享宿主机网络栈,绕过 Docker 桥接网络限制,这是个人部署最便捷的方式。
修改后的启动命令(仅需添加 --network host 并删除无效的 -p 端口映射):
# 运行容器(适配服务器网络的最终版命令)
sudo docker run -it -d --gpus all \
--name sd-webui-5090 \
--restart unless-stopped \
--network host \
# 核心:共享宿主机网络,规避桥接限制
--user "$(id -u):$(id -g)" \
# 附加:解决宿主机文件权限问题
-e HF_ENDPOINT="https://hf-mirror.com" \
# 加速模型下载
# 挂载数据卷(路径与前文一致)
-v ${DATA_ROOT}/models:/app/models \
-v ${DATA_ROOT}/outputs:/app/outputs \
-v ${DATA_ROOT}/embeddings:/app/embeddings \
-v ${DATA_ROOT}/extensions:/app/extensions \
# 启动参数(端口直接用宿主机端口 8187,无需映射)
sd-webui-image \
python launch.py --listen --port 8187 --xformers --enable-insecure-extension-access --api --skip-version-check
方案 2:需服务器权限——调整桥接网络转发规则
若必须使用 bridge 模式(如多容器网络隔离需求),需联系服务器管理员开放权限:
- 允许 Docker 桥接网段(172.17.0.0/16)访问 DNS 服务器(如 202.204.65.5)的 UDP 53 端口;
- 保留 Docker 自动生成的
iptables转发规则,避免被防火墙清理; - 开放桥接网络访问
hf-mirror.com的 HTTPS 端口(443)。
方案 3:临时应急——手动下载模型到本地
若服务器网络限制严格且无法调整,可手动下载缺失模型到宿主机数据目录:
- 在宿主机浏览器访问 hf-mirror.com,搜索需要的模型(如
Bingsu/adetailer的face_yolov8n.pt); - 将下载的模型文件放入对应的挂载目录(如
${DATA_ROOT}/models/adetailer/); - 用默认
bridge模式启动容器,此时 sd-webui 无需联网下载,可直接使用本地模型。
五、验证网络是否恢复正常
启动容器后,通过以下命令确认网络问题已解决:
# 1. 进入容器
sudo docker exec -it sd-webui-5090 /bin/bash
# 2. 测试 DNS 解析(应返回 hf-mirror.com 的 IP)
apt-get install -y dnsutils # 安装解析工具
dig hf-mirror.com
# 3. 测试镜像源访问(应返回 HTTP 200)
curl -I https://hf-mirror.com
若上述命令均能正常执行,说明容器网络已适配服务器环境,sd-webui 将顺利完成启动并下载所需模型。
本文介绍了在 NVIDIA RTX 5090 显卡上使用 Docker 部署 Stable-Diffusion-Webui 和 ComfyUI 的完整流程。针对 Blackwell 架构(sm_120)兼容性,通过自定义构建包含 CUDA 12.8 和 PyTorch Nightly 的镜像解决。步骤涵盖驱动安装、Docker 及 NVIDIA Container Toolkit 配置、源码克隆、Dockerfile 编写、数据卷持久化挂载及网络模式选择(如 host 模式解决服务器 DNS 问题)。最终实现本地 AI 绘图工具的高效隔离与管理。


