使用 FF_NETWORK_PER_BUILD 标志运行 Gitlab CI 作业时 --network=host 是否仍然连接到主机网络?

the*_*tor 3 gitlab docker gitlab-ci

我正在尝试在 Gitlab CI 作业中使用 docker in docker 运行测试。我的理解是,启用 FF_NETWORK_PER_BUILD 标志将自动创建一个用户定义的桥接网络,作业运行程序和该作业中所有创建的泊坞窗将连接到该网络...但是查看 Gitlab 文档我有点困惑...

此页面: https: //docs.gitlab.com/ee/ci/services/

docker:dind给出了使用该服务的示例FF_NETWORK_PER_BUILD: "true"

但使用时docker run它们仍然包含该--network=host标志。

这是给定的示例:

  stage: build
  image: docker:19.03.1
  services:
    - docker:dind                    # necessary for docker run
    - tutum/wordpress:latest
  variables:
    FF_NETWORK_PER_BUILD: "true"     # activate container-to-container networking
  script: |
    docker run --rm --name curl \
      --volume  "$(pwd)":"$(pwd)"    \
      --workdir "$(pwd)"             \
      --network=host                 \
      curlimages/curl:7.74.0 curl "http://tutum-wordpress"
Run Code Online (Sandbox Code Playgroud)

我试图确保此作业中的所有 docker 都位于自己独立的网络上,因此--network=host在此实例中使用该标志是否会将新 docker 连接到实际作业运行程序所在的主机服务器?或者刚刚创建的按职位网络?在什么情况下,您希望创建每个作业网络并仍将新的 docker 连接到主机网络?

如有任何建议,将不胜感激!

syt*_*ech 7

在此实例中使用 --network=host 标志是否会将新的 docker 连接到实际作业运行程序所在的主机服务器?或者刚刚创建的按职位网络?

这可能会令人困惑,因为其中的“主机”--network=host并不意味着底层运行程序主机/“裸机”系统中的主机。要了解这里发生了什么,我们必须首先了解该docker:dind服务是如何工作的。

当您使用该服务从构建作业中docker:dind执行命令时,您正在该服务运行容器;它是 docker 守护进程。dockerdocker:dind

当您提供该--host选项时,它指的是守护程序IE容器docker run 的主机网络docker:dind,而不是底层系统主机。

当您指定时FF_NETWORK_PER_BUILD,就是为构建作业及其封装所有作业容器的服务容器指定 docker 网络。

因此,相关活动按顺序发生如下:

  1. GitLab 运行程序为构建创建一个新的 docker 网络
  2. 运行程序创建docker:dindtutum/wordpress:latest服务,连接到步骤 (1) 中创建的网络
  3. 您的作业容器启动,并在步骤 (1) 中连接到 docker 网络
  4. 您的作业联系docker:dind容器并要求它启动一个新curl容器,连接到容器的主机网络docker:dind(与步骤 (1) 中创建的网络相同),从而允许它访问服务容器。

如果没有该--network=host标志,创建的容器将位于不同的桥接网络上,并且无法到达从步骤 (1) 创建的网络。