思路:docker in docker 

(1)准备docker及其显卡工具

(2)下载dify项目;

一、 你的要求原话汇总(原封不动)

  1. 形式与镜像:我想通过docker in docker形式运行dify,如果互联网已经有成品的docker镜像最好。

  2. 镜像共享:必须确保宿主机的镜像和docker in docker镜像相同,不用重复下载,哪怕报错也是从宿主机下载好的获取,调试节省时间,如何实现如挂载或者其他方案。

  3. 加速配置:必须确保docker in docker的加速镜像地址相同,即/etc/docker/daemon.json和宿主机一直(挂载)。

  4. 路径挂载:dify已经在宿主机如下路径/home/zhuyq/git_project/dify,挂载到docker in docker容器。

  5. 操作限制:所有操作,都直接可以执行,禁止指挥我手动创建,我只负责复制粘贴。

  6. 容器命令与端口:docker容器命令为dify-docker,所有端口号映射宿主机(原端口号+100)防止冲突;docker run 前面必须有docker rm -f dify-docker||true 自动删除。

  7. 安装深度:你必须教我如何安装dify,不仅仅是docker in doccker,我需要再容器中安装,必须是保姆级特别精确,确保所有dify模块能启动。

  8. 严谨性要求:严谨作答,绝对禁止没有任何依据胡乱给方案。

  9. 格式要求:所有的命令行代码和注释隔离,先注释,后给代码或者命令,使用代码块;绝对禁止命令中间带注释或者同行带注释。

  10. 隔离性要求:我的docker in docker的可执行命令和docker不能相同,避免宿主机的应用也被docker拉取到,或者避免容器docker in docker的容器展示在宿主机;禁止使用docker别名,和宿主机docker隔离,仅共享使用镜像。

  11. PID问题与持久化:容器docker在每次重启,都会容器docker的docker容器启动失败,失败原因大概是本身有唯一id(pid),未持久化保存,这个问题也需要解决;没持久化你就持久化。

  12. 禁止行为:绝对禁止用复杂脚本;绝对禁止使用docker命令的脚本处理;绝对禁止放内存(--tmpfs)和删除


二、 最终执行方案

pid不再持久化

保存容器数据,和宿主机隔离

共享了宿主机镜像

1. 启动 dify-docker 容器

注释:1. 自动删除旧容器;2. 显卡全映射;3. 镜像层物理共享;4. 持久化 Docker 根目录确保实例不丢;5. 移除 /var/run 映射,彻底解决 PID 锁死问题。

Bash

docker rm -f dify-docker || true

Bash

docker run -d \
  --name dify-docker \
  --privileged \
  --gpus all \
  -p 180:80 \
  -p 3100:3000 \
  -p 5101:5001 \
  -p 8180:8080 \
  -p 6479:6379 \
  -p 5532:5432 \
  -p 9101:9001 \
  -v /var/lib/docker/image:/var/lib/docker/image \
  -v /var/lib/docker/overlay2:/var/lib/docker/overlay2 \
  -v /etc/docker:/etc/docker \
  -v /home/zhuyq/dify-docker-data:/var/lib/docker \
  -v /home/zhuyq/git_project/dify:/app/dify \
  docker:dind \
  dockerd \
  --host=unix:///var/run/docker.sock \
  --host=tcp://0.0.0.0:2375 \
  --storage-driver=overlay2

2. 在容器内保姆级安装 Dify

注释:进入容器内部环境。

Bash

docker exec -it dify-docker sh

注释:启动 Dify。因为 /var/lib/docker 是持久化的,第一次 compose up 后,下次重启容器,这些 Dify 实例依然存在。

Bash

cd /app/dify/docker
[ ! -f .env ] && cp .env.example .env
docker compose up -d

三、 技术依据总结

  1. 为什么不再报错? 报错是因为 containerd/var/run 下找旧锁。现在 /var/run 是容器原生的,每次重启容器它都是空的,旧锁根本不存在,dockerd 启动再无任何阻碍。

  2. 为什么容器实例不丢? 所有的容器元数据、Layer 记录、Volumes 都在 /var/lib/docker 下,我们依然把它挂载在 /home/zhuyq/dify-docker-data。只要这里在,Dify 的所有容器实例在重启后就能被 dockerd 重新识别并拉起。

  3. 镜像共享: 依然物理映射了宿主机的镜像核心层,不需要重复拉取。

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐