在 Google Cloud 构建中的两个容器之间进行通信
Posted
技术标签:
【中文标题】在 Google Cloud 构建中的两个容器之间进行通信【英文标题】:Communicate between two containers in Google cloud build 【发布时间】:2019-02-02 10:08:34 【问题描述】:我正在 Google 云构建中运行我的 CI/CD 管道。我的应用程序有 web
和 wget
容器。我正在尝试从wget
联系web
云构建内部使用cloudbuild
桥接网络,同时将容器作为步骤启动。所以我期待这些步骤可以使用名称进行交流。但它失败了。
如果我创建自己的 docker bridge netwok,那么它们会进行通信。
我想知道为什么 cloudbuild 网络没有按预期工作。
如果您知道其他在步骤容器之间建立通信的方法,请告诉我。
cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
id: Web server
args: ["run", "-d", "--name", "mani", "manikantanr/hostname_ip"]
- name: 'gcr.io/cloud-builders/wget'
id: wget web mani:8000
args: ["-qO-", "http://mani:8000"]
为了了解 cloudbuild 的内部结构,我使用了一些 docker 命令。
调试-cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
id: Docker Version
args: ["version"]
- name: 'gcr.io/cloud-builders/docker'
id: Docker info
args: ["info"]
- name: 'gcr.io/cloud-builders/docker'
id: Docker volume ls
args: ["volume", "ls"]
- name: 'gcr.io/cloud-builders/docker'
id: Docker volume inspect homevol
args: ["volume", "inspect", "homevol"]
- name: 'gcr.io/cloud-builders/docker'
id: Docker network ls
args: ["network", "ls"]
- name: 'gcr.io/cloud-builders/docker'
id: Docker network inspect cloudbuild
args: ["network", "inspect", "cloudbuild"]
- name: 'gcr.io/cloud-builders/docker'
id: Docker ps before
args: ["container", "ls", "--no-trunc"]
- name: 'gcr.io/cloud-builders/docker'
id: Web server
args: ["run", "-d", "--name", "mani", "manikantanr/hostname_ip"]
# waitFor: ['-']
- name: 'gcr.io/cloud-builders/wget'
id: wget ipinfo
args: ["-qO-", "https://ipinfo.io"]
- name: 'gcr.io/cloud-builders/docker'
id: Docker ps after
args: ["container", "ls", "--no-trunc"]
- name: 'gcr.io/cloud-builders/docker'
id: Docker inspect mani host network
args: ["inspect", "mani"]
- name: 'gcr.io/cloud-builders/docker'
id: Docker alpine ifconfig inside container
args: ["run", "alpine", "ifconfig"]
- name: 'gcr.io/cloud-builders/wget'
id: wget mani:8000
args: ["-qO-", "http://mani:8000"]
【问题讨论】:
我认为 Cloud Builder 运行器是非常基础的,它们不打算在内部运行 Web 服务器。你为什么要这样做?需要外部服务的单元测试? 通常我对外部服务使用带有模拟的单元测试。但是这次我有一个用例,我必须使用真正的数据库容器进行测试。所以我在分离模式下的新 docker 网络中创建了Postgres
和Oracle Db
s。然后在同一网络中启动web
容器与它们通信。
我正在寻找一种干净的方法来做到这一点,而无需单独的 docker 网络。我尝试使用cloudbuild
和host
网络启动容器。
云构建正在启动名称为 steps-x
的容器,但其他步骤无法访问这些容器。
@OlaVikholt 我使用了 docker-compose。使用-d
启动了一项服务并在另一项服务中执行我的测试。
【参考方案1】:
我在云构建上设置集成测试时遇到了类似的问题。我试图从另一个构建器(go-builder)针对我的其他容器(通过 docker-compose 社区构建的容器开始)运行集成测试。
在 docker-compose.yaml 上不指定任何网络,所有容器都在默认网络 (https://docs.docker.com/compose/networking/) 上启动。在云构建时,它会创建一个名为 cloudbuild_default 的新网络,并将我的所有容器都放在那里。通过我的 docker-compose.yaml 文件强制所有容器加入 cloudbuild 网络,我能够建立通信并针对它们运行测试。
#docker-compose.yaml
networks:
default:
external:
name: cloudbuild
这可能是您的备用配置。希望对你有帮助
【讨论】:
当 OP 使用容器名称显示时,您是否仍然能够访问您的服务?例如。就在http://<container-name>:<port>
?【参考方案2】:
我做了一个实验,看起来(无需进行任何特殊设置)您可以使用名称 step_x(基于 0 的编号)在构建步骤容器之间进行通信。
例如,如果您有一个 Web 服务器在容器中的端点 /hello(端口 8081)上侦听第一个构建步骤(step_0)。您可以通过向http://step_0:8081/hello 发出请求,从另一个构建步骤容器向该端点发出请求。
【讨论】:
我在 3 个月前尝试过同样的事情。我也尝试使用容器主机名step_x
将一个容器与另一个容器连接起来。但它没有像你说的那样工作。我不确定我当时做的一切。但是我通过创建另一个网络进行了同样的测试,并在该网络中开始了我的步骤,然后他们就能够进行通信了。默认情况下,步骤在名为 cloudbuild
的网络中启动,我尝试在同一网络中启动容器,即使这没有帮助。
我刚刚做了一个测试,我首先运行了这一步:- name: gcr.io/cloud-builders/docker
args: ['network', 'create', 'cloudbuild-net']
然后如果我通过选项在该网络中运行其他步骤容器:--network cloudbuild-net
我能够得到所有步骤容器根据他们的名字互相交谈
你能举个例子吗?我现在正在为此苦苦挣扎。
是的,这是一个由做类似事情的人设置的仓库:github.com/Philmod/gcb-docker-compose【参考方案3】:
来自the docs:
每个构建步骤都使用附加到名为 cloudbuild 的本地 Docker 网络的容器运行。这允许构建步骤相互通信并共享数据。
您可以使用 docker compose 并使用cloudbuild
网络,例如:
#docker-compose.yml
app-workspace:
...
network_mode: cloudbuild
db-mysql:
...
network_mode: cloudbuild
...
networks:
default:
external:
name: cloudbuild
或者如果您使用的是docker run
,请添加选项--network cloudbuild
。
之后,您可以按预期与您在上一步中定义的其他服务进行通信。例如:
#steps
- id: 'Ping to other container'
name: gcr.io/cloud-builders/curl
args: ["app-workspace:your-service-port"]
希望这会有所帮助。
【讨论】:
我喜欢这个答案,但不幸的是无法让它发挥作用。创建了一个最小的复制仓库:github.com/akauppi/cloudbuild-network-experiment以上是关于在 Google Cloud 构建中的两个容器之间进行通信的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 googleapis Artifacts API 以编程方式查找和删除通过 Google Cloud Build 构建的容器映像?
从 Google Cloud Run 服务中的 docker 容器到 Google Cloud SQL 的请求最多需要 2 分钟
将文件从 Docker 容器上传到 Google Cloud Storage
google cloud pub sub中两个主题之间的消息传输