企业为什么要选择Docker来进行部署

Docker 的需知概念

学习一门技术,不仅仅只是会用,还需要理解为什么要这样,这也是我为什么写这篇笔记的原因-

为什么用docker

没有用docker 之前,可能有一种情况似曾相识,当上线时,突然间发现开发者机上面的可以运行的包 打包上去,运行不起来,常常因为环境的不对成 导致通宵,这是很难受的事。

我们可能要搭建集群,比如mysql,redis ,各种中间件,每部署到一台机上面 都要重复来一次,尤其当你打开linux 系统 ,发现安装包都没有,你需要安装jdk ,需要安装各种软件,到了另外一台机又要重复执行一次,哪怕传统可以保存一个快照,镜像复制,但是多多少少不好管理。

公司经费紧张,在一台服务器塞满了很多进程,可能一个进程出错,整台服务器重启,这对生产环境影响很大,还有每个服务峰值使用量过大,导致服务挂了,要么就jvm 设置比较大,还有空余的内存没有好好压榨。

docker的优势就出来了,相对于vm,我在网上

image-20201026153912429

docker是基本组成的呢?

image-20201026154244047

  • 镜像 (image):类似于模板,镜像可以用来创建容器,同样的镜像可以创建很多容器,就类似于类文件可以实例多个对象一样
  • 容器(container):Docker 利用容器 独立运行一个或一组应用。容器是用镜像创建的运行实例。可能一个容器里面就有多个应用,每个容器都是互相隔离独立运行。
  • 仓库(Repository):仓库是集中存放镜像文件的场所。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub(https://hub.docker.com/),国内的公开仓库包括阿里云 、华为云等

docker 的架构图

image-20201026154931219

docker run 的执行流程

image-20201026155137218

UnionFS(联合文件系统)

说这个之前,我们看看镜像装着啥,可能装着应用和应用的基本环境,如果每个镜像都需要共用这些,可能导致镜像特别臃肿,所以如果我们能把共用的东西抽取出来,那么可以大大节约内存,加上镜像本身就是可复用的。

docker 解决了这个问题,UnionFS(联合文件系统)

Unionfs 是2004年在stony brook大学开始的,它是一个可叠放的联合文件系统,它能够联合多个目录(因此可称为分支)同时独立地保持它们的物理内容。它允许任何ro和rw分支的 结合,同时允许在分支中修改和删除不使用的分支。Unionfs可以使用在几个方面,例如联合在不同磁盘上的不同的文件系统到一个home目录,或者把几 张cd合并成一个统一的归档镜像。所以,具有复制可写功能的unionfs可以用来把ro和rw的文件系统合并起来,并且实现了允许修改只读文件系统并把 这些修改保存在可写文件系统。

大概意思就是 镜像中 还含有多个 分支的文件,镜像由这些分支的文件组装起来,这些每个文件都可以可读写,把这些文件合并起来就是镜像,当然镜像更新时 ,提交时也交给Unionfs 管理,只更新修改部分即可,类似git 的文件系统。

Docker镜像加载原理

dockers 镜像不只是 UnionFS ,找一张图来解释一下

image-20201026162933559

通过查看 docker image 的发现,docker 镜像是分层 组成,套娃

img

**bootfs(boot file system):**主要包含bootloader和kernel, bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

**rootfs (root file system) :**在bootfs之上。包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

在上面一层 属于应用层,也是我们最经常更新的层

Docker 容器的数据卷

docker 中 容器独立运行,一旦rm 就连同数据一起删除了,假如我们装了个mysql ,然后把数据库删了,真正意义做到了删库跑路了哈哈哈,这是不对的,所以dockers 对这种需要持久化保存的,或者容器与容器间需要共享的数据,比如我们有两个mysql 客户端希望通过操作一个 数据文件,当然这种方式不太好。我们应该怎么办?

能不能 把数据都存在 一个公共的地方,比如宿主机上面?

当然可以啦。挂在数据卷就好了,而且还能做到 同步

docker run -it -v /宿主机目录:/容器内目录 centos /bin/bash

具名挂载 和 匿名挂载

什么意思呢 ,我们挂载的目录,docker 都称为卷,当我们 启动容器的时候,有设置 卷名时,我们可以快速找到挂载的路径。如果没有指定,docker 也帮我们保存到本地中,以一个匿名卷形式保存。
存放在 本地 /var/lib/docker 下
此外还有一种方式啊 就是上面这种宿主机和 容器内目录的挂载 # Docker 的需知概念

学习一门技术,不仅仅只是会用,还需要理解为什么要这样,这也是我为什么写这篇笔记的原因-

<think>嗯,用户问的是为什么在本地部署Dify的时候需要用Docker。首先,我得先了解Dify是什么。Dify可能是一个开发框架或者工具,可能和AI应用相关,因为之前听说过类似的项目。Docker的话,主要是容器化技术,用来打包应用和依赖环境,方便部署。 那为什么本地部署要用Docker呢?首先考虑环境配置的问题。不同的开发环境可能有不同的操作系统、依赖库版本,导致“在我机器上能运行”的问题。Docker能统一环境,避免依赖冲突。比如,Dify可能需要特定版本的Python、数据库或者其他服务,用Docker容器可以确保每个组件在隔离的环境中运行,不会互相干扰。 其次,Docker简化了部署流程。用户可能不熟悉手动安装和配置每个服务,比如数据库、消息队列或者缓存系统。使用Docker Compose的话,可以通过一个配置文件一键启动所有服务,节省时间和减少出错几率。 另外,扩展性和维护也是因素。Docker容器容易扩展,比如需要增加某个服务的实例数量,或者更新版本时,直接替换容器即可,不影响其他组件。这对于后续的维护和升级很有帮助。 安全性方面,容器之间的隔离性也能提高系统安全性,避免一个服务的漏洞影响整个系统。资源管理上,Docker可以限制每个容器的资源使用,防止某个服务占用过多资源导致系统崩溃。 可能用户还关心是否必须用Docker,有没有其他方式。比如手动安装,但那样可能复杂且容易出错,尤其对于不熟悉系统管理的开发者来说。Docker提供了一个更友好的解决方案,特别是对于团队协作或需要快速部署的情况。 总结下来,Docker在本地部署Dify时主要解决了环境一致性、简化部署流程、便于扩展和维护,以及提升安全性和资源管理这些方面的问题。需要确认Dify的官方文档是否推荐Docker部署,通常这类项目会提供Docker Compose文件,进一步简化流程。</think>在本地部署 Dify 时使用 Docker 主要出于以下几个核心原因,我们通过一个实际场景来逐步解释: **场景假设** 假设您想在本地笔记本电脑(Windows/MacOS)部署 Dify,但遇到以下问题: - 系统缺少 Python 3.9+ 环境 - Redis 服务未安装 - PostgreSQL 数据库配置复杂 - 不同依赖库版本冲突 **💡 Docker 的解决方案** 1. **环境隔离与一致性** - Docker 通过容器将 Dify 的运行时环境(Python、Node.js)、数据库(PostgreSQL)、缓存(Redis)等组件打包成独立模块 - 例:Dify 要求 Python 3.9+,但您的系统只有 Python 3.7 → Docker 容器内已预装正确版本 2. **一键启动复杂服务** - 典型 Dify 依赖: ```yaml services: dify-web: image: langgenius/dify-community:latest depends_on: - redis - postgres redis: image: redis:6-alpine postgres: image: postgres:13-alpine ``` - 通过 `docker-compose up -d` 即可同时启动所有服务 3. **避免依赖冲突** - 传统部署可能因系统已安装的 MySQL/Redis 导致端口冲突(如本地已有 Redis 占用 6379 端口) - Docker 通过虚拟网络隔离,容器内服务使用独立端口映射 4. **快速回滚与升级** - 当需要升级 Dify 版本时: ```bash docker-compose pull && docker-compose up -d ``` - 出现问题时可通过镜像版本标签快速回退 **📊 对比传统部署方式** | 项目 | Docker 部署 | 传统手动部署 | |-------------------|-----------------------------|---------------------------| | 环境准备时间 | 5分钟(下载镜像) | 2小时+(安装配置各依赖) | | 系统污染风险 | 零(容器隔离) | 高(需安装系统级软件包) | | 多环境支持 | 同一机器可运行多个版本 | 需复杂配置实现 | | 卸载复杂度 | `docker-compose down` 即清除 | 需手动删除各个组件 | **🔧 实际部署步骤示意** 1. 安装 Docker Desktop(Windows/Mac)或 Docker Engine(Linux) 2. 创建 `docker-compose.yml` 文件(通常由 Dify 官方提供模板) 3. 终端执行: ```bash docker-compose up -d ``` 4. 访问 `http://localhost:8080` 即完成部署 **⚠️ 注意事项** - 对资源要求:建议分配至少 4GB 内存给 Docker - 数据持久化:需配置 Volume 保存数据库数据 - 网络配置:可能需要处理端口冲突(如本地 80 端口已被占用) 通过 Docker 实现本地部署,开发者可以专注于应用本身的功能开发,而非环境配置问题。这种容器部署方式特别适合需要快速验证原型或搭建开发测试环境的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值