如何启动Karate Gatling分布式测试?Docker连接异常求助
解决Karate Gatling分布式测试Docker环境下的Docker守护进程连接问题
问题分析
从错误日志能明确看出:master节点容器内执行docker run命令时,无法连接到unix:///var/run/docker.sock。核心原因有两点:
- 容器内部默认未安装Docker客户端,也未关联宿主机器的Docker守护进程
- 代码里
serverUrl设为127.0.0.1,slave容器无法通过这个地址访问master节点的服务
解决方案
1. 修正master节点的Docker启动命令
启动master容器时,需要挂载宿主的Docker套接字和客户端二进制文件,让容器内的docker命令能调用宿主的Docker守护进程。修改后的命令如下:
docker container run -d -t \ --network=karate_network \ --name karate_boss \ --privileged \ -v /var/run/docker.sock:/var/run/docker.sock \ -v $(which docker):/usr/bin/docker \ karate \ mvn clean test -Dtest=TestPerformanceDocker -DTHREADS=3 -DRAMP_DURATION=600 -DCONST_DURATION=600 -DNODES_COUNT=3
参数说明:
-v /var/run/docker.sock:/var/run/docker.sock:挂载宿主的Docker套接字到容器,打通容器与宿主Docker守护进程的连接-v $(which docker):/usr/bin/docker:将宿主的Docker客户端二进制文件挂载到容器,确保容器内可执行docker命令
2. 修正测试代码中的serverUrl
容器内的127.0.0.1指向容器自身,slave容器无法通过该地址连接master的9090端口。需将serverUrl改为master容器的hostname(karate_boss,同一网络下可直接解析)或宿主机器IP:
public class TestPerformanceDocker { @Test void test(){ // 同一karate_network网络下,直接使用容器hostname即可访问 String serverUrl= "karate_boss"; String threads = System.getProperty("THREADS"); String rampDuration = System.getProperty("RAMP_DURATION"); String constantDuration =System.getProperty("CONST_DURATION"); Integer executorCount=Integer.parseInt(System.getProperty("NODES_COUNT")); String cmd ="mvn gatling:test -DTHREADS="+threads+" -DRAMP_DURATION="+rampDuration+" -DCONST_DURATION="+constantDuration+""; GatlingMavenJobConfig config = new GatlingMavenJobConfig(executorCount, serverUrl, 9090) {}; config.setMainCommand(cmd); JobManager<Integer> manager = new JobManager(config); manager.start(); manager.waitForCompletion(); } }
3. 验证网络连通性
确保所有容器处于同一karate_network网络,可通过以下命令测试slave容器能否访问master:
docker run --rm --network=karate_network busybox ping karate_boss -c 3
内容的提问来源于stack exchange,提问作者Ahri Jiang US
相关产品推荐
相关产品推荐

