LLM - Docker离线部署Dify:从镜像打包到无网环境部署

在这里插入图片描述

Pre

LLM - Dify Docker镜像拉取失败的解决办法

LLM - Dify(1.0.1)搭建本地私有RAG知识库完整指南


引言

在企业的生产环境中,出于安全合规或网络限制的考虑,往往需要在离线环境中部署服务。接下来我将以开源AI应用框架Dify为例,手把手教你如何通过Docker实现跨网络环境的离线部署,涵盖镜像打包、文件迁移、环境验证等全流程操作.


一、离线部署原理

通过Docker的save/load机制实现镜像的物理介质迁移,配合Docker Compose编排文件的环境适配能力,可在完全断网的环境中快速部署复杂应用。整个过程分为在线环境准备离线环境还原两个阶段。


二、在线环境操作

1. 环境准备

  • 在线环境:一台可以访问互联网的机器,安装好Docker和Docker Compose。
  • 离线环境:目标部署机器,安装好Docker和Docker Compose
# 验证Docker环境
docker --version && docker-compose --version

2. 在线环境: 获取Dify资源

git clone https://github.com/langgenius/dify.git
cd dify/docker  # 关键路径!

3. 拉取镜像(两种方式)

方式一:直接启动容器(自动下载)

docker-compose up -d  # 自动拉取所有依赖镜像

方式二:显式拉取镜像(推荐)

docker-compose pull  # 仅拉取镜像不启动容器

4. 镜像打包

在这里插入图片描述

# 查询所需镜像
docker images  

# 多镜像打包(示例版本号以实际为准)
docker save -o dify_all.tar \
  langgenius/dify-web:0.15.2 \
  langgenius/dify-sandbox:0.2.10 \
  postgres:13 \
  redis:6.2

单镜像

将拉取的镜像保存为tar文件:

docker save -o myimage.tar myimage:tag

myimage.tar是你想要创建的tar文件的名字,myimage:tag是想要保存的镜像的名称和标签 , tag建议和 docker images 展示的tag保持一致 。

举个例子:如果想保存一个名为langgenius/dify-web、标签为1.0.1的镜像

在这里插入图片描述

docker save -o dify_web.tar langgenius/dify-web:1.0.1

多镜像批量打包

在这里插入图片描述

如果想保存一个名为langgenius/dify-web、标签为1.0.1 的镜像和名为langgenius/dify-sandbox、标签为0.2.10的镜像,以及其他所有的镜像

docker save -o dify_all.tar langgenius/dify-web:1.0.1 langgenius/dify-sandbox:0.2.10  .........(省略)

这样可以把所有Dify依赖的镜像打到一个dify_all.tar的包里面。


5. 文件整理

从Dify的官方GitHub仓库下载docker-compose.yml文件:

git clone https://github.com/langgenius/dify.git
docker目录下
传输包内容:
├── dify_all.tar          # 镜像包
└── docker-compose.yml    # 来自dify/docker目录

三、离线环境部署

1. 镜像导入

将dify_all.tar文件复制到离线环境的机器上,然后使用以下命令导入镜像

docker load -i dify_all.tar

# 验证导入结果
docker images | grep -E 'dify|postgres|redis'

2.部署Dify

将docker-compose.yml文件复制到离线环境的机器上,然后使用以下命令启动Dify

# 调整配置文件(如需)
vi docker-compose.yml   # 修改端口、存储路径等

# 启动容器
docker-compose up -d

3. 部署验证

#查看Docker 镜像
docker images

# 查看容器状态
docker ps --format "table {
    
    {.ID}}\t{
    
    {.Names}}\t{
    
    {.Status}}\t{
    
    {.Ports}}"

# 预期输出示例:
CONTAINER ID   NAMES                  STATUS       PORTS
a1b2c3d4e5f6   dify-web-1             Up 2 hours   0.0.0.0:80->80/tcp
b2c3d4e5f6a7   dify-sandbox-1         Up 2 hours   3000/tcp
c3d4e5f6a7b8   postgres-1             Up 2 hours   5432/tcp
d4e5f6a7b8c9   redis-1                Up 2 hours   6379/tcp

4. 访问服务

浏览器访问 http://<服务器IP>:80,若显示Dify初始化页面则表示部署成功。

四、常见问题排查

1. 镜像导入失败

# 检查文件完整性
sha256sum dify_all.tar  # 对比在线/离线环境哈希值

2. 端口冲突

修改docker-compose.yml中的端口映射:

services:
  web:
    ports:
      - "8080:80"  # 主机端口:容器端口

3. 存储持久化

volumes:
  - /data/dify/pg_data:/var/lib/postgresql/data
  - /data/dify/redis_data:/data

如果看到Dify相关的容器处于Up状态,说明部署成功。就可以通过浏览器访问Dify的Web界面,进行后续的配置和使用


结语

通过本篇博客的详细步骤,即使在没有互联网接入的隔离环境中,也能快速部署Dify服务。这种基于Docker的离线部署方案同样适用于其他容器化应用,为企业的安全部署提供了可靠的技术路径。

部署过程中如遇问题,可查看容器日志定位原因:

docker logs -f <容器ID>

在这里插入图片描述