赞
踩
近来,笔者想好好学习和应用一下AIGC技术,在Windows主机安装部署私有知识库(Window 11本地部署 Meta Llama3)以及Stable Diffusion等(Stable Diffusion Windows本地部署超详细教程Window 11本地部署 Meta Llama3-8b),在本地部署Llama3实践过程中,作为一个有一点“简洁控”的我,不想让自己的电脑安装太多软件,其Web前端没有使用Ollama官方推荐以及大多数人所使用的docker+open-webui方案,而采用最为简单的ollama-ui和saddle作为WebUI,回避了docker软件的安装。而今天想要安装部署anything-llm以实现在本机部署私有知识库时,发现官方还是建议采用docker来部署AnytingLLM。虽然,Anything-LLM也利用NodeJS直接部署,但毕竟还是没有现成的docker一键部署方便。看来docker是一个不能忽略的工具了,人生苦短,得抓住重点,先把RAG+LLM的框架搭建起来再说,后面再抽空学习和研究相关细节。既然这样,那就把Docker安装起来吧,
Docker 是一个开源的应用容器引擎,开发者可以打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
镜像、容器和仓库是Docker三个核心概念。
Docker镜像(Image)是一个特殊的文件系统,提供容器运行时所需的程序、库、资源、配置等文件,另外还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像是一个静态的概念,不包含任何动态数据,其内容在构建之后也不会被改变,是一个只读模板。
容器(Container)是镜像的运行实例,镜像与容器的关系,就是面向对象编程中类与对象的关系,我们定好每一个类,然后使用类创建对象,对应到Docker的使用上,则是构建好每一个镜像,然后使用镜像创建我们需要的容器。Docker利用容器来运行应用,容器是从镜像创建的运行实例,它可以被启动,开始、停止、删除。容器时在linux上本机运行,并与其他容器共享主机的内核,它运行的一个独立的进程,不占用其他任何可执行文件的内存,非常轻量;另一方面,容器进程是被隔离的,或者说进程的外面套了一个保护层,对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。
仓库(Repository)是一个集中存储和分发镜像的服务。最大的公开仓库是Docker Hub,是Docker提供用于存储和分布镜像的官方Docker Registry,也是默认的Registry。Docker Hub有很多官方或其他开发提供的高质量镜像供我们使用。
Docker本质就是宿主机的一个进程,底层使用LXC来实现。LXC,即Linux软件容器(Linux Containers),是一种操作系统层虚拟化(Operating system–level virtualization)技术,将linux进程沙盒化,为Linux内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享API来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得Linux用户可以容易的创建和管理系统或应用容器。
在Linux内核中,提供了cgroups功能,来达成资源的区隔化。它同时也提供了名称空间区隔化的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括行程树,网络,用户id,以及挂载的文件系统。LXC利用cgroups与名称空间的功能,提供应用软件一个独立的操作系统环境,软件容器(Container)本身极为轻量化,提升了创建虚拟机的速度。
LXC工作模式是这样的,使用lxc-create创建一个容器(名称空间),然后通过模板(早期shell脚本,目前yaml脚本),执行安装过程。这个模板,会自动实现安装过程,这个安装就是指向了你想创建的容器(名称空间)的系统发行版的仓库,利用仓库中的程序包下载至本地来完成安装过程。于是这个容器(名称空间)就像虚拟机一样使用。
Docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作,利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。
与传统虚拟化技术相比,容器的优势在于:
1)与宿主机使用同一个内核,性能损耗小;
2)不需要指令级模拟;
3)不需要即时(Just-in-time)编译;
4)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
5)避免了准虚拟化和系统调用替换中的复杂性;
6)轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。
使用Docker,配置工作从资源管理中分离了出来,而部署工作则不值一提:执行docker run,环境的镜像会被拉取下来并准备运行,所消耗的资源更少并且是内含的,不会干扰其他环境,因而容器化越来越受欢迎。
1. 到官网 Install Docker Desktop on Windows下载最新官方Docker for Windows链接:
2. 配置Windows环境
Windows11环境中,选择系统->可选功能,点击“更多Windows 功能”:
在“启动或关闭Windows功能”中勾选图中的三项:
在这里,我们只是想使用Docker完成Docker镜像的快捷部署,暂时不深入其他的功能,考虑各方面使用WSL2是最好的选择,而且Hyper-v不适合家庭版安装Docker,所以这里不需要安装Hyper-V。
3. 安装Docker Desktop
双击下载的Docker Desktop Installer.exe,一路无脑缺省设置即可:
安装完毕后,点击Close and restart。
重启电脑后,点击Docker Desktop图标,可是却只是显示“Docker Engine is Stopped”,查了一下资料,可能是wsl版本过低的原因,运行wsl --update:
再重新启动“Docker Desktop
”,一切正常。
我们下拉一个镜像过来:
docker pull mintplexlabs/anythingllm
按照官方说明,输入下列命令:
- # Run this in powershell terminal
- $env:STORAGE_LOCATION="$HOME\Documents\anythingllm"; `
- If(!(Test-Path $env:STORAGE_LOCATION)) {New-Item $env:STORAGE_LOCATION -ItemType Directory}; `
- If(!(Test-Path "$env:STORAGE_LOCATION\.env")) {New-Item "$env:STORAGE_LOCATION\.env" -ItemType File}; `
- docker run -d -p 3001:3001 `
- --cap-add SYS_ADMIN `
- -v "$env:STORAGE_LOCATION`:/app/server/storage" `
- -v "$env:STORAGE_LOCATION\.env:/app/server/.env" `
- -e STORAGE_DIR="/app/server/storage" `
- mintplexlabs/anythingllm;
AnythingLLM | Your personal LLM trained on anything 打开浏览器,输入网址http://localhost:3001/,显示Anyting LLM入口:
Docker真是方便啊,几乎零配置,一键启动。我们看一下,这个镜像,足足有2.65G之多,太占用空间了!
个人觉得,Docker就是一个典型的以空间换时间的工具,软件的安装部署越来越简单,然而,每个镜像由于其自包含性,占用的空间非常大,好在现在硬盘便宜。但对于SSD盘来说,其寿命就明显缩短了。
参考文献
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。