GitLab Runner使用DinD服务时无法连接Docker容器问题问询
问题根因
- 你当前使用的DinD模式属于双层Docker架构:作业容器、DinD服务容器都由Runner所在宿主机的外层Docker启动,二者共享外层CI自定义网络;你在作业中
docker run启动的测试容器由DinD内部的内层Docker管理,属于内层独立网络段,和外层CI网络天然隔离。 - 你使用
-p 8000:8000做端口映射时,是将测试容器的8000端口映射到了DinD服务容器的网络栈,默认GitLab CI场景下需要显式绑定到DinD的所有网络接口才能被同处外层网络的作业容器访问。 - 测试容器启动后没有预留初始化时间,刚启动就发起请求也可能导致连接失败。
- 你原配置script段中多余的
- |语法也可能导致脚本执行异常。
解决方案
首先删除script段多余的- |,再按照以下两种方案修改即可:
方案1:显式绑定端口到0.0.0.0
修改docker run命令,显式指定绑定到所有网络接口,同时增加等待时间保证容器初始化完成:
script: - apk add curl - apk add --no-cache --upgrade bash - docker run -d -p 0.0.0.0:8000:8000 jdkelley/simple-http-server - sleep 3 - docker network ls - curl docker:8000
方案2:测试容器使用host网络
直接让测试容器共享DinD服务容器的网络栈,无需额外端口映射:
script: - apk add curl - apk add --no-cache --upgrade bash - docker run -d --network host jdkelley/simple-http-server - sleep 3 - docker network ls - curl docker:8000
内容的提问来源于stack exchange,提问作者sqr
相关产品推荐
相关产品推荐

