使用多个 docker 守护进程运行 gitlab-runner

Posted

技术标签:

【中文标题】使用多个 docker 守护进程运行 gitlab-runner【英文标题】:Running gitlab-runner with multiple docker daemons 【发布时间】:2020-02-10 20:50:30 【问题描述】:

我正在尝试让多个 gitlab 运行器在同一主机上使用不同的 docker 守护进程

目前使用 gitlab-runner 10.7.0 和 docker 19.03.3。目标是最大限度地利用资源。由于我的机器上有两个 SSD 磁盘,我希望跑步者同时使用它们。我发现让一些运行者使用一个磁盘而另一些运行者使用另一个磁盘的唯一方法是拥有两个 docker 守护程序,每个磁盘上运行一个。

我有一个在 unix:///var/run/docker-1.sock 上运行的 docker 守护进程和一个在 unix:///var/run/docker-2.sock 上运行的。他们使用每个手动创建的专用网桥。 (systemd)启动命令行看起来像/usr/bin/dockerd --host unix:///var/run/docker_socket/docker-%i.sock --containerd=/run/containerd/containerd.sock --pidfile /var/run/docker-%i.pid --data-root /data/local%i/docker/ --exec-root /data/local%i/docker_run/ --bridge docker-%i --fixed-cidr 172.%i0.0.1/17

gitlab_runner 挂载/var/run/docker_socket/ 并在 docker-1.sock 上运行。 我尝试让每个 docker 守护进程运行一个,但随后两个作业在同一个运行器上运行,尽管限制设置为 1(而且有时会出现一些错误,例如 ERROR: Job failed (system failure): Error: No such container: ...

注册后 config.toml 如下所示:

concurrent = 20
check_interval = 0

[[runners]]
  name = "[...]-large"
  limit = 1
  output_limit = 32768
  url = "[...]"
  token = "[...]"
  executor = "docker"
  [runners.docker]
    host = "unix:///var/run/docker-1.sock"
    tls_verify = false
    image = "debian:jessie"
    memory = "24g"
    cpuset_cpus = "1-15"
    privileged = false
    security_opt = ["seccomp=unconfined"]
    disable_cache = false
    volumes = ["/var/run/docker-1.sock:/var/run/docker.sock"]
    shm_size = 0
  [runners.cache]


[[runners]]
  name = "[...]-medium-1"
  limit = 1
  output_limit = 32768
  url = "[...]"
  token = "[...]"
  executor = "docker"
  [runners.docker]
    host = "unix:///var/run/docker-2.sock"
    tls_verify = false
    image = "debian:jessie"
    memory = "12g"
    cpuset_cpus = "20-29"
    privileged = false
    security_opt = ["seccomp=unconfined"]
    disable_cache = false
    volumes = ["/var/run/docker-2.sock:/var/run/docker.sock"]
    shm_size = 0
  [runners.cache]

两个 docker 守护进程工作正常。用docker --host unix:///var/run/docker-<id>.sock ps测试过

当前的解决方案似乎还不错,但 gitlab_runner 日志中有随机错误: ERROR: Appending trace to coordinator... error couldn't execute PATCH against http://[...]/api/v4/jobs/223116/trace: Patch http://[...]/api/v4/jobs/223116/trace: read tcp [...] read: connection reset by peer runner=0ec8a845

【问题讨论】:

【参考方案1】:

其他人尝试过,显然取得了一些成功:

这似乎列出了正确运行每个 dockerd 实例所需的整套选项:Is it possible to start multiple docker daemons on the same machine。你的是什么? 另一个https://www.jujens.eu/posts/en/2018/Feb/25/multiple-docker/,没有谈到可能的额外网桥配置。

注意:Docker 文档说该功能是实验性:https://docs.docker.com/engine/reference/commandline/dockerd/#run-multiple-daemons

【讨论】:

正如我在问题中所说,两个 docker 守护进程运行良好。我正在使用系统模板/lib/systemd/system/docker@.service 在运行程序中运行可执行文件是否有效?不仅仅是docker ps?即docker -H unix:///var/run/docker-2.sock exec [...]-medium-1 ls ?

以上是关于使用多个 docker 守护进程运行 gitlab-runner的主要内容,如果未能解决你的问题,请参考以下文章

Docker 构建失败 - 带有 GKE 的 Gitlab CI。无法通过 tcp://localhost:2375 连接到 Docker 守护程序。 docker 守护进程是不是正在运行?

无法连接到 unix:///var/run/docker.sock 上的 Docker 守护程序。 docker 守护进程是不是正在运行?带有自托管运行器的 Gitlab Cloud CI/CD 错误

无法在 unix:///var/run/docker.sock 连接到 Docker 守护进程。(Gitlab)

来自守护进程的错误响应:registry.gitlab.com 存储库的拉取访问被拒绝或可能需要“docker login”

如何在一个Docker中同时运行多个程序进程?

Gitlab管道失败:错误:准备失败:来自守护进程的错误响应:toomanyrequests