1.Testcontainers: 让码头工人去执行单测吧
2.runc hang 导致 Kubernetes 节点 NotReady
3.scoop install dark安装失败?
4.Apache HTTP Server 2.4.49 路径穿越漏洞
5.Kindä»ç»
6.centos 7.9 离线安装 docker 与 docker-compose
Testcontainers: 让码头工人去执行单测吧
Testcontainers 是源码一个专为 JUnit 测试设计的 Java 库,它允许开发者使用 Docker 容器来运行轻量级和一次性服务实例,源码如数据库、源码Selenium web 浏览器等。源码本文将介绍如何使用 Testcontainers 的源码 1..5 版本,并简要说明它也支持 Go、源码源码安装fioPython、源码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 命令。
“我们去码头整点薯条,让码头工人去执行单测吧。”
runc hang 导致 Kubernetes 节点 NotReady
Kubernetes 1..3 OS: CentOS 7.9. Kernel: 5.4.-1.el7.elrepo.x_ Docker: ..6
线上告警提示集群中存在 2-3 个 K8s 节点处于 NotReady 的状态,并且 NotReady 状态一直持续。问题的解决可以通过两种方法,我们先来看看 A 方案。
针对 docker hang 住这样的现象,通过搜索资料后发现了以下两篇文章里也遇到了相似的问题。这两篇文章都提到了是由于 pipe 容量不够导致 runc init 往 pipe 写入卡住了,将 /proc/sys/fs/pipe-user-pages-soft 的限制放开,就能解决问题。查看问题主机上 /proc/sys/fs/pipe-user-pages-soft 设置的是 。所以将它放大 倍 echo > /proc/sys/fs/pipe-user-pages-soft,然而 kubelet 还是没有恢复正常,pleg 报错日志还在持续,runc init 程序也没有退出。在线分班源码考虑到 runc init 是 kubelet 调用 CRI 接口创建的,可能需要将 runc init 退出才能使 kubelet 退出。通过文章中的说明,只需要将对应的 pipe 中的内容读取掉,runc init 就能退出。尝试了几个后,runc init 果然退出了。再次检查,节点状态切换成 Ready,pleg 报错日志也消失了,观察一天也没有出现节点 NotReady 的情况,问题(临时)解决。
对解决方案 A 的疑问,虽然问题解决了,但是仔细读 /proc/sys/fs/pipe-user-pages-soft 参数的说明文档,发现这个参数跟本次问题的根本原因不太对得上。pipe-user-pages-soft 含义是对没有 CAP_SYS_RESOURCE CAP_SYS_ADMIN 权限的用户使用 pipe 容量大小做出限制,默认最多只能使用 个 pipe,一个 pipe 容量大小为 k。这里就有疑问:为什么容器 root 用户 pipe 容量会超过限制。
定位问题最直接的方法,就是阅读源码。先查看下 Linux 内核跟 pipe-user-pages-soft 相关的代码。线上内核版本为 5.4.-1,切换到对应的版本进行检索。在创建 pipe 时,内核会通过 too_many_pipe_buffers_soft 检查是否超过当前用户可使用 pipe 容量大小。如果发现已经超过,则将容量大小从 个 PAGE_SIZE 调整成 2 个 PAGE_SIZE。通过机器上执行 getconf PAGESIZE 可以获取到 PAGESIZE 是 字节,也就是说正常情况下 pipe 大小为 字节,但是由于超过限制,pipe 大小被调整成 字节,这就有可能出现数据无法一次性写入 pipe 的问题。
找到问题根本原因的第一步,往往是在线下环境复现问题。由于线上环境已经通过方案 A 做了紧急修复,因此,需要找到一种必现的手段。功夫不负有心人,在 issue 中找到了相同的爱数源码问题,并且可以通过以下方法复现。执行命令之后,立刻就出现 runc init 卡住的情况。通过 lsof -p 查看 runc init 打开的文件句柄情况,可以看到 fd4、fd5、fd6 都是 pipe 类型,其中,fd4 和 fd6 编号都是 ,是同一个 pipe。如何来获取 pipe 大小来实际验证下「疑问 2」中的猜想呢?Linux 下没有现成的工具可以获取 pipe 大小,但是内核开放了系统调用 fcntl(fd, F_GETPIPE_SZ)可以获取到,代码如下。编译好之后,查看 pipe 大小情况如下。重点看下 fd4 和 fd6,两个句柄对应的是同一个 pipe,获取到的容量大小是 = 2 * PAGESIZE。所以的确是因为 pipe 超过软限制导致 pipe 容量被调整成了 2 * PAGESIZE。
对解决方案 A 疑问的探索,对解决方案 B 的考虑,线上应该如何做修复呢?是否需要把 docker 所有组件都升级呢?如果把 dockerd/containerd/runc 等组件都升级的话,就需要将业务切走然后才能升级,整个过程相对比较复杂,并且风险较高。因此考虑是否可以单独升级 runc?因为在 Kubernetes v1. 版本中还没有弃用 dockershim,因此运行容器整个调用链为:kubelet → dockerd → containerd → containerd-shim → runc → container。不同于 dockerd/containerd 是后台运行的服务端,containerd-shim 调用 runc,实际是调用了 runc 二进制来启动容器。因此,只需要升级 runc,对于新创建的容器,就会使用新版本的 runc 来运行容器。
通过测试环境验证,的确不会出现 runc init 卡住的情况了。最终,逐步将线上 runc 升级成 v1.1.1,并将 /proc/sys/fs/pipe-user-pages-soft 调整回原默认值。runc hang 住的问题圆满解决。
总结,lua源码学习本次故障的原因是,操作系统对 pipe-user-pages-soft 有软限制,但是由于容器 root 用户的 UID 与宿主机一致都是 0,内核统计 pipe 使用量时没有做区分,导致当 UID 为 0 的用户 pipe 使用量超过软限制后,新分配的 pipe 容量会变小。而 runc 1.0.0-rc 正好会因为 pipe 容量太小,导致数据无法完整写入,写入阻塞,进而 runc init 卡住,kubelet pleg 状态异常,节点 NotReady。修复方案是 runc 通过 goroutine 及时读取 pipe 内容,防止写入阻塞。
scoop install dark安装失败?
1 概述
作为一名使用 win 的开发者,搭建开发环境往往是一件比较痛苦的事,需要从网上下载各种软件,在电脑上配置不同软件运行环境,对软件进行各种设置,不仅耗时,而且容易出现各种问题。搭建的环境还会存在下面一些问题:
安装大量程序造成路径污染。安装和卸载比较麻烦。开发环境不能迁移,重装系统或者换电脑需要重新搭建开发环境。软件版本不好控制。为了解决上面这些问题,我们可以使用 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 等。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地址查询网站: /
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命令访问特定图标文件。同时,探索任意命令执行的可能,以了解漏洞的危害程度。总结,通过上述步骤,我们不仅能够搭建漏洞环境,还能深入理解路径穿越漏洞的复现过程,进而加强对网络安全防护的理解。
Kindä»ç»
Kind æ¯ä¸ç§ä½¿ç¨ Docker 容å¨ä½ä¸º node èç¹ï¼è¿è¡æ¬å° Kubernetes é群çå·¥å ·ï¼å¨ K8s ä¸æçé常广æ³çåºç¨ãä»ä¹æ¯ Kind
Kindï¼Kubernetes IN Dockerï¼[1]æ¯ä¸ä¸ªç¨æ¥å¿«éå建åæµè¯ kubernetes çå·¥å ·ï¼å®æç¯å¢çä¾èµéä½å°æå°ï¼ä» éè¦æºå¨å®è£ äº Docker å³å¯ä½¿ç¨ã
Kind å¯ä»¥åä»ä¹ï¼
Kind æåªäºä¼å¿ï¼
ä½¿ç¨ Kind
Kind çåç
Kind 使ç¨ä¸ä¸ª container æ¥æ¨¡æä¸ä¸ª nodeï¼å¨ container éé¢è· systemd ï¼å¹¶ç¨ systemd æ管 kubelet 以å containerdï¼ç¶åéè¿å®¹å¨å é¨ç kubelet æå ¶ä» K8s ç»ä»¶ï¼æ¯å¦ kube-apiserverãetcdãCNI çè·èµ·æ¥ã
å®å¯ä»¥éè¿é ç½®æ件çæ¹å¼å建å¤ä¸ª container æ¥æ¨¡æå建å¤ä¸ª nodeï¼å¹¶ä»¥è¿äº node æ建ä¸ä¸ªå¤èç¹ç Kubernetes é群ã
Kind å é¨ä½¿ç¨çé群é¨ç½²å·¥å ·æ¯ kubeadmï¼åå© kubeadm æä¾ç Alpha ç¹æ§ï¼å®å¯ä»¥é¨ç½²å æ¬ HA master çé«å¯ç¨é群ãåæ¶ï¼å¨ HA master ä¸ï¼ å®è¿é¢å¤é¨ç½²äºä¸ä¸ª Nginxï¼ç¨æ¥æä¾è´è½½åè¡¡ vipã
æ建éå
Kind çéåå为两个ï¼ä¸ä¸ª node éåï¼ä¸ä¸ª base éåã
node éå
node éåçæ建æ¯è¾å¤æï¼éè¦éè¿è¿è¡ base éåï¼å¹¶å¨ base éåå æ§è¡æä½ï¼åä¿åæ¤å®¹å¨å 容为éåçæ¹å¼æ¥å®ææ建ãå®å å«çæä½æï¼
å ·ä½çé»è¾ï¼å¯ä»¥åè node.go[2]ã
base éå
base éåç®å使ç¨äº Ubuntu:. ä½ä¸ºåºç¡éåï¼åäºä»¥ä¸è°æ´ï¼
å ·ä½çé»è¾ï¼å¯ä»¥åèæ建ç Dockerfile[3]ã
å建é群
Kind å建é群çåºæ¬è¿ç¨ä¸º:
å ³äºæ¯ä¸ªå®¹å¨æ¯å¦ä½ä½ä¸º node è·èµ·æ¥çï¼è¿éç®å讲解ä¸åçï¼æ ¹æ®ä¸åçè§è²ï¼è°ç¨ä¸åçå½æ°å建èç¹ nodes.go[5]ã
èç¹ï¼å®¹å¨ï¼å建æ¶ï¼éè¿é ç½® --privilegedãæè½½ tmpfsãä¿®æ¹ä¸»æºåçï¼æ¥è¿è¡èç¹ create[6]ã
æ´å¤
Kind æ¯ä¸ä¸ªæ¯è¾ç®åæ趣ç项ç®ï¼å®ç scope [7]å®å¾æ¯è¾æç¡®å ·ä½ï¼ä¹æ¯è¾å°ãå¼åè å¯ä»¥åå© Kind æ Kind çææ³åæ´å¤äºæ ï¼æ¯å¦ï¼
æ¤å¤ï¼æä¸æåå°ç Kind åå© kubeadm æ°ç¹æ§å®ç° HA master é«å¯ç¨é群ãåå© join çæ¹å¼æ©å®¹ master èç¹è¾¾å° HA masterï¼å ¶å é¨å®ç°æ¹å¼ä¹æä¼ç¼ºç¹ï¼æå ´è¶£ç读è å¯ä»¥åè kubeadm æºç [8]ã
åèæç®
1. /kubernetes-sigs/kind
2. /kubernetes-sigs/kind/blob/master/pkg/build/node/node.go
3. /kubernetes-sigs/kind/blob/master/images/base/Dockerfile
4. /kubernetes-sigs/kind/blob/master/pkg/cluster/internal/create/create.go#L
5. /kubernetes-sigs/kind/blob/master/pkg/cluster/internal/create/nodes.go#L
6. /kubernetes-sigs/kind/blob/master/pkg/cluster/nodes/create.go#L
7. /kubernetes/kubernetes/tree/master/cmd/kubeadm
centos 7.9 离线安装 docker 与 docker-compose
在私有云服务器管理时,面对各式各不相同的系统,掌握不同系统的安装方法与使用过程,能有效避免环境设置中的误区与陷阱,确保迅速高效地执行任务,建立操作规范,便于后续项目快速上手与维护。以下为CentOS 7.9系统离线安装Docker与Docker Compose的具体步骤。
首先,获取二进制安装包,考虑到源码安装过程冗长且繁琐,依赖rpm包管理可能因版本不匹配而导致安装困难,基于时间效率与操作便捷的考虑,我们选择二进制包方式安装。下载时,依据实际系统架构选择对应的二进制文件,建议通过浏览器访问官方网站查看最新的版本信息与支持架构,以便获取与系统环境匹配的版本,使用`uname -m`命令确认架构标识,如x_。
下载好二进制文件后,直接解压至合适的目录并重命名(为简便,我们可命名为`docker`)。随后,将解压后的`docker`文件移动至`/usr/local/bin`目录下,为实现系统级访问,需创建其软连接至`/usr/bin`目录,以便于命令行直接调用。
安装Docker的关键在于服务配置与运行,首先下载Docker对应的systemd服务文件,配置容器操作服务。以`docker.service`为例,重点在于在`ExecStart`启动控制中添加特定配置,确保Docker的正确加载与初始化。
完成配置后,启用并启动containerd服务与Docker服务,确保系统稳定运行。
为实现自动化部署与容器编排,需安装Docker Compose。访问其官方下载页面,获取最新安装包并上传至服务器上指定位置,随后,赋予文件适当的执行权限。安装完成后,通过命令验证Docker与Docker Compose是否成功安装并运行,通常通过查看版本信息确认安装结果。
最后,对本地私有镜像仓库进行配置。安装并配置完成后,重启Docker服务,并在命令窗口使用`docker login`命令登录本地镜像仓库,确保环境配置完善。
按照上述步骤进行操作,CentOS 7.9系统上的Docker与Docker Compose便已完成离线安装与配置,系统管理员可根据实际工作流程快速上手与操作,确保部署过程顺畅高效。
Containerd容器管理机制
containerd是一个高级容器运行时,由Docker项目衍生,实现CRI规范,现为CNCF托管,提供新的容器解决方案的基础。k8s通过containerd创建容器时,containerd生成containerd-shim进程,此进程操作容器以避免containerd挂断导致所有容器退出的问题。containerd-shim用于执行命名空间、cgroups配置,挂载根文件系统等操作。标准化实现由OCI指定,runc为参考实现。
containerd-shim调用runc启动容器,而runc执行后立即退出,containerd-shim则成为容器的父进程,负责监控、状态收集和子进程清理,确保无僵尸进程。
containerd初始化操作通过方法实现。具体创建过程包括容器对象内部处理的多项操作。初始化后,启动容器操作则由上述方法执行。
关于详细实现代码,请参考相关源码:github.com/containerd/c...
深入理解containerd创建、启动容器的代码实现,请访问进一步分析: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。