You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:03:17