基于docker技术的单主机环境模拟测试批量客户端

EX. 任务背景

近期接到一个需求是在一个高性能服务器上,模拟启动多个待测试客户端的场景,但这个客户端程序有点特殊,设置了守护模式,并且需要管理员权限会监控系统的/dev/mem节点,单个环境中只能启动一个。

当前的测试方式:
无奈目前的方式是利用VM技术,在服务器上启动多个虚拟机,每个虚拟机里按照一个客户端,但这样的效果极其效率低下,无法满足需求。

尝试使用的技术:
直接用VM虚拟机开销太大了,那么在一个服务器中,直接使用docker镜像,启动多个镜像的方式,或许可以有效,对于网络来说,docker其实本身会将多个容器进行网络管理,并且MAC地址也会进行分配。只要制作好一个带有待测客户端的docker镜像,那么整体上来说问题就解决了。这个方式,实际上比VM虚拟机来说,开销会小很多,因为实际上整体占用的空间只会比待测客户端多个占用的稍微多一点,而不会是N个虚拟机环境。那么下面开干吧。

A. 先在服务器中安装一个centos7的虚拟机,这个虚拟机是为了安装docker的运行环境

在CentOS系统中安装Docker的步骤如下(适用于 CentOS 7 或更高版本):

  1. 卸载旧版本(如有)
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine

  1. 安装依赖工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

  1. 添加Docker官方仓库
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

  1. 安装Docker引擎
sudo yum install -y docker-ce docker-ce-cli containerd.io

  1. 启动Docker服务并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker

  1. 验证安装是否成功
sudo docker run hello-world

如果看到 Hello from Docker! 的输出,说明安装成功。


  1. (可选)配置非root用户运行Docker

将当前用户加入 docker 用户组,避免每次使用 sudo:

sudo usermod -aG docker $USER
newgrp docker  # 立即生效或重新登录系统

其他注意事项
CentOS 8 用户:如果遇到依赖问题,可能需要启用 PowerTools 仓库:

sudo dnf config-manager --set-enabled PowerTools

镜像加速:国内用户可配置Docker镜像加速器(如阿里云、腾讯云等)。

如果遇到问题,请检查网络连接或参考 Docker官方文档。

B. 再在centos7的虚拟机中使用docker开始制作

先熟悉几个命令

docker ps   # 查看当前运行的容器
docker ps -a # 查看所有容器
docker images # 查看镜像
docker run # 运行容器
docker exec # 进入容器
docker stop # 停止容器
docker rmi $(docker images -q) # 删除所有镜像
docker rm -f $(docker ps -a -q)  # 强制删除所有容器

接着就是制作镜像了,我们要保证在制作镜像的当前目录下有一个Dockerfile文件,这个文件是用来制作镜像的。另外还需要一个start文件,这个文件是用来启动容器的。最后我们还要有一个安装包文件,这个文件是直接从平台下载的离线安装包。一般是叫类似这样的名字linux_agent_setup_wojiubugaosuni.tar.gz

有了这三个文件后,我们就可以在当前目录下运行这个命令了

docker build --no-cache -t my-app .

这个命令的意思是,我们要制作镜像是基于当前目录下的Dockerfile文件制作的。–no-cache是指我们要制作镜像的时候,不要使用缓存,这样可以保证我们制作的镜像是最新的。-t是指我们要制作镜像的时候,要给镜像起一个名字,这个名字是my-app

这里附加上我们的Dockerfile文件的内容

# 使用CentOS 7存档镜像
FROM docker.m.daocloud.io/centos:7# 设置维护者信息(可选)
LABEL maintainer="adamxiao@wojiubuhaosuni.com"# 切换为 root 用户
USER root# 修复镜像源问题 (使用验证过的归档配置)
RUN sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-* && \sed -i 's|^#baseurl=http://mirror.centos.org|baseurl=https://vault.centos.org|g' /etc/yum.repos.d/CentOS-*# 创建目标目录
RUN mkdir -p /app# 将本地的tar.gz压缩包添加到镜像中(自动解压)
COPY linux_agent_setup_wojiubugaosuni.tar.gz /app/
ADD start /app/# 设置工作目录
WORKDIR /app# 安装必要的解压工具
RUN yum clean all && \yum makecache 
RUN yum install -y tar gzip which sudo && \yum clean all# 确保脚本可执行并立即执行安装
RUN cd /app && \
tar --no-same-permissions --no-same-owner -zxvf linux_agent_setup_wojiubugaosuni.tar.gz && chmod +x install.sh && ./install.sh
# 确保启动脚本能执行
RUN chmod +x /app/start# 设置容器启动时的默认命令(可根据需要调整)
CMD ["sh", "/app/start"]

由于centos7不再维护了,所以官方源更新会报错,直接用root运行以下指令可以解决问题,本质是换到了缓存源上。

sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/CentOS-* && \sed -i 's|^#baseurl=http://mirror.centos.org|baseurl=https://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

C. 制作镜像完成后,我们就可以运行容器了

由于我们已经制作完成了镜像,所以我们只需要运行容器即可。制作之前我们查查看镜像是不是做好了。

(base) adamxiao@ljj$docker images                                                                                                                [5/05/25| 9:41下午]
REPOSITORY             TAG                    IMAGE ID       CREATED         SIZE
my-app             latest                 956b04bd5dea   8 minutes ago   1.11GB

可以看到我们的镜像已经做好了,我们只需要运行容器即可。

(base) adamxiao@ljj$ docker run -itd --name cdg my-app

这个命令我们稍微讲解一下,-itd是指我们运行容器的方式,-i是指我们运行容器的方式,-t是指我们运行容器的方式,-d是指我们运行容器的方式,–name是指我们运行容器的名称,my-app是指我们运行容器的镜像名称。

这里一定要注意,我们后续要启动多个镜像,每个容器的名字一定不要一样,这个名字虽然只是一个代号,但一定不要是一个名字

我们可以使用docker ps命令查看容器是否运行成功。

(base) adamxiao@ljj$docker ps                                                                                                                                                [5/05/25| 9:42下午]
CONTAINER ID   IMAGE        COMMAND          CREATED         STATUS         PORTS     NAMES
c4a9fe08e07d   my-app   "/bin/bash -i"   7 minutes ago   Up 7 minutes             cdg

看到了有一个容器起来了,说明我们是已经成功了。
后面我们可以写一个批量启动5个容器的脚本

# !/bin/bash# 定义镜像名称image_name="my-app"# 定义容器名称前缀container_name_prefix="jiubushuo"# 定义要启动的容器数量num_containers=5# 循环启动容器, 这里新增memory和cpu的限制,并且restart设置为on-failure,这样如果容器崩溃了,会自动重启。后续对于内存的限制可以酌情调节for (( i=1; i<=$num_containers; i++ ))
docontainer_name="${container_name_prefix}${i}"echo "Starting container: $container_name"docker run -itd \--memory=100m \--memory-swap=1g \--privileged=true \--cpus="0.25" \--restart=on-failure  \--name $container_name $image_name 
done

保存为start_containers.sh文件,然后运行:

bash start_containers.sh

让我们来看看5个容器是不是都启动好了,我们可以使用docker ps命令查看容器是否运行成功。

CONTAINER ID   IMAGE        COMMAND           CREATED         STATUS         PORTS     NAMES
df7465563479   my-app   "sh /app/start"   3 seconds ago   Up 1 second              jiubushuo5
d38a99720511   my-app   "sh /app/start"   3 seconds ago   Up 2 seconds             jiubushuo4
69304f1b213a   my-app   "sh /app/start"   3 seconds ago   Up 2 seconds             jiubushuo3
ea1d717052fa   my-app   "sh /app/start"   4 seconds ago   Up 3 seconds             jiubushuo2
b2da0190729f   my-app   "sh /app/start"   4 seconds ago   Up 3 seconds             jiubushuo1

容器都启动好了,没问题了。

D. 最后我们可以使用docker exec命令进入容器,然后查看客户端运行情况

我们可以使用docker exec命令进入容器,然后查看客户端运行情况。

(base) adamxiao@ljj$docker exec -it jiubushuo1 /bin/bash

进入容器后,我们可以使用ps -aux 查看我们的客户端是否正常运行。

[root@b2da0190729f app]# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   3480  2276 pts/0    Ss   15:50   0:00 sh /app/start
root        19  0.7  0.8 2876872 68152 pts/0   Sl   15:50   0:00 /usr/local/agent_service
root        26  0.0  0.0   3740  2604 pts/0    S+   15:50   0:00 /bin/bash -i
root        57  0.0  0.1  22368 15428 pts/0    S    15:50   0:00 /usr/local/agent_daemon
root       186  0.3  0.0   3740  2688 pts/1    Ss   15:51   0:00 /bin/bash
root       200  0.0  0.0   7812  2984 pts/1    R+   15:51   0:00 ps -aux

可以看到我们的客户端目前正常运行。

我们使用exit命令退出容器。

exit

SOMETHING TODO

其实待测客户端当时因为特权原因,在docker环境中使用的不太好,但是研发并不想进一步调试了,所以这件事情作罢了。但理论上给docker启动的时候,增加--privileged=true 是能解决这个问题的,可惜后面没环境能测试这个事儿了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/pingmian/84881.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows上用vnc viewer 能连接mac,不能连ubuntu

如果 VNC Viewer 可以连接 macOS&#xff0c;但无法连接 Ubuntu&#xff0c;通常是由于 Ubuntu 上的 VNC 服务配置问题或网络限制导致的。以下是逐步排查和解决方案&#xff1a; 1. 确认 Ubuntu 上已安装并运行 VNC 服务 (1) 检查是否安装了 VNC 服务器 Ubuntu 常用的 VNC 服…

Electron-vite【实战】MD 编辑器 -- 编辑区(含工具条、自定义右键快捷菜单、快捷键编辑、拖拽打开文件等)

最终效果 页面 src/renderer/src/App.vue <div class"editorPanel"><div class"btnBox"><divv-for"(config, key) in actionDic":key"key"class"btnItem":title"config.label"click"config.a…

没有宝塔面板的服务器上的WordPress网站打包下载到本地?

在服务器上部署的wordpress博客站&#xff0c;没有宝塔面板&#xff0c;怎么将服务器上的wordpress打包下载到本地&#xff1f; 作者: 晓北斗NorSnow 晓北斗动态视觉设计师&#xff0c;岚度视觉工作室执行人&#xff1b;主要从事展厅视频制作、图形工作站销售、AIGC研究&#…

Atcoder Beginner Contest 410 题解报告

零、前言 经过七七四十九天的分别&#xff0c;本期 ABC 题解又和大家见面啦&#xff01; 经过七周的奋勇杀题&#xff0c;我终于达成了三个小心愿&#xff1a; 不吃罚时AK上金排名 100 100 100 以内 且 Rated&#xff08;悲催的是&#xff0c;我 ABC400 排名两位数但没Rate…

pyspark非安装使用graphframes

pyspark版本3.1.3 需要文件 graphframes-0.8.2-spark3.1-s_2.12.jarspark-graphx_2.12-3.1.3.jar从 https://github.com/microsoft/adb2spark/raw/main/graphframes-0.8.2-py3-none-any.whl 下载graphframes-0.8.2-py3-none-any.whl。下载后把whl后缀改成zip&#xff0c;解压…

[Linux入门] Linux磁盘管理与文件系统

目录 Linux磁盘与文件系统管理详解&#xff1a;从基础到实践 ​​一、磁盘基础简述​​ 1️⃣​​硬盘类型​​&#xff1a; ​2️⃣机械硬盘结构​​&#xff1a; 3️⃣​​磁盘容量计算​​&#xff1a; 公式&#xff1a;磁盘容量磁头数柱面数每磁道扇区数每扇区字节数 …

【Flutter】性能优化总结

【Flutter】性能优化总结 Flutter 性能优化是提升应用流畅度、响应速度和用户体验的关键。可以从以下几个方面进行优化&#xff1a; 一、UI 构建与布局优化 1、避免不必要的重建 使用 const 构造函数&#xff1a;如 const Text(Hello)&#xff0c;可以减少 Widget 重建。使用…

5、ZYNQ PL 点灯--流水灯

目录 1、 概述 2 、硬件电路 3、 新建 VIVADO 工程 4、 添加工程文件 6、编写流水灯功能的Verilog代码 7 、添加管脚约束文件 8、 RTL 仿真 8.1 添加仿真测试源码 8.2 仿真结果 9、 编译并且产生 bit 文件 10、 下载程序 11、实验结果 ​编辑12、总结 1、 概述 本…

HTML5 浮动

1. 常见网页布局 1-3-1布局 1-2-1布局 2. 标准文档流 3. display属性⭐ display&#xff1a; block 给span元素设置成block display&#xff1a; inline 给div元素设置成inline display&#xff1a; inline-block 给div和span元素设置为inline-block display&#xff1a; no…

若依使用RedisCache需要注意的事项

存入redis对象的时候会带一个type字段&#xff0c;此处需要注意 存入方&#xff1a; 此处需要注意&#xff0c;存入redis的时候会带一个type&#xff0c;也就是类的路径名 redisCache.setCacheObject(screenPlayQueueName, userDemondDto,userDemondDto.getPlayDuration().in…

【STM32的通用定时器CR1的CKD[1:0]: 时钟分频因子 (Clock division)】

在 STM32 的通用定时器&#xff08;如 TIM2, TIM3, TIM4, TIM5 等&#xff09;中&#xff0c;CR1 (Control Register 1) 寄存器中的 CKD[1:0] (Clock division) 位域是一个与抗干扰和数字滤波相关的设置&#xff0c;它并不直接影响定时器计数器 (CNT) 的计数频率&#xff08;计…

渲染学进阶内容——机械动力的渲染系统(2)

Flywheel代码 这篇来研究一下实例 InstanceHandle 接口深度解析 接口核心作用 InstanceHandle 是 Flywheel 渲染引擎中的 GPU实例句柄 接口,它提供了对底层渲染实例的直接控制能力。这个接口是**实例化渲染(Instanced Rendering)**系统的核心操作接口,与之前讨论的 Vis…

Redis:极速缓存与数据结构存储揭秘

Redis —— 这个强大又灵活的 开源、内存中的数据结构存储系统。它常被用作数据库、缓存、消息代理和流处理引擎。 核心特点 (为什么它这么受欢迎&#xff1f;)&#xff1a; 内存存储 (In-Memory): 数据主要存储在 RAM 中&#xff0c;读写操作直接在内存中进行。核心优势&…

vulnyx Diff3r3ntS3c writeup

信息收集 arp-scan nmap 这里默认的话是只有80端口的&#xff0c;这个22端口是我拿到root后开的 获取userFlag 直接上web看看 扫个目录 把网页拉到最下面可以看到一个文件上传点 我们尝试上传一个php文件 失败了&#xff0c;那xxx呢 上传成功了&#xff0c;看来后端的后缀名…

【构建】CMake 构建系统重点内容

CMake 构建系统重点内容 1 基本语法与结构 cmake_minimum_required() 指定使用的最低 CMake 版本&#xff0c;防止不同版本行为不一致&#xff1a; cmake_minimum_required(VERSION 3.16)project() 定义项目名称、语言和版本&#xff1a; project(MyApp VERSION 1.0 LANGU…

Packagerun:VSCode 扩展 快捷执行命令

Packagerun&#xff1a;VSCode 快捷命令扩展&#xff08;兼容cursor&#xff09; Packagerun 是一个为 前端和node开发者设计的 VSCode 扩展&#xff0c;旨在简化 package.json 中脚本的执行&#xff0c;并支持自定义命令以提升开发效率。通过右键菜单、快捷键或自定义配置&am…

【C语言】计算机组成、计算机语言介绍

1.1 计算机组成 1946年2月14日&#xff0c;由美国军方定制的世界上第一台电子计算机“电子数字积分计算机”( ENIAC Electronic Numerical And Calculator)在美国宾夕法尼亚大学问世。 计算机(俗称电脑)堪称是人类智慧的结晶&#xff0c;随着计算机的不断发展&#xff0c;各行各…

(九)山东大学软件学院项目实训-基于大模型的模拟面试系统-面试对话标题自动总结

面试对话标题自动总结 主要实现思路&#xff1a;每当AI回复用户之后&#xff0c;调用方法查看当前对话是否大于三条&#xff0c;如果大于则将用户的两条和AI回复的一条对话传给DeepSeek让其进行总结&#xff08;后端&#xff09;&#xff0c;总结后调用updateChatTopic进行更新…

降阶法求解偏微分方程

求解给定的四个偏微分方程,采用降阶法,令 v = u x v = u_x v=ux​,从而将原方程转化为关于 v v v 的一阶方程。 方程 u x y = 0 u_{xy} = 0 uxy​=0 令 v = u x v = u_x v=ux​,则方程变为 v y = 0 v_y = 0 vy​=0。解得 v = C 1 ( x ) v = C_1(x) v=C1​(x),即 u …

提的缺陷开发不改,测试该怎么办?

经历长时间的细致检查&#xff0c;逐条执行数十条测试用例&#xff0c;终于发现一处疑似缺陷。截图留存、粘贴日志&#xff0c;认真整理好各项信息&#xff0c;将它提交到缺陷管理系统。可不到五分钟&#xff0c;这条缺陷就被打回了。开发人员给出的回复十分简洁&#xff1a;“…