相信不少兄弟都想在自己的服务器或者本地机器上跑一些有趣的WebUI应用,比如最近火到不行的AI绘画工具Stable Diffusion WebUI。但是,传统部署方式那一套环境配置、依赖安装、版本冲突,简直能把人折磨疯!“在我这儿明明好好的,怎么到服务器上就不行了?”这种灵魂拷问,咱都懂。
所以,今天的主角就是Docker!这玩意儿简单来说,就是个集装箱,能把你的应用程序和它所需要的所有环境(比如特定版本的Python、各种库文件等)一股脑儿打包起来。这样一来,无论你把这个“集装箱”搬到哪里(别的服务器、你的笔记本),里面的应用都能保证一个姿势运行,完美解决环境一致性问题。对于咱们要部署的Stable Diffusion WebUI(以AUTOMATIC1111版本为例,这是目前最流行、功能最全的社区版本之一),它是一个基于Web的用户界面,让你可以通过浏览器直观地与Stable Diffusion模型互动,输入文本提示词(Prompt)就能生成各种风格的图片。这东西对Python版本、CUDA版本、PyTorch版本以及一大堆依赖库都有特定要求,手动配起来,那叫一个酸爽。
废话不多说,今天咱就用Docker这把瑞士军刀,在Ubuntu系统下,利索地把Stable Diffusion WebUI给它安排得明明白白,而且还要用上NVIDIA的GPU来给它加速,让出图速度嗖嗖的!
一、战前准备:检查你的“弹药库”(环境要求)
在咱们撸起袖子加油干之前,先确保你的Ubuntu服务器(或者带Ubuntu的个人电脑)满足以下基本条件:
- 一个能打的Ubuntu系统: 推荐Ubuntu 20.04 LTS或Ubuntu 22.04 LTS。老版本可能有些坑。
- 一块给力的NVIDIA显卡: AI绘画可是个吃显存的家伙,没有N卡,或者N卡太老(比如GTX 9系以下),体验会比较差。至少也得有个6GB显存吧,8GB以上更佳。
- NVIDIA显卡驱动已正确安装: 这是让Docker能使唤你显卡的前提。你可以通过
nvidia-smi
命令来检查驱动是否正常工作。如果没装,赶紧去NVIDIA官网找对应你显卡型号的最新驱动装上。 - 足够的磁盘空间: Docker镜像、模型文件(一个模型动辄几个G)、生成的图片,这些都会占用不少空间。建议至少留个50GB以上的空闲空间,多多益善。
- 一颗爱折腾的心和稳定的网络: 毕竟要下载不少东西。
二、核心步骤:Docker化部署Stable Diffusion WebUI
步骤1:更新你的Ubuntu系统包列表
养成好习惯,开搞前先更新一波:
sudo apt update && sudo apt upgrade -y
这条命令的意思是:
sudo
: 以超级用户权限执行命令。apt update
: 从软件源更新可用的软件包列表。&&
: 逻辑与操作符,表示前一个命令成功执行后,再执行后一个命令。apt upgrade -y
: 升级所有已安装的软件包到最新版本,-y
参数表示自动确认所有提示。
步骤2:安装Docker引擎 (Docker Engine)
如果你的系统上还没有Docker,或者有很老的版本,咱们先来装个新的。
-
卸载旧版本(如果存在):
sudo apt-get remove docker docker-engine docker.io containerd runc
-
设置Docker的APT软件源:
sudo apt-get update sudo apt-get install \ ca-certificates \ curl \ gnupg \ lsb-release -y
这些是添加新的HTTPS软件源所必需的包。
-
添加Docker的官方GPG密钥:
bash sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
这步是为了验证后续下载的Docker软件包的真实性。
-
设置稳定版Docker软件源:
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
这条命令会根据你的系统架构(比如amd64)和Ubuntu版本代号(比如jammy, focal)来配置正确的Docker软件源。
-
安装Docker引擎、CLI和Containerd:
sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
docker-ce
: Docker Community Edition,社区版引擎。docker-ce-cli
: Docker命令行界面工具。containerd.io
: 一个核心的容器运行时。docker-compose-plugin
: 新版Docker Compose的插件形式(老版本是docker-compose
独立二进制)。
-
验证Docker是否安装成功:
sudo docker run hello-world
如果看到 "Hello from Docker!" 的信息,那就说明Docker已经成功安装并运行了。
-
(可选但强烈推荐) 将当前用户添加到docker用户组: 这样你以后执行docker命令就不用每次都加
sudo
了,省事儿!sudo usermod -aG docker $USER
执行完这条命令后,你需要退出当前终端会话(或者直接重启下系统)并重新登录,这样用户组的更改才会生效。之后你就可以直接用
docker version
这样的命令了。
步骤3:安装NVIDIA Container Toolkit (让Docker认识你的N卡)
为了让Docker容器能用上宿主机的NVIDIA GPU,我们需要安装NVIDIA Container Toolkit。
-
设置NVIDIA容器工具包的软件源:
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
这两条命令是组合起来的,第一条获取GPG密钥,第二条添加软件源信息并指定使用该密钥。
-
更新包列表并安装NVIDIA Docker工具包
sudo apt-get update sudo apt-get install -y nvidia-container-toolkit
旧版本可能叫
nvidia-docker2
,现在统一为nvidia-container-toolkit
。 -
配置Docker运行时并重启Docker服务: 通常安装工具包后会自动配置,但为了保险,可以手动执行(或者检查)并重启。
sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker
nvidia-ctk runtime configure --runtime=docker
会确保Docker的daemon.json
文件中正确设置了NVIDIA运行时。 -
测试NVIDIA Docker是否工作正常:
docker run --rm --gpus all nvidia/cuda:12.1.0-base-ubuntu22.04 nvidia-smi
--rm
: 容器退出后自动删除。--gpus all
: 把宿主机所有可用的NVIDIA GPU都分配给这个容器。nvidia/cuda:12.1.0-base-ubuntu22.04
: 这是一个NVIDIA官方提供的包含CUDA环境的Docker基础镜像。你可以根据你的驱动和需求选择合适的CUDA版本和基础系统版本。如果你的驱动比较老,可能需要用旧一点的CUDA镜像,比如nvidia/cuda:11.8.0-base-ubuntu20.04
。nvidia-smi
: 在容器内执行nvidia-smi
命令。
如果这条命令成功运行,并且输出了和你宿主机上执行
nvidia-smi
类似的显卡信息,那么恭喜你,Docker已经可以愉快地使用你的NVIDIA GPU了!
步骤4:准备Stable Diffusion WebUI的持久化数据目录
为了让我们的模型、配置、生成的图片等数据在Docker容器重启甚至删除后依然存在,我们需要把这些数据存储在宿主机上,然后映射到容器里。
在你的用户主目录下(或者其他你喜欢的地方)创建一些文件夹:
mkdir -p ~/stable-diffusion-webui/data
mkdir -p ~/stable-diffusion-webui/models/Stable-diffusion
mkdir -p ~/stable-diffusion-webui/models/VAE
mkdir -p ~/stable-diffusion-webui/models/Lora
mkdir -p ~/stable-diffusion-webui/models/ControlNet
mkdir -p ~/stable-diffusion-webui/models/ESRGAN # 用于超分模型
mkdir -p ~/stable-diffusion-webui/outputs
mkdir -p ~/stable-diffusion-webui/config
mkdir -p ~/stable-diffusion-webui/extensions
mkdir -p
:-p
参数确保如果父目录不存在也会一并创建。~/stable-diffusion-webui/data
: 可以用来存放一些通用的数据。~/stable-diffusion-webui/models/...
: 分门别类存放你的主模型(checkpoints)、VAE、Lora、ControlNet模型、超分模型等。~/stable-diffusion-webui/outputs
: 所有生成的图片、网格图等都会默认保存在这里。~/stable-diffusion-webui/config
: 存放WebUI的配置文件,如config.json
,ui-config.json
。~/stable-diffusion-webui/extensions
: 存放你安装的各种WebUI扩展。
你可以根据自己的需求调整目录结构。记住这些你创建的宿主机路径,后面Docker命令或Compose文件里会用到。
步骤5:选择并拉取一个Stable Diffusion WebUI的Docker镜像
社区里有很多大佬打包好了Stable Diffusion WebUI的Docker镜像,我们可以直接用。在Docker Hub上搜索"stable diffusion webui gpu"之类的关键词,你会找到不少选择。一些流行的镜像,比如 AUTOMATIC1111/stable-diffusion-webui
(官方可能没有直接提供Docker,但社区有很多基于它的)或者一些第三方维护的比如 hlky/sd-webui
(这个比较老了,找更新的)、continueai/continue-stable-diffusion
等等。
这里我们假设使用一个常见的社区镜像,比如 someuser/stable-diffusion-webui-docker:latest-cuda
(请替换为你实际找到并选择的镜像名)。
拉取镜像:
docker pull someuser/stable-diffusion-webui-docker:latest-cuda
请将 someuser/stable-diffusion-webui-docker:latest-cuda
替换成你选择的实际镜像名称和标签。标签通常会指明CUDA版本或GPU支持,比如 cu118
(CUDA 11.8), cu121
(CUDA 12.1)等,确保它和你上一步测试 nvidia-smi
时所用的CUDA版本兼容或接近。
步骤6:运行Stable Diffusion WebUI容器
这是最关键的一步。我们可以用 docker run
命令,也可以用 docker-compose.yml
文件来管理。对于参数比较多的应用,强烈推荐后者。
方法一:使用 docker run
命令
docker run -d --name sd-webui \
--gpus all \
-p 7860:7860 \
-v ~/stable-diffusion-webui/data:/data \
-v ~/stable-diffusion-webui/models:/app/models \
-v ~/stable-diffusion-webui/outputs:/app/outputs \
-v ~/stable-diffusion-webui/config:/app/config \
-v ~/stable-diffusion-webui/extensions:/app/extensions \
-e CLI_ARGS="--xformers --enable-insecure-extension-access --listen --port 7860" \
someuser/stable-diffusion-webui-docker:latest-cuda
参数详解:
docker run
: 运行一个新容器。-d
: 后台运行容器 (detached mode)。--name sd-webui
: 给容器取个名字,方便管理,比如叫sd-webui
。--gpus all
: 将所有可用的NVIDIA GPU分配给容器。-p 7860:7860
: 端口映射。将宿主机的7860端口映射到容器的7860端口(这是Stable Diffusion WebUI的默认端口)。如果你宿主机的7860端口被占用了,可以改成比如-p 8888:7860
,那么你访问时就用http://你的IP:8888
。-v HOST_PATH:CONTAINER_PATH
: 卷映射 (Volume mounting)。~/stable-diffusion-webui/data:/data
: 将宿主机的~/stable-diffusion-webui/data
目录映射到容器内的/data
目录 (具体容器内路径可能因镜像而异,请参考你所用镜像的文档)。~/stable-diffusion-webui/models:/app/models
: 将宿主机的模型目录映射到容器内WebUI读取模型的路径 (通常是/app/models
或/stable-diffusion-webui/models
,具体看镜像打包结构)。~/stable-diffusion-webui/outputs:/app/outputs
: 输出目录。~/stable-diffusion-webui/config:/app/config
: 配置文件目录。~/stable-diffusion-webui/extensions:/app/extensions
: 扩展目录。 注意: 容器内的路径 (/data
,/app/models
等) 需要根据你选择的Docker镜像的实际文件结构来定,务必查阅该镜像的说明文档。
-e CLI_ARGS="--xformers --enable-insecure-extension-access --listen --port 7860"
: 设置环境变量CLI_ARGS
。这个变量会被传递给WebUI的启动脚本作为命令行参数。--xformers
: 启用xformers库,可以显著提升NVIDIA显卡的生图速度并降低显存消耗(需要你的显卡支持,并且镜像内已安装)。--enable-insecure-extension-access
: 允许从WebUI界面安装第三方扩展(请注意安全风险,只安装信任的扩展)。--listen
: 让WebUI监听所有网络接口(0.0.0.0),这样局域网内其他机器也能通过服务器IP访问。如果只想本机访问,可以去掉这个参数或改为--listen --share
(会生成一个gradio的公网分享链接,但不推荐长期使用)。--port 7860
: 指定WebUI在容器内监听的端口。
someuser/stable-diffusion-webui-docker:latest-cuda
: 你要运行的Docker镜像名称和标签。
方法二:使用 docker-compose.yml
文件 (推荐)
在你的 ~/stable-diffusion-webui
目录下创建一个名为 docker-compose.yml
的文件,内容如下:
version: '3.8'
services:
stable-diffusion-webui:
image: someuser/stable-diffusion-webui-docker:latest-cuda # 替换成你的镜像
container_name: sd-webui
ports:
- "7860:7860"
volumes:
- ./data:/data # 假设容器内WebUI的数据根目录是/data
- ./models:/app/models # 假设容器内WebUI的模型根目录是/app/models
- ./outputs:/app/outputs
- ./config:/app/config
- ./extensions:/app/extensions
# 如果需要更细致的映射,可以像下面这样:
# - ./models/Stable-diffusion:/app/models/Stable-diffusion
# - ./models/VAE:/app/models/VAE
# - ./models/Lora:/app/models/Lora
environment:
- CLI_ARGS=--xformers --enable-insecure-extension-access --listen --port 7860
# - TZ=Asia/Shanghai # 可选:设置时区
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all # 或者指定 capabilities: [gpu]
capabilities: [gpu]
restart: unless-stopped
配置文件详解:
version: '3.8'
: 指定Compose文件格式版本。services
: 定义服务。stable-diffusion-webui
: 服务名,可以自定义。image
: 使用的Docker镜像。container_name
: 容器名。ports
: 端口映射,格式同docker run -p
。volumes
: 卷映射。这里使用了相对路径./data
,它相对于docker-compose.yml
文件所在的目录。environment
: 环境变量,同docker run -e
。deploy.resources.reservations.devices
: 这是Docker Compose v2.1+ 版本中声明GPU资源的方式,确保容器能使用NVIDIA GPU。restart: unless-stopped
: 定义重启策略。unless-stopped
表示除非手动停止,否则容器总会自动重启(比如Docker服务重启或宿主机重启后)。
然后在 docker-compose.yml
文件所在的目录 (~/stable-diffusion-webui
) 执行:
docker-compose up -d
docker-compose up
: 创建并启动服务。-d
: 后台运行。
第一次启动时,WebUI可能会下载一些基础模型或依赖,需要耐心等待。你可以通过以下命令查看容器日志:
docker logs -f sd-webui
(-f
参数表示持续跟踪日志输出,按 Ctrl+C
退出跟踪)
当你在日志中看到类似 "Running on local URL: http://0.0.0.0:7860" 或 "Uvicorn running on http://0.0.0.0:7860" 的信息时,就表示WebUI已经成功启动了!
步骤7:访问你的Stable Diffusion WebUI
打开你的浏览器,输入 http://你的服务器IP地址:7860
(如果修改了宿主机端口,则使用修改后的端口)。如果一切顺利,你应该能看到Stable Diffusion WebUI的界面了!
现在,你可以去网上下载你喜欢的模型文件(.ckpt 或 .safetensors 后缀),放到之前创建的宿主机 ~/stable-diffusion-webui/models/Stable-diffusion
目录下,然后在WebUI界面的左上角刷新模型列表,选择模型,输入你的奇思妙想,开始AI创作之旅吧!
三、后续维护与小技巧
-
停止与启动:
- 如果用
docker run
启动的:docker stop sd-webui docker start sd-webui
- 如果用
docker-compose
启动的: 在docker-compose.yml
所在目录执行
或者直接docker-compose stop docker-compose start
docker-compose down
(停止并移除容器,但不删除卷) 和docker-compose up -d
(重新创建并启动)。
- 如果用
-
更新WebUI镜像: 当你想更新到最新版的WebUI时(假设镜像维护者发布了新版本):
# 对于 docker run 用户 docker stop sd-webui docker rm sd-webui # 先删除旧容器 docker pull someuser/stable-diffusion-webui-docker:latest-cuda # 拉取新镜像 # 然后重新执行之前的 docker run 命令 # 对于 docker-compose 用户 cd ~/stable-diffusion-webui docker-compose pull # 拉取配置文件中指定镜像的最新版本 docker-compose down # 停止并移除旧容器 docker-compose up -d # 使用新镜像重新创建并启动容器
-
查看日志:
docker logs sd-webui # 查看全部日志 docker logs -f sd-webui # 实时跟踪日志 docker logs --tail 100 sd-webui # 查看最后100行日志
-
进入容器内部(调试用):
docker exec -it sd-webui /bin/bash
这样你就可以进入容器的命令行环境,进行一些排错或检查。
四、总结
通过Docker部署Stable Diffusion WebUI,咱们不仅大大简化了安装配置流程,还能享受到环境隔离、轻松迁移、便捷更新等诸多好处。特别是对于NVIDIA GPU的利用,NVIDIA Container Toolkit 和 Docker 的结合使得这一切都变得相对简单。
希望这篇“保姆级”教程能帮到各位想玩AI绘画但又被环境劝退的兄弟们。现在,你已经拥有了一个属于自己的、跑在Docker里的、由NVIDIA GPU加速的AI绘画平台了!赶紧去生成一些令人惊艳的作品