GitLab Runner远程Docker配置疑问:是否需本地Docker及多环境部署
问题解答
1. Server2是否需要安装Docker Engine?
不需要强制安装,取决于你选择的Runner执行器类型:
- 如果用
shell执行器,仅通过SSH或远程Docker客户端调用Server3/Server4的Docker服务,Server2本地无需安装Docker; - 如果需要用
docker执行器来构建镜像、运行临时作业容器(比如编译代码的环境),才需要在Server2安装Docker Engine,但这和部署到远程测试/生产环境的需求是分离的。
2. 配置Runner分别部署到测试和生产环境的步骤
第一步:让Server2能访问远程Docker节点
在Server3(测试)和Server4(生产)上配置Docker允许远程访问:
- 编辑
/etc/docker/daemon.json,添加远程监听地址:{ "hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"] }生产环境建议启用TLS加密连接,避免明文传输;测试环境可临时用2375非加密端口(不推荐生产用)
- 重启Docker服务:
systemctl restart docker - 开放防火墙对应端口(比如2376),确保Server2能连通Server3/Server4的该端口。
第二步:配置Runner的两种方案
方案一:单Runner通过环境变量切换目标环境
在Server2上配置Docker客户端多上下文:
# 创建测试环境上下文 docker context create test-env --docker "host=tcp://[Server3-IP]:2376" # 创建生产环境上下文 docker context create prod-env --docker "host=tcp://[Server4-IP]:2376"
然后在项目的.gitlab-ci.yml中通过规则切换上下文:
stages: - deploy-test - deploy-prod deploy-test: stage: deploy-test script: - docker context use test-env - docker run -d --name test-app your-test-image:${CI_COMMIT_SHORT_SHA} only: - branches - tags: /^test-.*/ deploy-prod: stage: deploy-prod script: - docker context use prod-env - docker run -d --name prod-app your-prod-image:${CI_COMMIT_TAG} only: - tags: /^prod-.*/ when: manual # 生产部署建议手动触发,防止误操作
方案二:注册两个独立Runner分别对应测试/生产
在Server2上注册测试环境Runner:
gitlab-runner register \ --url "http://[Server1-GitLab-IP]/" \ --registration-token "你的GitLab项目注册令牌" \ --description "Test Env Runner" \ --tag-list "test,deploy" \ --executor "shell" \ --env "DOCKER_HOST=tcp://[Server3-IP]:2376"
注册生产环境Runner:
gitlab-runner register \ --url "http://[Server1-GitLab-IP]/" \ --registration-token "你的GitLab项目注册令牌" \ --description "Prod Env Runner" \ --tag-list "prod,deploy" \ --executor "shell" \ --env "DOCKER_HOST=tcp://[Server4-IP]:2376"
然后在.gitlab-ci.yml中通过tags指定对应Runner:
deploy-test: stage: deploy-test tags: - test script: - docker run -d --name test-app your-test-image:${CI_COMMIT_SHORT_SHA} only: - test/* deploy-prod: stage: deploy-prod tags: - prod script: - docker run -d --name prod-app your-prod-image:${CI_COMMIT_TAG} only: - main when: manual
权限注意事项
- Server2上运行GitLab Runner的用户,需要具备执行Docker客户端命令的权限,或者配置SSH免密登录到Server3/Server4,直接通过SSH执行远程Docker命令(比如
ssh user@server3 'docker run ...'); - 生产环境务必给Docker远程连接配置TLS证书,禁止裸奔传输。
内容的提问来源于stack exchange,提问作者Temp Worker Here
相关产品推荐
相关产品推荐

