皮皮网
皮皮网

【threadlocal类源码】【pixi引擎源码解析】【大富2020源码】containerd 源码解析

来源:送货单打印源码 发表时间:2024-12-22 16:17:38

1.Containerd容器管理机制
2.如何在新版本kubernetes中使用docker?源码
3.scoop install dark安装失败?
4.Testcontainers: 让码头工人去执行单测吧
5.Apache HTTP Server 2.4.49 路径穿越漏洞

containerd 源码解析

Containerd容器管理机制

       containerd是一个高级容器运行时,由Docker项目衍生,解析实现CRI规范,源码现为CNCF托管,解析提供新的源码容器解决方案的基础。k8s通过containerd创建容器时,解析threadlocal类源码containerd生成containerd-shim进程,源码此进程操作容器以避免containerd挂断导致所有容器退出的解析问题。containerd-shim用于执行命名空间、源码cgroups配置,解析挂载根文件系统等操作。源码标准化实现由OCI指定,解析runc为参考实现。源码

       containerd-shim调用runc启动容器,解析而runc执行后立即退出,源码containerd-shim则成为容器的父进程,负责监控、状态收集和子进程清理,确保无僵尸进程。

       containerd初始化操作通过方法实现。具体创建过程包括容器对象内部处理的多项操作。初始化后,启动容器操作则由上述方法执行。

       关于详细实现代码,请参考相关源码:github.com/containerd/c...

       深入理解containerd创建、pixi引擎源码解析启动容器的代码实现,请访问进一步分析:qikqiak.com/post/contai...

       更多讨论和细节分析见:colstuwjx.github.io/...

如何在新版本kubernetes中使用docker?

       kubernetes采用dockershim来与docker进行连接。然而,dockershim在kubernetes 1.版本后已被从源代码中移除。为了兼容,用户应弃用docker转而使用kubernetes支持的containerd或CRI-O。

       为了使用户在新版本的kubernetes中继续使用docker,Mirantis公司与Docker公司合作开发了cri-dockerd。若需在新版kubernetes中使用docker,请参考cri-dockerd。

       具体操作,可参考k8s官网提供的从dockershim迁移到cri-dockerd的指南。这将帮助用户顺利过渡,继续在kubernetes中使用docker。

scoop install dark安装失败?

       1 概述

       作为一名使用 win 的开发者,搭建开发环境往往是一件比较痛苦的事,需要从网上下载各种软件,在电脑上配置不同软件运行环境,对软件进行各种设置,不仅耗时,而且容易出现各种问题。搭建的环境还会存在下面一些问题:

       安装大量程序造成路径污染。安装和卸载比较麻烦。开发环境不能迁移,大富2020源码重装系统或者换电脑需要重新搭建开发环境。软件版本不好控制。为了解决上面这些问题,我们可以使用 WSL+Docker+Scoop 搭建开发环境,取代通过图形界面安装软件和 VMware 安装 Linux 环境的传统方式。

       WSL 是适用于 Linux 的 Windows 子系统, 可让开发人员按原样运行 GNU/Linux 环境 - 包括大多数命令行工具、实用工具和应用程序 - 且不会产生传统虚拟机或双启动设置开销。

       Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器或 Windows 机器上。

       Scoop 是 Windows 的命令行安装程序,可以让我们从命令行以最小的安装量安装程序, 它消除了安装界面和安装程序造成的路径污染,它安装和卸载软件只需一行命令就可以完成,它还可以随意切换软件的版本。

       一个完整的开发环境组成:首先使用 WSL 搭建一个 Linux 环境,然后在 Linux 环境里安装 Docker 应用,使用 Docker 来安装一些常用软件,比如数据库、web 环境等,Scoop 则是在本机上安装一些开发用到的软件,比如 jdk、maven、idea 等。macd好看的源码WSL 和 Scoop 都是比较容易备份和还原的,这两个搭建好了,我们利用备份还原可以快速在另一台机器上搭建同样的一套环境,下面是搭建环境的具体流程。

       2 WSL

       2.1 WSL 安装

       使用 WINDOWS 键 + R,输入 winver,检查 win 版本,确保内部版本号是 . 以上,否则更新 win 到最新版本。

       

       2. 以管理员身份打开 PowerShell 并运行下面命令:

       dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart

       dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart

       

       3. 重新启动计算机。

       4. 下载 Linux内核更新包[1],然后安装。

       5. 将 wsl2 设置为默认版本, 以管理员身份打开 PowerShell 并运行下面命令:

       wsl --set-default-version 2

       

       6. 安装 Ubuntu . LTS, 打开 Microsoft Store[2],搜索 Ubuntu . LTS[3] 安装, 安装完成后打开 Ubuntu . LTS, 等候几分钟会提示设置用户名和密码,如果不设置用户名和密码直接关闭窗口则默认以 root 登录,这里我们直接关闭窗口,不设置用户名和密码。

       

       7. 然后重新打开 Ubuntu . LTS 就会进入 Ubuntu . LTS了,我们也可以在 powershell 使用 wsl 这个命令进入 Ubuntu . LTS。

       2.2 WSL 配置

       WSL 每次启动后,windows 都会给它分配一个随机的 IP 地址,这样是不利于我们访问 docker 里的服务的,为了解决这个问题,我们可以创建一个脚本文件 wsl2-ip.bat来给 wsl 分配一个固定的安庆麻将源码成品 IP,在每次启动 wsl 后用管理员权限运行这个脚本,文件内容如下:

       @echo off

       setlocal enabledelayedexpansion

       :: set wsl2 ip

       wsl -u root ip addr | findstr "...2" > nul

       if !errorlevel! equ 0 (

       echo wsl ip has set

       ) else (

       wsl -d Ubuntu-. -u root ip addr add ...2/ broadcast ... dev eth0 label eth0:1

       echo set wsl ip success: ...2

       )

       :: set windows ip

       ipconfig | findstr "...1" > nul

       if !errorlevel! equ 0 (

       echo windows ip has set

       ) else (

       netsh interface ip add address "vEthernet (WSL)" ...1 ...

       echo set windows ip success: ...1

       )

       pause

       其中 ...2 表示 Linux 的 IP 地址, ...1 表示主机的 IP 地址。

       有时会遇到 Ubuntu . LTS 无法连接网络,这个非常重要,我们可以运行下面命令解决:

       sed -i '4d' /etc/resolv.conf

       sed -i '3a\nameserver 8.8.8.8' /etc/resolv.conf

       sed -i '4a\nameserver ...' /etc/resolv.conf

       2.3 Ubuntu 配置

       2.3.1 替换镜像源

       1. 备份 sources.list 文件,运行下面命令:

       mv /etc/apt/sources.list /etc/apt/sources.list.bak

       2. 创建 source.list 文件,运行下面命令:vim /etc/apt/sources.list

       3. 然后在文件里添加下面内容,下面源任选其一即可。

       # 清华源

       # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释

       deb /ubuntu/ focal main restricted universe multiverse

       # deb-src /ubuntu/ focal main restricted universe multiverse

       deb /ubuntu/ focal-updates main restricted universe multiverse

       # deb-src /ubuntu/ focal-updates main restricted universe multiverse

       deb /ubuntu/ focal-backports main restricted universe multiverse

       # deb-src /ubuntu/ focal-backports main restricted universe multiverse

       deb /ubuntu/ focal-security main restricted universe multiverse

       # deb-src /ubuntu/ focal-security main restricted universe multiverse

       # 预发布软件源,不建议启用

       # deb /ubuntu/ focal-proposed main restricted universe multiverse

       # deb-src /ubuntu/ focal-proposed main restricted universe multiverse

       # 阿里源

       deb /ubuntu/ focal main restricted universe multiverse

       #deb-src /ubuntu/ focal main restricted universe multiverse

       deb /ubuntu/ focal-updates main restricted universe multiverse

       #deb-src /ubuntu/ focal-updates main restricted universe multiverse

       deb /ubuntu/ focal-backports main restricted universe multiverse

       #deb-src /ubuntu/ focal-backports main restricted universe multiverse

       deb /ubuntu/ focal-security main restricted universe multiverse

       #deb-src /ubuntu/ focal-security main restricted universe multiverse

       deb /ubuntu/ focal-proposed main restricted universe multiverse

       #deb-src /ubuntu/ focal-proposed main restricted universe multiverse

       #网易源

       deb /"]

       }

       3 Scoop

       3.1 Scoop 安装

       1. 以管理员权限打开 PowerShell 。

       2. 自定义用户软件和全局软件安装位置,运行下面命令:

       $env:SCOOP='D:\Softwares\Scoop\LocalApps'

       [Environment]::SetEnvironmentVariable('SCOOP', $env:SCOOP, 'User')

       $env:SCOOP_GLOBAL='D:\Softwares\Scoop\GlobalApps'

       [Environment]::SetEnvironmentVariable('SCOOP_GLOBAL', $env:SCOOP_GLOBAL, 'Machine')

       

       3. 配置安全策略以及安装 Scoop,运行下面命令:

       Set-ExecutionPolicy RemoteSigned -scope CurrentUser

       Invoke-Expression (New-Object System.Net.WebClient).DownloadString('域名,查询对应的 IP 地址。

       

       3. 配置 C:\Windows\System\drivers\etc\hosts文件,在修改前赋予 hosts 文件读写权限。

       

       

       

       4. 修改 host 文件内容如下,第一列是查询出来的ip地址,第二列是其对应的域名,中间有个空格。

       

       5. 保存后重新运行安装命令。

       Invoke-Expression (New-Object System.Net.WebClient).DownloadString('/chawyehsu/dorado

       scoop bucket add Ash /Ash/Scoop-Ash.git

       scoop bucket add pleiades /jfut/scoop-pleiades.git

       scoop bucket add Scoop-Apps /ACooper/scoop-apps

       scoop bucket add scoop-zapps /kkzzhizhou/scoop-zapps

       scoop bucket add lemon /hoilc/scoop-lemon

       scoop bucket add raresoft /L-Trump/scoop-raresoft

       

       4. 如果软件仓库添加失败,还是因为网络的原因,大家可以把这些仓库 fork 到自己的码云账户下,然后再添加。

       5. 使用 aria2 来加速软件的安装:

       scoop install aria2 -g

       scoop config aria2-max-connection-per-server

       scoop config aria2-split

       scoop config aria2-min-split-size 1M

       如果想关闭 aria2,可以运行 scoop config aria2-enabled false命令。

       3.4 Scoop 常用命令

       # 搜索app

       scoop search <应用名>

       # 检查哪些软件有更新

       scoop status

       # 版本切换

       scoop reset <应用名>@<版本切换>

       # 禁止某app更新

       scoop hold <应用名>

       # 更新所有app

       scoop update

*

       # 安装app

       scoop install <应用名>

       #全局安装app

       scoop install -g <应用名>

       #安装extras软件源下的app

       scoop install extras/<应用名>

       # 卸载app

       scoop uninstall <应用名>

       # 卸载全局安装的app

       scoop uninstall -g <应用名>

       4 总结

       开发环境软件的安装与配置到这里就完成了,利用上面这些软件,你可以快速搭建 Java、Go、C++、Python等开发环境。

       参考资料

       [1]Linux内核更新包: /store/apps/9n6svws3rx

       [4]IP地址查询网站: /

Testcontainers: 让码头工人去执行单测吧

       Testcontainers 是一个专为 JUnit 测试设计的 Java 库,它允许开发者使用 Docker 容器来运行轻量级和一次性服务实例,如数据库、Selenium web 浏览器等。本文将介绍如何使用 Testcontainers 的 1..5 版本,并简要说明它也支持 Go、Python、Rust 和 Node.js 等其他语言。

       在 Docker 环境下,Testcontainers 使得开发者能够用熟悉的语言在单元测试中运行所需的服务容器。它内置了许多中间件模块,其中 Database 模块包含了大多数数据库。如果这些模块无法满足需求,Testcontainers 也支持创建自定义容器。

       以 Mysql 容器为例,声明一个接口是推荐的做法,因为 Java 类只能单继承,而接口可以实现多继承。这样,如果测试类需要依赖多个容器,只需继承多个容器类即可。

       ❗️下面提供的写法虽然常见,但存在一些问题。虽然单元测试运行无误,日志显示确实启动了 mysql:8.0.,但运行的是 mysqlContainer 而不是声明的 mysqlContainer。正确的写法将在后续内容中介绍。

       在 spring.datasource.url 中使用了官方推荐的 jdbc:tc: 格式:jdbc:tc:mysql:8.0.:///databasename。对于 Spring Boot 2.3.0 之前的版本,需要手动指定驱动程序:org.testcontainers.jdbc.ContainerDatabaseDriver。

       测试类继承接口后,可能会遇到线上启动容器报错的情况。本地测试运行良好,单测覆盖率超过 %,但上线后出现错误。

       通过环境比对发现,本地和线上环境存在差异。本地运行完全正常,而线上报错似乎是权限问题。经过搜索和尝试,发现公司集群将使用 containerd 而不是 docker,因此无法升级 docker。只能尝试其他方法。

       通过 Debug 源代码,发现问题出在 spring.datasource.url 上,因为使用了 jdbc:tc:xxx 格式,Testcontainers 自动创建了一个一次性容器。

       根据官方文档,可以通过两种方式获取临时数据库。修改 MysqlSpringTest 后,本地测试通过,但上线后仍然报错。尝试修改 Dockerfile 并推送镜像到仓库,但问题仍未解决。

       通过设置 testcontainers.reuse.enable=true,可以实现在整个项目周期内只启动一次容器,后面模块复用容器。然而,ryuk 和 reuse 是不可兼得的。在本地环境中,可以忽略 ryuk,因为它会在电脑重启后消失。但在线上环境中,需要添加自定义命令节点来删除测试容器。

       为了删除当前项目单测的测试容器,可以在 MysqlSpringTest 中给容器添加标签,并在线上流水线添加自定义脚本节点执行 docker rm 命令。

       “我们去码头整点薯条,让码头工人去执行单测吧。”

Apache HTTP Server 2.4. 路径穿越漏洞

       Apache HTTP Server 2.4.路径穿越漏洞是安全风险中的一种,此漏洞允许攻击者通过不安全的路径访问服务器上的文件,甚至执行任意命令。漏洞存在条件包括:Apache HTTP Server版本为2.4.且配置允许穿越的目录被访问,如Require all granted。攻击者可利用该漏洞读取Apache服务器Web目录外的文件,访问脚本文件源码,或在开启了cgi或cgid的服务器上执行任意命令。

       为了搭建漏洞环境,首先部署Docker容器虚拟化平台。安装Docker环境依赖,配置国内Docker的YUM源,并安装epel扩展仓库,随后安装Docker CE、Docker CLI、containerd.io和Docker Compose。启动并设置Docker开机自启动,使用阿里云Docker镜像加速器以提升pull速度。创建Docker配置文件daemon.json并设置镜像仓库地址为阿里云。使用Docker Compose编译及运行Apache HTTPd 2.4.版本服务器,执行命令进行部署。

       部署完成后,通过浏览器访问Apache服务器并验证其正常运行。接下来,进行漏洞复现:尝试任意文件读取,如通过curl命令访问特定图标文件。同时,探索任意命令执行的可能,以了解漏洞的危害程度。总结,通过上述步骤,我们不仅能够搭建漏洞环境,还能深入理解路径穿越漏洞的复现过程,进而加强对网络安全防护的理解。

相关栏目:综合