GitLab CI流水线中无法连接到后台Docker容器
问题原因
在GitLab CI的docker-dind架构中,docker:23.0.2的任务容器与docker:23.0.2-dind服务容器属于独立的网络栈。你启动的that_server容器运行在dind服务容器内部,它的IP是dind容器的私有内部IP,任务容器无法直接访问该IP,这就是curl超时的核心原因。
解决方案
方案1:端口映射到dind服务,通过服务名访问
将that_server的端口映射到dind服务容器的端口,利用CI默认网络中任务容器与dind服务的连通性,通过服务名docker访问:
修改.gitlab-ci.yml的script段:
script: # 将容器9000端口映射到dind服务的9000端口 - docker run --rm --detach --name that_server -p 9000:9000 python:3.11-slim-bullseye python3 -m http.server 9000 # 用dind服务名访问,任务容器与dind服务在同一CI网络下 - curl http://docker:9000
方案2:在容器内部执行测试(无需跨网络)
如果测试无需依赖任务容器环境,可直接在that_server容器内或关联容器中执行测试:
script: - docker run --rm --detach --name that_server python:3.11-slim-bullseye python3 -m http.server 9000 # 启动测试容器,通过容器名直接访问(同一网络下容器名可解析) - docker run --rm --link that_server:server python:3.11-slim-bullseye curl http://server:9000
也可直接用docker exec在server容器内运行测试:
script: - docker run --rm --detach --name that_server python:3.11-slim-bullseye python3 -m http.server 9000 # 等待服务启动后,在容器内执行curl - sleep 5 - docker exec that_server curl http://localhost:9000
方案3:配置dind使用host网络(不推荐)
将dind服务改为host网络模式,让任务容器能直接访问dind内部的容器IP,但此方式会打破CI网络隔离,仅适合测试场景:
services: - name: docker:23.0.2-dind command: ["--network=host"]
修改后可保留原curl命令,但注意共享runner环境下存在安全风险。
关键说明
GitLab CI中,任务容器与dind服务容器通过CI默认网络连通,任务容器可通过服务名(如docker)访问dind容器暴露的端口;dind内部的容器网络是独立的,任务容器无法直接穿透,必须通过端口映射或容器间通信的方式访问。
内容的提问来源于stack exchange,提问作者Mikaelblomkvistsson
相关产品推荐
相关产品推荐

