文章目录
- [1. 容器 与 虚拟机区别](#1. 容器 与 虚拟机区别)
- [2. 容器与虚拟机使用场景的选择](#2. 容器与虚拟机使用场景的选择)
- [3. 网络模式](#3. 网络模式)
- [4. Docker实际使用场景](#4. Docker实际使用场景)
-
- [Docker 部署分布式UI自动化测试环境](#Docker 部署分布式UI自动化测试环境)
-
- selenium分布式部署UI自动化测试环境
- 分布式自动化测试环境部署操作
-
- [Docker 部署 hub](#Docker 部署 hub)
- [docker 部署 node](#docker 部署 node)
- [通过VNC Viewer查看远程浏览器运行情况](#通过VNC Viewer查看远程浏览器运行情况)
- 总结
✨✨✨学习的道路很枯燥,希望我们能并肩走下来!
编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。

本文开始
1. 容器 与 虚拟机区别
左:虚拟机;右:容器-Docker
- 容器与容器之间只是进程的隔离,而虚拟机是完全的资源隔离。
- Docker容器启动快速,通常在秒级或更短的时间内,而虚拟机可能需要分钟级的时间。
- 容器共享宿主操作系统的内核,而虚拟机使用完全独立的内核。
【注】Docker不隔离内核,只虚拟软件,不虚拟化操作系统内核,使用的宿主机内核。
安装软件在内核上
虚拟机:虚拟机将应用程序及其依赖项捆绑在一起。每个虚拟机都有一个完整的操作系统,并且可以在同一台主机上运行多个虚拟机。
容器:容器由容器管理器管理
2. 容器与虚拟机使用场景的选择
toB-部署本地公司/线上 和 toC-部署到客户场景
容器与虚拟机使用场景的选择:考虑具体实际工作场景
【注】系统内核无法直接操作,通过软件间接操作内核。
在所有需要使用的系统内核的场景,不能使用容器Docker技术。容器底层具体的内核不能确定,自己不能完全掌控。
客户部署场景:推荐使用虚拟机,需要使用具体的内核,自己可以掌控。
公司本地部署:不需要内核的话,使用哪个都可以。
综述:部署测试-使用虚拟机,容器部署使用的是宿主机内核,不一定是要求的内核,使用虚拟机确定使用的内核。
3. 网络模式
网桥模式
默认容器为网桥模式:需要映射端口,转发请求;
eto0: 网卡-以太网网卡
docker0(bridge):网桥(bridge),将网络请求广播到容器中。
ip_forward:开启该参数,将宿主机某端口的网络请求转发到容器中;(-p 5005:8080)
【注】创建容器,自动创建网桥。
构建容器网络容器启动有两块网卡,容器内部一个网卡,网桥上一个网卡用于连接网桥网络。
网桥作用:
- 构建并连接所有容器的网络
- 与宿主机进行通信
veth: 虚拟网卡
Host模式 - 主机模式
Host模式:不构建自己的网络,使用宿主机网络。
解决:宿主机和容器网络设置不同的问题
使用场景:使用宿主机并且使用其网络,宿主机可能设置网络安全等操作,需要使用到Host模式;
【注】
1.Host模式可以直接使用宿主机网卡
2.容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。
3.host 模式作为路由使用,在K8s中;
containter 模式
containter 模式:一个容器使用其他容器网络(新创建的容器和已经存在的一个容器共享一个 Network Namespace);
使用场景:需要容器之间进行通信(容器之间需要相互配合使用)
K8s:容器间网络交互 - 使用containter 模式
网络模式使用的方式
创建 Docker 容器时,可以用 --net 选项指定容器的网络模式,
Docker有以下4种网络模式:
- -host模式:使用 --net=host 指定。
- -cantainer模式:使用--net=container:name or id 指定。
- -none模式:使用--net=none 指定。
- -bridge 模式(默认):使用--net=bridge指定
bash
docker run -d --name=test_jenkins -itd 5000:8080 jenkins
# 容器模式
docker run -d --name=holmes -itd --net=container:jenkins holmes
4. Docker实际使用场景
Docker 部署分布式UI自动化测试环境
问题:自动化测试用例过多几千,浏览器消耗cpu资源,使用多台服务器运行,每个服务器启动多个浏览器,并发执行,让不同浏览执行测试用例。
selenium分布式部署UI自动化测试环境
Selenium Grid:是Selenium的三大组件之一,可以分布式测试执行,Grid 由一个hub节点和若干个node代理节点组成,Hub用来管理各个代理节点的注册信息和状态信息,并且接受远程客户端代码的请求调用,然后把请求的命令转发给代理节点来执行。
图片解释:
client: 客户端-宿主机
grid hub: 浏览器集群主节点
nodes: 节点
分布式自动化测试环境部署操作
Docker 部署 hub
selenium/hub 镜像是: Selenium Grid 的主控制中心,负责管理和分发测试任务。
hub: 是测试执行的入口点,接收来自测试脚本的请求,并将其分派给可用的selenium/node来执行。
bash
# 拉取hub镜像
docker pull selenium/hub:latest
# 查看本地镜像
docker images selenium/hub
# 启动容器
docker run --name hub -d -p 5442-5444:4442-4444 selenium/hub:latest
参数说明:
-p 5442-5444:4442-4444:将主机的端口5442-54444映射到容器4442-4444端口。
验证部署成功:
访问地址:IP:5444
docker 部署 node
selenium/node镜像: 是 Selenium Grid 的节点,负责实际执行测试任务。可以启动多个节点,每个节点可以运行在不同的操作系统和浏览器环境中,以实现并行测试。
bash
# 拉取 node 镜像
docker pull selenium/node-chrome:latest
# 查看本地镜像
docker images
# 启动容器
docker run --name node -p 5902:5900 -d \
-e SE_EVENT_BUS_HOST=172.17.0.1 \
-e SE_NODE_MAX_SESSIONS=5 \
-e SE_NODE_OVERRIDE_MAX_SESSIONS=true \
-e SE_EVENT_BUS_PUBLISH_PORT=5442 \
-e SE_EVENT_BUS_SUBSCRIBE_PORT=5443 \
-v /dev/shm:/dev/shm \
selenium/node-chrome:latest
# 查看docker默认网桥和网络地址
ifconfig
# 查看容器
docker ps
启动容器命令参数说明:
- -p 5902:5900:将容器的端口 5900 映射到主机的端口 5902。可以让VNC客户端能够连接到Chrome浏览器实例的图形界面。
- -e SE_EVENT_BUS_HOST=172.17.0.1:设置主节点的主机地址。
- -e SE_NODE_MAX_SESSIONS=5:设置Selenium节点最多可以运行浏览器会话数。
- -e SE_NODE_OVERRIDE_MAX_SESSIONS=true:覆盖默认的最大会话设置,允许上面的 SE_NODE_MAX_SESSIONS 生效。
- -e SE_EVENT_BUS_PUBLISH_PORT=5442:设置事件总线的发布端口 为5442。
【注】 Hub 时用于发送消息的端口 - -e SE_EVENT_BUS_SUBSCRIBE_PORT=5443:设置事件总线的订阅端口 为5443。
【注】Node 通过此端口接收来自 Hub 的指令(例如:"启动一个新会话"、"关闭浏览器"等) - -v /dev/shm:/dev/shm:将主机的 /dev/shm 目录挂载到容器的相同路径,以确保共享内存可用。
Selenium Node (本容器)
│
├── 连接到 Hub 的 5442 端口 → 发送注册/状态信息(PUBLISH)
│
└── 监听来自 Hub 的 5443 端口 → 接收测试任务指令(SUBSCRIBE)
通过VNC Viewer查看远程浏览器运行情况
VNC(Virtual Network Console):是虚拟网络控制台的编写,是一款优秀的远程控制工具软件,在基于 UXIX 和 Linux 操作系统的免费的开源软件,远程控制能力强大,高效实用。
配置VNC链接的远程地址
连接Grid代码-示例:
运行代码后,可在部署的hub上查看运行情况,如配置20个浏览器,运行了多少
python
from selene.support.shared import browser, config
from selenium.webdriver import Chrome
import selenium.webdriver
if __name__ == '__main__':
config.browser_name = 'chrome'
config.base_url = "测试web的ip地址:5444"
config.timeout = 10
config.save_screenshot_on_failure = False
option = selenium.webdriver.ChromeOptions()
option.add_argument("--disable-infobars")
option.add_argument("--disable-dev-shm-usage")
option.add_argument("--no-sandbox")
option.add_argument("--disable-extensions")
option.add_argument("--ignore-ssl-errors")
option.add_argument("--ignore-certificate-errors")
option.add_argument('--disable-gpu')
prefs = {'download.default_directory': '/home/seluser/Downloads/'}
option.add_experimental_option('prefs', prefs)
option.add_experimental_option('w3c', False)
option.add_experimental_option('perfLoggingPrefs', {
'enableNetwork': True,
'enablePage': False,
})
caps = option.to_capabilities()
caps['goog:loggingPrefs'] = {'performance': 'ALL'}
config.driver = selenium.webdriver.Remote(
command_executor="grid hub地址:5444",
desired_capabilities=caps,
keep_alive=True,
options=option)
config.driver.set_page_load_timeout(10)
browser.open('/')
browser.driver.maximize_window()
总结
✨✨✨各位读友,本篇分享到内容是否更好的帮助你理解,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
🎉🎉🎉一遇挫折就灰心丧气的人,永远是个失败者。而一向努力奋斗,坚韧不拔的人会走向成功。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!





