Docker原理和使用场景(网络模式和分布式UI自动化环境部署)

文章目录

  • [1. 容器 与 虚拟机区别](#1. 容器 与 虚拟机区别)
  • [2. 容器与虚拟机使用场景的选择](#2. 容器与虚拟机使用场景的选择)
  • [3. 网络模式](#3. 网络模式)
  • [4. Docker实际使用场景](#4. Docker实际使用场景)
  • 总结

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。



本文开始

1. 容器 与 虚拟机区别

左:虚拟机;右:容器-Docker

  1. 容器与容器之间只是进程的隔离,而虚拟机是完全的资源隔离。
  2. Docker容器启动快速,通常在秒级或更短的时间内,而虚拟机可能需要分钟级的时间。
  3. 容器共享宿主操作系统的内核,而虚拟机使用完全独立的内核。
    【注】Docker不隔离内核,只虚拟软件,不虚拟化操作系统内核,使用的宿主机内核。
    安装软件在内核上

虚拟机:虚拟机将应用程序及其依赖项捆绑在一起。每个虚拟机都有一个完整的操作系统,并且可以在同一台主机上运行多个虚拟机。

容器:容器由容器管理器管理

2. 容器与虚拟机使用场景的选择

toB-部署本地公司/线上 和 toC-部署到客户场景

容器与虚拟机使用场景的选择:考虑具体实际工作场景

【注】系统内核无法直接操作,通过软件间接操作内核。

在所有需要使用的系统内核的场景,不能使用容器Docker技术。容器底层具体的内核不能确定,自己不能完全掌控。

客户部署场景:推荐使用虚拟机,需要使用具体的内核,自己可以掌控。

公司本地部署:不需要内核的话,使用哪个都可以。

综述:部署测试-使用虚拟机,容器部署使用的是宿主机内核,不一定是要求的内核,使用虚拟机确定使用的内核。

3. 网络模式

网桥模式

默认容器为网桥模式:需要映射端口,转发请求;

eto0: 网卡-以太网网卡

docker0(bridge):网桥(bridge),将网络请求广播到容器中。

ip_forward:开启该参数,将宿主机某端口的网络请求转发到容器中;(-p 5005:8080)

【注】创建容器,自动创建网桥。

构建容器网络容器启动有两块网卡,容器内部一个网卡,网桥上一个网卡用于连接网桥网络。

网桥作用:

  1. 构建并连接所有容器的网络
  2. 与宿主机进行通信
    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()

总结

✨✨✨各位读友,本篇分享到内容是否更好的帮助你理解,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
🎉🎉🎉一遇挫折就灰心丧气的人,永远是个失败者。而一向努力奋斗,坚韧不拔的人会走向成功。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

相关推荐
Coder个人博客2 小时前
Linux6.19-ARM64 mm mteswap子模块深入分析
linux·安全·车载系统·系统架构·系统安全·鸿蒙系统·安全架构
?re?ta?rd?ed?2 小时前
linux中的进程
linux·运维·服务器
yanlou2332 小时前
【C++/Linux实战项目】仿muduo库实现高性能Reactor模式TCP服务器(深度解析)
linux·服务器·c++·tcp/ip·epoll
f大熊2 小时前
服务器状态监控
linux·运维·服务器·ubuntu·watchdog
等什么君!2 小时前
练习-部署nginx和部署tomcat
运维·nginx·docker
IDC02_FEIYA2 小时前
Discuz!论坛注册验证邮箱收不到邮件怎么办?邮件检测发送成功,但是收发邮箱都未看到邮件
linux·服务器·阿里云
_OP_CHEN2 小时前
【Linux系统编程】(二十一)吃透 Linux “一切皆文件” 与缓冲区:从底层逻辑到实战封装
linux·操作系统·glibc·c/c++·缓冲区·linux文件·io库
约定Da于配置2 小时前
Docker 配置了阿里云镜像加速依然拉取不了的问题
阿里云·docker·容器
2401_840192272 小时前
ZooKeeper 单机部署指南
分布式·zookeeper·云原生