一、Docker安装
前提条件
防火墙的局限性
在安装 Docker 之前,请务必考虑以下安全影响和防火墙不兼容的问题。
- 如果你用 ufw 或 firewalld 来管理防火墙设置,请注意 当你用 Docker 暴露容器端口时,这些端口会绕过你的 防火墙规则。更多信息请参见 Docker 和 UFW。
- Docker 仅兼容
iptables-nft和iptables-legacy。用NFT创建的防火墙规则在安装了 Docker 的系统上不被支持。确保你使用的任何防火墙规则集都是用iptables或ip6tables创建的,并且把它们添加到DOCKER-USER链中, 参见 数据包过滤和防火墙 。
操作系统需求
要安装 Docker Engine,你需要以下几个 Ubuntu 版本中的一个 64 位版本:
- Ubuntu Resolute 26.04 (LTS)
- Ubuntu Questing 25.10
- Ubuntu Noble 24.04 (LTS)
- Ubuntu Jammy 22.04 (LTS)
Ubuntu Docker Engine 兼容 x86_64(或 amd64)、armhf、arm64、s390x 和 ppc64le(ppc64el)架构。
注释:在 Ubuntu 衍生发行版(如 Linux Mint)上安装并不被官方支持(但可能可行)。
卸载旧版本
在安装 Docker Engine 之前,你需要卸载所有冲突包。
你的 Linux 发行版可能提供非官方的 Docker 包,这可能会与 Docker 官方包发生冲突。在安装官方版本的 Docker Engine 之前,必须先卸载这些包。
非官方的卸载包有:
docker.iodocker-composedocker-compose-v2docker-docpodman-docker
此外,Docker Engine 依赖于 containerd 和 runc。Docker Engine 将这些依赖捆绑成一个包: containerd.io。如果你之前安装过 containerd 或 runc,请卸载它们以避免与 Docker Engine 捆绑版本冲突。
执行以下命令卸载所有冲突包:
bash
sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)
APT 可能会报告你没有安装这些软件包。
存储在 /var/lib/docker/ 中的镜像、容器、卷和网络则不是 卸载 Docker 时会自动移除。如果你想从一个 清洁安装,并倾向于清理现有数据,请阅读 卸载 Docker Engine 部分。
安装方法
你可以根据需求以不同方式安装 Docker Engine:
-
Docker Engine 自带 Linux 版 Docker 桌面版。这是最简单、最快速的入门方式。
-
从以下设备搭建并安装 Docker Engine Docker 的
apt仓库 。 -
手动安装并手动管理升级。
-
使用方便的脚本 。仅推荐用于测试和开发环境。
Apache 许可证,版本 2.0。完整许可请参见许可 。
使用 apt 仓库安装
在你第一次在新主机上安装 Docker Engine 之前,你需要先设置 Docker apt 仓库。之后,你可以从仓库安装并更新 Docker。
-
搭建 Docker 的
apt仓库。bash# Add Docker's official GPG key: sudo apt update sudo apt install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # Add the repository to Apt sources: sudo tee /etc/apt/sources.list.d/docker.sources <<EOF Types: deb URIs: https://download.docker.com/linux/ubuntu Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") Components: stable Architectures: $(dpkg --print-architecture) Signed-By: /etc/apt/keyrings/docker.asc EOF sudo apt update -
安装 Docker 包。
要安装最新版本,请运行:
bashsudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin注释
安装后,确认 Docker 是否在运行:
sudo systemctl status docker如果 Docker 未运行,请手动启动:
sudo systemctl start docker -
通过运行
hello-world镜像验证安装成功:bashsudo docker run hello-world该命令下载测试镜像并在容器中运行。当容器运行时,它会打印确认消息然后退出。
你现在已经成功安装并启动了 Docker Engine。
提示
尝试无 root 运行时会收到错误吗?
docker 用户组存在但没有用户,这就是为什么你需要用 sudo 来运行 Docker 命令。继续 Linux 安装后 允许非特权用户运行 Docker 命令及其他可选配置步骤。
从包安装
如果你不能用 Docker 的 apt 仓库安装 Docker Engine,可以下载你版本的 deb 文件并手动安装。每次升级 Docker Engine 都需要下载一个新文件。
-
在列表中选择你的 Ubuntu 版本。
-
进入
pool/stable/,选择适用的架构(amd64,ARMMHF、ARM64或S390X)。 -
下载以下
Deb文件,适用于 Docker Engine、CLI、containerd 和 Docker Compose 包:containerd.io<version>_<arch>__.deb<version>docker-ce__<arch>.debdocker-ce-cli_<version>_<arch>.debdocker-buildx-plugin_<version>_<arch>.debdocker-compose-plugin_<version>_<arch>.deb
-
安装 .deb 包。将以下示例中的路径更新到你下载的 Docker 包的位置。
bashsudo dpkg -i ./containerd.io_<version>_<arch>.deb \ ./docker-ce_<version>_<arch>.deb \ ./docker-ce-cli_<version>_<arch>.deb \ ./docker-buildx-plugin_<version>_<arch>.deb \ ./docker-compose-plugin_<version>_<arch>.deb注释
安装后,确认 Docker 是否在运行:
sudo systemctl status docker如果 Docker 未运行,请手动启动:
sudo systemctl start docker -
通过运行 hello-world 镜像验证安装成功:
bashsudo docker run hello-world该命令下载测试镜像并在容器中运行。当容器运行时,它会打印确认消息然后退出。
你现在已经成功安装并启动了 Docker Engine。
尝试无 root 运行时会收到错误吗?
docker 用户组存在但没有用户,这就是为什么你需要用 sudo 来运行 Docker 命令。继续 Linux 安装后 允许非特权用户运行 Docker 命令及其他可选配置步骤。
二、Dify 安装
1. 克隆 Dify
将 Dify 源代码克隆到本地机器。
bash
git clone --branch "$(curl -s https://api.github.com/repos/langgenius/dify/releases/latest | jq -r .tag_name)" https://github.com/langgenius/dify.git
2. 启动 Dify
-
导航到 Dify 源代码中的
docker目录:bashcd dify/docker -
复制示例环境配置文件:
bashcp .env.example .env -
根据你的 Docker Compose 版本选择相应命令启动容器:
bashdocker compose up -d运行 docker compose version 检查你的 Docker Compose 版本。
将启动以下容器:
- 5 个核心服务:api、worker、worker_beat、web、plugin_daemon
- 6 个依赖组件:weaviate、db_postgres、redis、nginx、ssrf_proxy、sandbox
你应该会看到类似以下的输出,显示每个容器的状态和启动时间:
bash[+] Running 13/13 ✔ Network docker_ssrf_proxy_network Created 10.0s ✔ Network docker_default Created 0.1s ✔ Container docker-sandbox-1 Started 0.3s ✔ Container docker-db_postgres-1 Healthy 2.8s ✔ Container docker-web-1 Started 0.3s ✔ Container docker-redis-1 Started 0.3s ✔ Container docker-ssrf_proxy-1 Started 0.4s ✔ Container docker-weaviate-1 Started 0.3s ✔ Container docker-worker_beat-1 Started 3.2s ✔ Container docker-api-1 Started 3.2s ✔ Container docker-worker-1 Started 3.2s ✔ Container docker-plugin_daemon-1 Started 3.2s ✔ Container docker-nginx-1 Started 3.4s -
验证所有容器是否成功运行:
bashdocker compose ps你应该会看到类似以下的输出,每个容器的状态应为
Up或healthy:bashNAME IMAGE COMMAND SERVICE CREATED STATUS PORTS docker-api-1 langgenius/dify-api:1.10.1 "/bin/bash /entrypoi..." api 26 seconds ago Up 22 seconds 5001/tcp docker-db_postgres-1 postgres:15-alpine "docker-entrypoint.s..." db_postgres 26 seconds ago Up 25 seconds (healthy) 5432/tcp docker-nginx-1 nginx:latest "sh -c 'cp /docker-e..." nginx 26 seconds ago Up 22 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp docker-plugin_daemon-1 langgenius/dify-plugin-daemon:0.4.1-local "/bin/bash -c /app/e..." plugin_daemon 26 seconds ago Up 22 seconds 0.0.0.0:5003->5003/tcp, :::5003->5003/tcp docker-redis-1 redis:6-alpine "docker-entrypoint.s..." redis 26 seconds ago Up 25 seconds (health: starting) 6379/tcp docker-sandbox-1 langgenius/dify-sandbox:0.2.12 "/main" sandbox 26 seconds ago Up 25 seconds (health: starting) docker-ssrf_proxy-1 ubuntu/squid:latest "sh -c 'cp /docker-e..." ssrf_proxy 26 seconds ago Up 25 seconds 3128/tcp docker-weaviate-1 semitechnologies/weaviate:1.27.0 "/bin/weaviate --hos..." weaviate 26 seconds ago Up 25 seconds docker-web-1 langgenius/dify-web:1.10.1 "/bin/sh ./entrypoin..." web 26 seconds ago Up 25 seconds 3000/tcp docker-worker-1 langgenius/dify-api:1.10.1 "/bin/bash /entrypoi..." worker 26 seconds ago Up 22 seconds 5001/tcp docker-worker_beat-1 langgenius/dify-api:1.10.1 "/bin/bash /entrypoi..." worker_beat 26 seconds ago Up 22 seconds 5001/tcp
3. 离线部署(403 Forbidden)
-
在能联网的电脑上,下载并导出所有镜像
找一台能正常访问 Docker Hub 的电脑,执行以下命令:
bash# 下载所有 Dify 需要的镜像 docker pull ubuntu/squid:latest docker pull nginx:latest docker pull redis:6-alpine docker pull postgres:15-alpine docker pull busybox:latest docker pull semitechnologies/weaviate:1.27.0 docker pull langgenius/dify-api:1.14.0 docker pull langgenius/dify-web:1.14.0 docker pull langgenius/dify-sandbox:0.2.15 docker pull langgenius/dify-plugin-daemon:0.6.0-local # 把所有镜像打包成一个 tar 文件 docker save -o dify-images.tar \ ubuntu/squid:latest \ nginx:latest \ redis:6-alpine \ postgres:15-alpine \ busybox:latest \ semitechnologies/weaviate:1.27.0 \ langgenius/dify-api:1.14.0 \ langgenius/dify-web:1.14.0 \ langgenius/dify-sandbox:0.2.15 \ langgenius/dify-plugin-daemon:0.6.0-local -
把
dify-images.tar上传到你的 Ubuntu 服务器用
scp或FTP工具,把文件传到服务器的 ~/ 目录:bash# 在本地电脑执行(示例) scp dify-images.tar ubuntu@你的服务器IP:~/ -
在服务器上导入镜像
bash# 进入文件所在目录 cd ~ # 导入所有镜像 docker load -i dify-images.tar # 验证导入是否成功 docker images如果能看到所有镜像列表,说明导入成功。
-
启动 Dify
bashcd ~/dify/docker docker compose up -d
访问
-
打开管理员初始化页面以设置管理员账户:
bash# 本地环境 http://localhost/install # 服务器环境 http://your_server_ip/install -
完成管理员账户设置后,在以下地址登录 Dify:
bash# 本地环境 http://localhost # 服务器环境 http://your_server_ip
参考:
https://docs.docker.com/engine/install/ubuntu/
https://docs.dify.ai/zh/self-host/quick-start/docker-compose