Docker Swarm中Selenium Firefox节点主机变量配置及网络连通问题
解决Docker Swarm中Selenium Hub无法连接Firefox节点的网络问题
这个问题我之前在Swarm部署Selenium集群时也碰到过,核心原因就是Docker容器多网络环境下,Firefox节点默认用了非专用网络的内部IP(比如你提到的172.19.0.4)上报给Hub,但Hub在Selenium专用网络里访问不到这个IP,最终触发超时。我们可以通过配置节点的几个关键环境变量来解决,同时把节点主机设为可配置的变量。
核心解决方案:配置节点的上报地址
Selenium节点提供了三个关键环境变量来控制它向Hub上报的地址,我们需要正确设置这三个变量:
SE_NODE_HOST:节点的主机地址(Hub能访问到的IP或Swarm服务名)SE_NODE_PORT:节点监听的端口SE_NODE_REMOTE_HOST:节点上报给Hub的完整访问地址
1. 使用Swarm Stack部署(推荐)
创建一个docker-compose.yml文件,统一管理Hub和节点服务,确保两者在同一个专用网络内,同时配置节点的环境变量:
version: '3.8' networks: selenium-net: driver: overlay attachable: true services: selenium-hub: image: selenium/hub:latest ports: - "4444:4444" networks: - selenium-net deploy: replicas: 1 placement: constraints: [node.role == manager] firefox-node: image: selenium/node-firefox:latest environment: # 连接到Hub的事件总线 - SE_EVENT_BUS_HOST=selenium-hub - SE_EVENT_BUS_PUBLISH_PORT=4442 - SE_EVENT_BUS_SUBSCRIBE_PORT=4443 # 关键配置:指定节点的主机地址(用Swarm节点的内部IP) - SE_NODE_HOST={{.Node.InternalIP}} - SE_NODE_PORT=5555 # 上报给Hub的完整地址,引用前面的变量保证一致性 - SE_NODE_REMOTE_HOST=http://${SE_NODE_HOST}:${SE_NODE_PORT} networks: - selenium-net deploy: replicas: 3 # 可选:如果需要固定节点到特定Swarm节点,添加constraints # placement: # constraints: [node.hostname == swarm-node-1]
部署这个Stack到Swarm:
docker stack deploy -c docker-compose.yml selenium-cluster
2. 命令行单独创建节点服务
如果需要单独创建Firefox节点服务,用以下命令(替换selenium-net为你的专用网络名称):
# 获取当前Swarm节点的内部IP NODE_IP=$(docker node inspect self --format '{{.Status.Addr}}') docker service create \ --name firefox-node \ --network selenium-net \ --env SE_EVENT_BUS_HOST=selenium-hub \ --env SE_EVENT_BUS_PUBLISH_PORT=4442 \ --env SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \ --env SE_NODE_HOST=$NODE_IP \ --env SE_NODE_PORT=5555 \ --env SE_NODE_REMOTE_HOST=http://$NODE_IP:5555 \ selenium/node-firefox:latest
关键参数说明
{{.Node.InternalIP}}:Swarm的模板变量,自动获取节点的内部IP(也就是你提到的10.0.1.19这类地址),Hub在专用网络内可以直接访问这个IP。- 也可以用Swarm服务名
firefox-node作为SE_NODE_HOST的值,因为Swarm的内部DNS会自动解析服务名到正确的网络IP,这种方式更灵活,适合动态扩缩容的场景。 - 确保Hub和所有节点都加入同一个
selenium-net网络,避免跨网络的访问问题。
验证解决方案
部署完成后,访问Selenium Hub的控制台:http://<hub-ip>:4444/ui,查看已注册的Firefox节点的地址是否是你指定的10.0.1.x地址或服务名。如果显示正确,就可以运行测试脚本验证Hub是否能正常调用节点执行测试。
内容的提问来源于stack exchange,提问作者koras
相关产品推荐
相关产品推荐

