使用Linux命名空间、cgroups和chroot构建您自己的Docker:实践指南

转载自:https://akashrajpurohit.com/blog/build-your-own-docker-with-linux-namespaces-cgroups-and-chroot-handson-guide/ 简介 容器化已经改变了软件开发和部署的世界。Docker是一个领先的容器化平台,利用Linux命名空间、cgroups和chroot提供强大的隔离、资源管理和安全性。 在这个实践指南中,我们将跳过理论部分(如果您想更深入了解这些主题,请查阅上面提供的链接),直接进入实际实现的步骤。 1 2 3 4 5 在我们深入使用命名空间、cgroups和chroot构建类似Docker的环境之前,有必要明确一点,本实践指南并不旨在替代Docker及其功能。 Docker拥有分层镜像、网络、容器编排和丰富的工具等功能,使其成为一种功能强大且多用途的应用部署解决方案。 本指南的目的是通过从零开始构建一个基本的容器环境,提供对构成Docker核心的基础技术的教育性探索。通过这样的实践,我们旨在深入理解这些底层技术如何协同工作,实现容器化。 让我们开始构建Docker Step 1: 设置命名空间 为了创建一个隔离的环境,我们首先设置一个新的命名空间。我们使用unshare命令,指定不同的命名空间(–uts,–pid,–net,–mount和–ipc),为我们的容器提供独立的系统标识和资源实例。 1 unshare --uts --pid --net --mount --ipc --fork Step 2: 配置cgroups Cgroups(控制组)帮助管理资源分配,并控制我们容器化进程对系统资源的使用。 我们为容器创建一个新的cgroup,并分配CPU配额限制以限制其资源使用量。 1 2 3 4 mkdir /sys/fs/cgroup/cpu/container1 echo 100000 > /sys/fs/cgroup/cpu/container1/cpu.cfs_quota_us echo 0 > /sys/fs/cgroup/cpu/container1/tasks echo $$ > /sys/fs/cgroup/cpu/container1/tasks 在第三行,我们将值0写入/sys/fs/cgroup/cpu/container1/目录下的tasks文件。tasks文件用于控制哪些进程分配给特定的cgroup。 通过向该文件写入0,我们将任何先前分配给cgroup的进程移出。这确保了最初没有进程分配给container1 cgroup。 在第四行,我们将$$的值写入/sys/fs/cgroup/cpu/container1/目录下的tasks文件。 这确保由Shell或脚本生成的任何后续子进程也将成为container1cgroup的一部分,并且它们的资源使用将受到指定的CPU配额限制的限制。 Step 3: 构建根文件系统 为了创建我们的容器文件系统,我们使用debootstrap在一个名为"ubuntu-rootfs"的目录中设置一个最小化的Ubuntu环境。这将作为我们容器的根文件系统。 1 debootstrap focal ./ubuntu-rootfs http://archive.ubuntu.com/ubuntu/ Step 4: 挂载和进入容器的chroot环境 我们在容器的根文件系统中挂载了必要的文件系统,如/proc、/sys和/dev。然后,我们使用chroot命令将根目录更改为我们容器的文件系统。 1 2 3 4 mount -t proc none ....

July 2, 2023 · 1 min · 119 words · LOTU$

AutoGPT体验

AutoGPT体验 安装AutoGPT 我使用虚拟环境来创建这个项目,所以首先要激活虚拟环境,然后安装AutoGPT,安装完成后,就可以使用了。 在cmd输入下面内容 1 2 3 4 pip install virtualenv #安装虚拟环境 virtualenv autogpt #创建虚拟环境 cd autogpt #进入虚拟环境 .\Scripts\activate #激活虚拟环境 常用命令 1 2 deactivate #退出虚拟环境 activate #进入虚拟环境 删除虚拟环境 1 rmdir autogpt 官方推荐python3.10以上版本,我使用的是python3.11.3版本, 在这里我使用的是命令 1 2 virtualenv autogpt --python=python3.11.3 #创建虚拟环境,指定python版本为3.11.3 需要注意,如果你的电脑上没有3.11.3版本的python,那么你需要先安装3.11.3版本的python,然后再创建虚拟环境。 接下来,安装AutoGPT 在cmd输入下面内容 1 git clone -b stable --single-branch https://github.com/Significant-Gravitas/Auto-GPT.git 安装依赖 1 pip install -r requirements.txt 接下来我们要对AutoGPT进行一些配置,在文件内有.env.example文件,我们需要将其复制一份,并将其命名为.env 在.env文件内找到OPENAI_API_KEY,将其改为你的OpenAI API Key,如果没有的话,可以在OpenAI官网申请一个,申请成功后,将其填入即可。 运行AutoGPT 在cmd输入下面内容 1 python -m autogpt 就可以启动Autogpt了 但是,经过了我一晚上的测试,我发现这个AutoGPT还存在许多不足 第一次尝试 在我的第一次测试中,我请求他给我用java写个下棋游戏,在一番搜索之后,他卡在了配置java环境这一步 他一直对甲骨文发出请求,企图下载jdk,但是因为没有甲骨文账号,被甲骨文官网一直屏蔽, 导致了死循环 更令人哭笑不得的是,我的电脑上早早就装好了jdk...

May 31, 2023 · 1 min · 79 words · LOTU$

Flask学习

Flask学习 1.1 配置环境与访问 配置环境 1 2 3 cdvirtualenv 进入虚拟环境 rmvirtualenv 删除虚拟环境 lsvittualenv 列出虚拟环境 自己安装: 进入终端中进入虚拟环境—–> 1 2 3 pip list pip install pymysql pip install flask==1.0(卸载原来的版本,安装指明的版本) 项目结构介绍: 1 2 3 4 --项目名: |---static (静态)js css |---templates(模板) |--app,py(运行引启动) 新建Flask项目 1 2 3 4 5 6 7 8 9 10 11 12 from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): # put application's code here return '哈哈哈' if __name__ == '__main__': app....

May 6, 2023 · 5 min · 1049 words · LOTU$

Web3学习

区块链技术与应用 引言 区块链不止是比特币,不要被比特币限制想象 1.1 BTC密码学原理 比特币被称为加密货币,但是加密货币是不加密的,区块链所有内容都是公开的,例如转账金额,账户地址 使用到两种哈希函数 cryptographic hash function collison resistance (哈希碰撞) 哈希碰撞 :x ! = y, H (x) = H (y) 一般来说,哈希碰撞是不可避免的,因为输入空间远大于输出空间(没有什么高效的方法使得哈希人为碰撞 collison resistance的性质:找不到H(m’) 与之相同 H(m) 与 digest 如果有人修改H(m),哈希值就会被修改 没办法篡改内容而不被检测 (类似刷机时的检验md5值)(md5就是哈希的一种,不够已经不再安全了) x 可以推出 H(x),但是反之不行 hiding:hash函数的计算过程是单向的,是不可逆的。给定一个输入X,可以计算其hash值 H(X),但是通过H(X),很难知道其输出为X。当然蛮力求解也是一个办法。hiding性质的前提是:(1)输入空间较大;(2)输入的分布比较分散。 digital commitment(digital equivalent of a sealed envelope):通过collision resistance和hiding的性质,就可以得到digital commitment这个性质。 举例:想要预测股市,但是又不能影响,只能把结果放在信封里面。 预测结果不能提前公开,就需要用到sealed envelope(密封信封),把 x 算出的哈希值公布出去,因为有哈希hiding的性质,又有collison resistance的性质,就能做到预测股市但是又不影响 如果输入不满足hiding,常用把输如拼接随机数再哈希 H( x || nonce) puzzle friendly: 要想使得计算得到的hash值在某一个范围之内,则只能够一个一个的输入去尝试,很难直接找到某个值使得其hash值在某一个范围内。挖矿 也是就是这个意思。挖矿就是把区块中的一些信息+随机数进行hash,使得其结果前K位数为0,才能够满足要求。挖矿无捷径,只能够去大量的试。所以也就产生了 工作量证明(POW)。 工作量证明(POW) 就是做了大量的尝试之后,才得到符合要求的结果,这个过程叫做工作量证明。proof of work H(block header) <= target...

March 30, 2023 · 2 min · 395 words · LOTU$

Hugo+Github Pages搭建

在跟随网上的教程搭建中,我发现了许多的问题,所以决定自己写一篇搭建教程 我会把自己遇到的问题详细的列出来,并给予解决方案 第一步,安装Hugo 1.浏览官方的使用指南 本次部署使用的是Windows系统 如果你对操作有些困惑,这份指南有对其他系统如何安装Hugo的详细说明 在这里我选择了使用对新手比较友好的方式,从GitHub主页下载zip包下载后添加到环境变量 找到并点击Releases选择适合自己的安装包 Windows系统选择带有Windows字样的安装包 下载后解压到适合的文件夹,找到bin文件,复制路径到环境变量中 至此,Hugo就安装完毕了! 第二步,新建一个Hugo网站 1.进入你想存放Hugo网站文件的文件夹,在文件夹下使用终端(cmd)执行以下命令新建一个Hugo网站 1 hugo new site myblog # "myblog" 是我的网站文件夹名 2.选择Hugo主题并克隆至本地目录 打开 Hugo Themes 页面,选择一个你喜欢的主题 我选择的是PaperModX主题 进入themes文件夹 将所选主题克隆到本地(themes文件夹下) 点击复制按钮,执行 1 git clone 复制得到的链接 clone成功后,还需要修改文件夹名为你的主题名才可正常运转,在这里我修改文件名为PaperModX 3.编辑配置文件 编辑文件是Hugo自定义的灵魂所在,值得各位研究,官方提供了英文文档,更有第三方的中文文档,也可以仿照他人的范例进行修改, 4.新建一篇文章 进入网站文件夹的根目录 使用以下命令新建一篇文章 1 hugo new post/my-first-post.md # "my-first-post.md"是新建文章的文件名 这里我采用另一种方法,来自这位大佬的博客 思路是每一篇文章都创建一个新的文件夹,将所需要的图片放在文件夹下 而不用使用Hugo传统的把图片放在其他文件夹,方便了引用 注意:文件夹下的文章需命名为index.md,否则无法识别 5.编辑新建的文章,添加内容并保存 6.本地预览网页效果 启动Hugo server 1 hugo server -D 使用浏览器打开 http://localhost:1313 预览 如果你对预览效果满意,进入下一步。 如果不满意,编辑 config.toml 配置文件,再次预览。 在对你的网站满意后,可以进行上传到Github Pages了 第三步,上传到Github Pasges 1.新建一个Github库...

March 17, 2023 · 2 min · 280 words · LOTU$