基于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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84881.shtml
英文地址,請注明出處:http://en.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;“…