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

GitLab CI中Dind结合Docker Compose部署至宿主机的疑问

解决GitLab CI借助dind部署集群到远程宿主机的问题

你提到的docker:dind服务本质是在容器内部启动一个独立的Docker daemon,所以默认情况下docker-compose操作的是这个容器内的Docker环境,确实无法直接部署到宿主机。要实现部署到远程宿主机,核心是让CI Job连接到目标宿主机的Docker daemon,而非dind容器内的,以下是两种实用方案:

方案1:通过环境变量连接远程Docker daemon

这种方案适用于目标宿主机和GitLab Runner不在同一台机器的场景:

  1. 先配置远程宿主机的Docker允许远程连接:
    • 修改宿主机的/etc/docker/daemon.json文件,添加远程监听配置:
      {
        "hosts": ["tcp://0.0.0.0:2375", "unix:///var/run/docker.sock"]
      }
      
    • 重启Docker服务使配置生效:systemctl restart docker
    • 注意:生产环境必须配合TLS加密配置,禁止直接暴露未加密的2375端口,避免安全风险
  2. 修改GitLab CI配置,去掉docker:dind服务,通过DOCKER_HOST环境变量指定远程Docker地址:
    image: tmaier/docker-compose:latest
    variables:
      DOCKER_HOST: tcp://<远程宿主机IP>:2375
      # 如果配置了TLS,还要添加DOCKER_TLS_VERIFY=1等相关变量
    before_script:
      - docker info  # 此时会连接到远程宿主机的Docker daemon
      - docker-compose --version
    deploy to remote:
      stage: deploy
      script:
        - docker-compose up -d
    

方案2:挂载宿主机Docker sock(Runner与目标宿主机同机器)

如果你的GitLab Runner直接部署在目标宿主机上,无需使用dind,直接挂载宿主机的Docker sock即可让CI Job操作宿主机的Docker:

  1. 修改GitLab Runner的config.toml配置文件,在[runners.docker]段添加挂载配置:
    [runners.docker]
      # 其他配置...
      volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
    
  2. 重启GitLab Runner服务:systemctl restart gitlab-runner
  3. 简化GitLab CI配置,不需要dind服务:
    image: tmaier/docker-compose:latest
    before_script:
      - docker info  # 直接操作宿主机的Docker环境
      - docker-compose --version
    deploy to host:
      stage: deploy
      script:
        - docker-compose up -d
    

注意事项

  • 方案1适合跨机器远程部署,方案2适合Runner与目标宿主机合一的场景
  • 生产环境中,远程连接Docker必须配置TLS认证,防止未授权访问
  • 确保CI Job对应的Runner用户拥有操作目标宿主机Docker的权限

内容的提问来源于stack exchange,提问作者ensberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 20:27:23