Docker 在Google cloud build中的两个容器之间通信
我正在Google cloud build中运行我的CI/CD管道。我的应用程序有Docker 在Google cloud build中的两个容器之间通信,docker,google-cloud-platform,google-cloud-build,Docker,Google Cloud Platform,Google Cloud Build,我正在Google cloud build中运行我的CI/CD管道。我的应用程序有web和wget容器。我正试图从wget Cloud build在内部使用cloudbuild桥接网络,同时作为步骤启动容器。因此,我希望这些步骤能够使用名称进行通信。但它失败了 如果我创建了自己的docker桥网络,那么它们将进行通信 我想知道为什么cloudbuild网络没有按预期工作 如果您知道在step容器之间建立通信的任何其他方法,请告诉我 cloudbuild.yaml steps: - name:
web
和wget
容器。我正试图从wget
Cloud build在内部使用cloudbuild
桥接网络,同时作为步骤启动容器。因此,我希望这些步骤能够使用名称进行通信。但它失败了
如果我创建了自己的docker桥网络,那么它们将进行通信
我想知道为什么cloudbuild网络没有按预期工作
如果您知道在step容器之间建立通信的任何其他方法,请告诉我
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"]
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"]
为了理解cloudbuild内部,我使用了一些docker命令
debug-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"]
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"]
我在云构建上设置集成测试时遇到了类似的问题。我试图从另一个构建器(go构建器)对我的其他容器(通过docker compose社区构建的容器启动)运行集成测试 没有在docker-compose.yaml上指定任何网络,所有容器都在默认网络()上启动。在cloud build上,它创建了一个名为cloudbuild\u default的新网络,并将我的所有容器放在那里。通过我的docker-compose.yaml文件强制所有容器加入cloudbuild网络,我能够建立通信并对它们运行测试
#docker-compose.yaml
networks:
default:
external:
name: cloudbuild
这可能是您的另一种配置。希望它有帮助我做了一个实验,看起来(不做任何特殊设置)您可以使用名称step_x(基于0的编号)在构建步骤容器之间进行通信 例如,如果您有一个web服务器在第一个构建步骤(步骤0)的容器中侦听端点/hello(在端口8081上)。您可以通过向以下地址发出请求,从另一个生成步骤容器向该端点发出请求。 运行每个构建步骤时,其容器都连接到名为cloudbuild的本地Docker网络。这允许构建步骤相互通信并共享数据 您可以使用docker compose和使用
cloudbuild
network,例如:
#docker-compose.yml
app-workspace:
...
network_mode: cloudbuild
db-mysql:
...
network_mode: cloudbuild
...
networks:
default:
external:
name: cloudbuild
#steps
- id: 'Ping to other container'
name: gcr.io/cloud-builders/curl
args: ["app-workspace:your-service-port"]
或者,如果您使用的是docker run
,请添加选项--网络云构建
之后,您可以按照预期与上一步中定义的其他服务通信。例如:
#docker-compose.yml
app-workspace:
...
network_mode: cloudbuild
db-mysql:
...
network_mode: cloudbuild
...
networks:
default:
external:
name: cloudbuild
#steps
- id: 'Ping to other container'
name: gcr.io/cloud-builders/curl
args: ["app-workspace:your-service-port"]
希望这能有所帮助。我认为Cloud Builder的运行人员非常基础,他们不打算在内部运行web服务器。你为什么要这么做?需要外部服务的单元测试?通常我使用带有外部服务模拟的单元测试。但是这次我有一个用例,我必须用真实的db容器进行测试。所以我在新的docker网络中以分离模式创建了一个
Postgres
和OracleDB
s。然后在同一个网络中启动web
容器与他们进行通信。我正在寻找一种干净的方法来实现这一点,而无需单独的docker网络。我尝试使用cloudbuild
和host
网络启动容器。Cloud build正在启动名为steps-x
的容器,但无法从其他步骤访问这些容器。您最终做了什么?我也遇到了同样的问题,只是当我自己定义网络时,它甚至不起作用,这是非常令人沮丧的!在OP显示时,您是否仍然能够使用容器名称访问您的服务?例如,就在http://:?我三个月前也试过同样的方法。我也尝试使用容器主机名步骤x
将一个容器与另一个容器连接起来。但它没有像你说的那样起作用。我不确定我当时做的每件事都是对的。但我通过创建另一个网络进行了同样的测试,并在该网络中开始了我的步骤,然后他们能够进行通信。默认情况下,步骤在名为cloudbuild
的网络中启动。我尝试在同一网络中启动容器,即使这样也无济于事。我只是做了一个测试,首先运行此步骤:-name:gcr.io/cloud builders/docker
args:['network','create','cloudbuild net']
然后,如果我通过选项运行该网络中的其他步骤容器:--network cloudbuild net
我可以让所有步骤容器根据名称彼此对话,您会举个例子吗?我现在正在努力解决这个问题。是的,这是一个回购协议,是由做类似事情的人建立的: